Note

技術メモとか日記

C++でundefined reference

状況

C++でPyTorchとPocoを使用したプログラムをコンパイル(cmake)したら「undefined reference to Poco::....」

原因

使用した2つのライブラリ(PyTorch,Poco)のバイナリフォーマットが異なっていた. そして,これを考慮した適切なオプションがコンパイル時に指定できていなかった.

バイナリフォーマットが異なるのは,ライブラリをコンパイルしたgccのバージョンによるもの (gcc5以上が新しいフォーマット,gcc4以下が古いフォーマット.今回,PyTorchは古いフォーマット,Pocoは新しいフォーマット). 古いバージョンでコンパイルしたライブラリを使用する場合,「-D_GLIBCXX_USE_CXX11_ABI=0」を付けてコンパイルする必要がある. PyTorchのcmakeファイルでは,全ファイルに対してこのオプションを付けているため,Pocoも古いフォーマットとして認識されてしまい,参照エラーが出ていた.

解決策

  1. ライブラリを作成する際のコンパイラのバージョンを統一する.( PyTorchはバイナリが配布されておりコンパイル方法がよく分からないため古いコンパイラでPocoを作り直すとうまくいった.)
  2. PyTorchとPocoを同時に使用するファイルが存在しない場合は,Pocoを使用するファイルで以下を記述する.
#undef _GLIBCXX_USE_CXX11_ABI