CMake と Boost で奇妙な問題が発生しています。
ライブラリの各部分が個別の静的ライブラリになるように、静的ライブラリプロジェクトを設定しています。それらはインテリジェントな方法で相互に依存し、すべてが最初から完全にコンパイルされ、機能します。
以下は、最終的なリンク コマンドです。
/usr/bin/c++ -O3 -DNDEBUG CMakeFiles/apollo.dir/main.cpp.o -o apollo -rdynamic ../../libapollo/io/libio.a ../../libapollo/theoretical/libtheoretical.a -lboost_system-mt -lboost_filesystem-mt -lboost_thread-mt -lpthread -lz -lboost_filesystem-mt ../../libapollo/core/libcore.a ../../libapollo/src/liblibapollo.a -lboost_system-mt -lboost_thread-mt
ただし、ライブラリ内の CMakeLists.txt ファイルの 1 つを変更すると (新しい .cpp を追加したり、CMakeLists.txt を再保存したりするなど)、make を再度実行すると、ライブラリに依存する最終的な実行可能ファイルが失敗します。最後のリンクで。
以下は、失敗したリンク コマンドです。
/usr/bin/c++ -O3 -DNDEBUG CMakeFiles/apollo.dir/main.cpp.o -o apollo -rdynamic ../../libapollo/io/libio.a ../../libapollo/theoretical/libtheoretical.a -lboost_system-mt -lboost_filesystem-mt -lboost_thread-mt -lz -lboost_filesystem-mt ../../libapollo/core/libcore.a ../../libapollo/src/liblibapollo.a -lboost_system-mt -lboost_thread-mt
私の目には、これらのリンク コマンドは -lpthread を除けばまったく同じに見えます。
毎回 pthread が確実に含まれるようにする方法を知っている人はいますか?
リンクしている cmake ビルド ディレクトリと失敗した cmake ビルド ディレクトリに対して差分を実行しました。実行可能なビルド ディレクトリの link.txt に違いがあります (前述のとおり)。メインの Makefile.cmake ファイルにも違いがあります。作業ビルド ディレクトリには次の行があります。
- 「/usr/share/cmake-2.8/Modules/CMakeCCompiler.cmake.in」
- "/usr/share/cmake-2.8/Modules/CMakeCCompilerABI-
- 「/usr/share/cmake-2.8/Modules/CMakeCCompiler.cmake.in」
- "/usr/share/cmake-2.8/Modules/CMakeCCompilerABI.c".c"
- 「/usr/share/cmake-2.8/Modules/CMakeCXXCompiler.cmake.in」
- 「/usr/share/cmake-2.8/Modules/CMakeCXXCompilerABI.cpp」
- 「/usr/share/cmake-2.8/Modules/CMakeDetermineCCompiler.cmake」
- 「/usr/share/cmake-2.8/Modules/CMakeDetermineCXXCompiler.cmake」
- 「/usr/share/cmake-2.8/Modules/CMakeDetermineCompilerABI.cmake」
- 「/usr/share/cmake-2.8/Modules/CMakeDetermineCompilerId.cmake」
- 「/usr/share/cmake-2.8/Modules/CMakeDetermineSystem.cmake」
- 「/usr/share/cmake-2.8/Modules/CMakeFindBinUtils.cmake」
- 「/usr/share/cmake-2.8/Modules/CMakeParseImplicitLinkInfo.cmake」
- 「/usr/share/cmake-2.8/Modules/CMakeSystem.cmake.in」
- 「/usr/share/cmake-2.8/Modules/CMakeTestCCompiler.cmake」
- 「/usr/share/cmake-2.8/Modules/CMakeTestCXXCompiler.cmake」
- 「/usr/share/cmake-2.8/Modules/CMakeTestCompilerCommon.cmake」
- 「/usr/share/cmake-2.8/Modules/CMakeUnixFindMake.cmake」
ただし、これらが違いを生むかどうかはわかりません。これらの結果はキャッシュされていると思います。