5

GCC 4.5.2Boost 1.46.1(でコンパイル) を使用して共有ライブラリを構築して--build-type=completeいます。これは、リンケージ部分を実行する Makefile からのコマンドです。

$(CXX) -static -lboost_filesystem -fpic -shared $^ -o $@

すべてが正常にコンパイルされますが、アプリケーションによってロードされると次のエラーが発生します。

plugins/crashdetect.so: undefined symbol: _ZN5boost11filesystem34path21wchar_t_codecvt_facetEv

ldd出力:

linux-gate.so.1 =>  (0x002f8000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0x00bf5000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0x0032d000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00506000)
/lib/ld-linux.so.2 (0x006f6000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0x00110000)

これは、Boostを静的にリンクしたことを意味すると思います。

これはnm crashdetect.so -u | grep boost言うことです:

 U _ZN5boost11filesystem34path21wchar_t_codecvt_facetEv
 U _ZN5boost11filesystem36detail13dir_itr_closeERPvS3_
 U _ZN5boost11filesystem36detail28directory_iterator_constructERNS0_18directory_iteratorERKNS0_4pathEPNS_6system10error_codeE
 U _ZN5boost11filesystem36detail28directory_iterator_incrementERNS0_18directory_iteratorEPNS_6system10error_codeE
 U _ZN5boost11filesystem36detail6statusERKNS0_4pathEPNS_6system10error_codeE
 U _ZN5boost6system15system_categoryEv
 U _ZN5boost6system16generic_categoryEv
 U _ZNK5boost11filesystem315directory_entry12m_get_statusEPNS_6system10error_codeE

したがって、そのシンボルはこのリストの最初にあるので、おそらくそれについて特別なことは何もないと思います.

何か不足していますか?

編集: これは不可能ですか、それとも何ですか?

4

1 に答える 1

3

私は信じている:

  1. -static と -shared の使用は正しい方法ではありません。リンクを制御する唯一の多かれ少なかれ信頼できる方法は次のとおりです。

    -Wl,-Bstatic -lboost_filesystem -Wl,-Bshared

    コマンドラインの最後に。

  2. boost_system へのリンクに失敗しました。

  3. 実際にboost_filesystemの静的バージョンにリンクしているように見えるため、失敗が発生します。ただし、オブジェクト ファイルの前にコマンド ラインで指定されているため、実際にはそこからシンボルが取り出されず、boost.filesystem 関数へのすべての参照は未定義のままです。はい、リンカは最初の未定義シンボルに文句を言います。

于 2011-06-22T18:53:30.937 に答える