2

私は自分の問題の解決策を探して、いくつかの手がかりを得ましたが、一貫した解決策を見つけることができませんでした:3つの静的ライブラリ(libone)の機能を使用するダイナミックライブラリ(libdyna.so)のコードがあります。 a、libtwo.a、libthree.a)およびlog4cppライブラリ。そして、最初にすべてが正常に見えたときにビルドしたとき、「libdyna.so」を作成できましたが、ラッパー(jniラッパーは正常に動作します)を介してJavaテストプログラムでテストすると、未定義の参照がたくさんありました。

次に、makeファイルに「-zdefs」フラグを設定すると、未定義の参照が多数表示され、ダイナミックライブラリを再度コンパイルできませんでした。

3つの静的ライブラリを使用して「nm」コマンドを作成しました。これにより、dynalibで使用するすべての関数が正しくエクスポートされます。しかし、3つの静的ライブラリを含む「libdyna.so」上でnmを作成すると、未定義のシンボル(関数)が見つかりました。

動的なものを作りたいときに、リンカーにフラグを追加するようなものでなければならないと思いますが、本当にわかりません。誰かが私を助けてくれますか、または私にいくつかのアイデアを教えてもらえますか?コードが必要な場合はお知らせください。ここに貼り付けます。どうもありがとう。

P / D:英語が下手でごめんなさい。

4

1 に答える 1

3

linker option を使用できます--whole-archive。これには静的ライブラリ全体が含まれ、おそらく問題を解決できますが、ライブラリはかなり大きくなる可能性があります。

g++ -shared -o libdyna.so dyna.o -Wl,-whole-archive -la -lb -lc -Wl,-no-whole-archive

man ld:

--whole-archive オプションの後にコマンドラインで指定された各アーカイブについて、必要なオブジェクト ファイルのアーカイブを検索するのではなく、アーカイブ内のすべてのオブジェクト ファイルをリンクに含めます。これは通常、アーカイブ ファイルを共有ライブラリに変換するために使用され、結果の共有ライブラリにすべてのオブジェクトが含まれるように強制します。

閉じることを忘れないでください-Wl,-no-whole-archive

gcc コマンド ラインでライブラリが表示される順序も確認し、動的ライブラリのオブジェクト ファイルの後にあることを確認してください。そうしないと、リンカはそれらをロードしません。たとえば、libone が libtwo を使用する場合、libone が libtwo の前に表示されることも重要です。これは、問題の代替ソリューションになる可能性があります。

于 2011-05-02T18:45:01.300 に答える