2

他のいくつかのライブラリに基づいた C++ 共有ライブラリを作成しました。ライブラリを使用すると、「外部」ライブラリの機能に関する未定義の参照が多数取得されます。「外部」ライブラリを g++ コマンドに明示的に追加すると、コンパイルとリンクは正常に機能します。ライブラリのユーザーが手動で「外部」ライブラリにリンクする必要がないように、それに対処する方法はありますか?

ご協力いただきありがとうございます。

4

2 に答える 2

1

共有ライブラリのユーザーがライブラリのすべてのリンク時の依存関係を宣言する必要がない場合は、共有ライブラリ自体を構築するときに、それらの依存関係をリンカーに通知できます。

Makefile では、これは次のようになります。

mylib.so:
    g++ -o mylib.so $OBJS -llib1 -llib2 -llib3

その場合、 のユーザーは、またはmylib.soを指定する必要はありませんが、プログラムを実行できるようにするために (適切なバージョンで) 利用可能である必要があります。lib1lib2lib3

于 2012-11-07T14:14:36.287 に答える
0

パブリッシュされた (エクスポートされた) インターフェイスから、すべての外部データ型と関数を除外する必要があります。つまり、GCC の場合、-fvisibility=hiddenすべての実装の詳細を非表示にするために使用できるため、属性((dllexport)を持つ部分のみをエクスポートします。Pimpl イディオム (別名Opaque pointer ) は、公開されたヘッダーから依存関係を削除するのに役立ちます。以下の簡単な例:

#include<memory>    

#if EXPORT_DLL
   #define DLL_PREFIX __attribute__ ((dllexport))
#else
   #define DLL_PREFIX __attribute__ ((dllimport))
#endif 

class XImpl;

class DLL_PREFIX X {
//...
private:
   std::unique_ptr<XImpl> impl_;
}

XImpl別のヘッダー/ソースであなたを定義して実装するだけです。他のライブラリからのリンクの依存関係はありません。あなたのライブラリからのみです。しかし、ランタイムの依存関係はまだ存在します!

于 2012-11-07T10:13:53.163 に答える