foo.a
の関数を利用する静的ライブラリに取り組んでいるとしましょうbar.so
。
foo.a
プロジェクトで使用する人が明示的にリンクする必要がないように、このライブラリを構築するにはどうすればよいbar.so
ですか?
foo.a
の関数を利用する静的ライブラリに取り組んでいるとしましょうbar.so
。
foo.a
プロジェクトで使用する人が明示的にリンクする必要がないように、このライブラリを構築するにはどうすればよいbar.so
ですか?
でできることは、動的リンクをlibfoo.a
呼び出すことです。次に、 を使用して、使用する機能を探します。dlopen
libbar.so
dlsym
typedef void (*BarFunctionType) (const char *);
FunctionType barFunction;
void initialize_foo_lib () {
void *h = dlopen("libbar.so", RTLD_LAZY);
BarFunctionType barFunction = (BarFunctionType) dlsym(h, "barFunction");
// Note scary looking cast to get your function pointer.
//... rest of code can call barFunction now
}
libbar.so
extern "C"
関数名を正しく見つけるには、C ライブラリである必要があります。C++ ライブラリの場合は関数である必要があります。それ以外の場合は、関数を見つけるために名前をマングルする必要がありますdlsym
。ライブラリで使用objdump -T
して、ライブラリ内の名前がマングルされているかどうかを確認できます。
への依存関係がまだあるlibbar.so
ことを認識してください。ただし、それは静的ライブラリに組み込まれています。したがって、 のユーザーは、 にリンクするときにリンク行にlibfoo.a
追加する必要はありません。-lbar
-lfoo
拡張機能から判断すると、あなたは Unix の方法を探しています。私の知る限り、g++ と clang++ の両方でこれを行うことはできません。
Visual C++ はおそらくそれを行うことができます -- 私はそれを DLL ではなくスタティック ライブラリにのみ使用しましたが、...