他のいくつかのライブラリに基づいた C++ 共有ライブラリを作成しました。ライブラリを使用すると、「外部」ライブラリの機能に関する未定義の参照が多数取得されます。「外部」ライブラリを g++ コマンドに明示的に追加すると、コンパイルとリンクは正常に機能します。ライブラリのユーザーが手動で「外部」ライブラリにリンクする必要がないように、それに対処する方法はありますか?
ご協力いただきありがとうございます。
他のいくつかのライブラリに基づいた C++ 共有ライブラリを作成しました。ライブラリを使用すると、「外部」ライブラリの機能に関する未定義の参照が多数取得されます。「外部」ライブラリを g++ コマンドに明示的に追加すると、コンパイルとリンクは正常に機能します。ライブラリのユーザーが手動で「外部」ライブラリにリンクする必要がないように、それに対処する方法はありますか?
ご協力いただきありがとうございます。
共有ライブラリのユーザーがライブラリのすべてのリンク時の依存関係を宣言する必要がない場合は、共有ライブラリ自体を構築するときに、それらの依存関係をリンカーに通知できます。
Makefile では、これは次のようになります。
mylib.so:
g++ -o mylib.so $OBJS -llib1 -llib2 -llib3
その場合、 のユーザーは、またはmylib.so
を指定する必要はありませんが、プログラムを実行できるようにするために (適切なバージョンで) 利用可能である必要があります。lib1
lib2
lib3
パブリッシュされた (エクスポートされた) インターフェイスから、すべての外部データ型と関数を除外する必要があります。つまり、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
別のヘッダー/ソースであなたを定義して実装するだけです。他のライブラリからのリンクの依存関係はありません。あなたのライブラリからのみです。しかし、ランタイムの依存関係はまだ存在します!