1

log4cxx ロギング ライブラリを使用します。追加のバイナリ依存関係を避けるために、静的バージョンとリンクする必要があります。動的ライブラリで使用しています。log4cxx のデフォルト ビルドは静的ライブラリを生成しますが、-fPIC フラグなしでコンパイルされたため、リンクできません。そこで、log4cxx bulding を次のように変更しました。

CPPFLAGS="-fPIC -static" ./configure
make

その結果liblog4cxx.a、.so ライブラリとリンクできる を受け取りました。リンクは、次のような Cmake によって行われました。

target_link_libraries(my_dynamic_lib log4cxx)
link_directories(relative_path_to_dir_where_liblog4cxx.a_lives)

実行時まではすべて問題ないように見えました。my_dynamic_lib.so を読み込めません。undefined symbol "logger"

何が問題なのか、この問題を解決する方法を教えてください。

ありがとう

4

2 に答える 2

2

を使用して、共有ライブラリにシンボルが含まれているかどうかを確認できます。

nm -g my_dynamic_lib.so | grep logger

シンボル タイプUで表示されている場合は、未定義であることを意味します。

通常、共有ライブラリは実行時まで必要なすべてのシンボルを解決しないため、不足しているシンボルを共有ライブラリにリンクすることは可能です (完全に正常です)。

-llog4cxxリンカーコマンドラインの先頭に置くとmy_dynamic_lib.so、そこにあるコードにはリンクされず、logger実行時までシンボルが未解決のままになります。静的ライブラリのシンボルを強制的に使用するには、必要なオブジェクトのに静的ライブラリをリストしてください。

g++ -fPIC -shared -o my_dynamic_lib.so obj1.o obj2.o -llog4cxx ...

cmakeでそれを行う方法はわかりませんがlog4cxx、動的ライブラリではなく、メインの実行可能ファイルをリンクするときにのみCMakefileがリンクしているように見えます。

于 2012-06-27T14:57:37.537 に答える
1

通常、liblog4cxx.aは、my_dynamic_lib.soではなく、実行可能ファイルにリンクします。別の言い方をするドキュメントを提供できない限り、例のようにリンクすることはできないと思います。

于 2012-06-27T14:37:51.287 に答える