4

foo.aの関数を利用する静的ライブラリに取り組んでいるとしましょうbar.so

foo.aプロジェクトで使用する人が明示的にリンクする必要がないように、このライブラリを構築するにはどうすればよいbar.soですか?

4

2 に答える 2

4

でできることは、動的リンクをlibfoo.a呼び出すことです。次に、 を使用して、使用する機能を探します。dlopenlibbar.sodlsym

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.soextern "C"関数名を正しく見つけるには、C ライブラリである必要があります。C++ ライブラリの場合は関数である必要があります。それ以外の場合は、関数を見つけるために名前をマングルする必要がありますdlsym。ライブラリで使用objdump -Tして、ライブラリ内の名前がマングルされているかどうかを確認できます。

への依存関係がまだあるlibbar.soことを認識してください。ただし、それは静的ライブラリに組み込まれています。したがって、 のユーザーは、 にリンクするときにリンク行にlibfoo.a追加する必要はありません。-lbar-lfoo

于 2012-07-06T21:43:18.463 に答える
0

拡張機能から判断すると、あなたは Unix の方法を探しています。私の知る限り、g++ と clang++ の両方でこれを行うことはできません。

Visual C++ はおそらくそれを行うことができます -- 私はそれを DLL ではなくスタティック ライブラリにのみ使用しましたが、...

于 2012-07-06T21:47:49.867 に答える