2010年05月21日(金) [長年日記]
■ [c++][unix][howto] 関数が定義されているライブラリを探す
nmコマンドを使ったのでメモ。BINARY HACKSの#12,#14が参考になる。
C++のプログラムをコンパイルして
xxx.cpp:100: undefined reference to `boost::unit_test::ut_detail::auto_test_unit_registrar::auto_test_unit_registrar(boost::unit_test::test_case*, unsigned long)'
のようにundefined referenceだというエラーになったときに、リンクすべきライブラリファイルを調べるには、ライブラリファイル群があるディレクトリにて
% nm --demangle --print-file-name --dynamic *.so | grep \ 'boost::unit_test::ut_detail::auto_test_unit_registrar::auto_test_unit_registrar(boost::unit_test::test_case*, unsigned long)'
を実行すればいい、と思ったら何も出力されなかった。ここは
% nm --demangle --print-file-name --dynamic *.so | grep \ 'boost::unit_test::ut_detail::auto_test_unit_registrar::auto_test_unit_registrar(boost::unit_test::test_case\*, unsigned long)'
としなければならない。最後の方のポインタを表わす*をエスケープしないとマッチする正規表現にならないから。これで
libboost_unit_test_framework-mt.so:0003bc70 T boost::unit_test::ut_detail::auto_test_unit_registrar::auto_test_unit_registrar(boost::unit_test::test_case*, unsigned long) libboost_unit_test_framework-mt.so:0003bcc0 T boost::unit_test::ut_detail::auto_test_unit_registrar::auto_test_unit_registrar(boost::unit_test::test_case*, unsigned long)
のように出力される。関数の定義はlibboost_unit_test_framework-mt.soにある。
■ やること
- クリーニング
- 請書