メモの日々


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にある。

やること

  • クリーニング
  • 請書