0

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」

ただし、これらが違いを生むかどうかはわかりません。これらの結果はキャッシュされていると思います。

4

1 に答える 1

0

Web 検索がうまくいかなかったので、ついにあきらめて、手動でスレッドを CMake の要件に追加しました。これはうまく機能し、CMakeLists.txt を変更するたびにライブラリを再構築する必要がなくなりました。

find_package(Threads REQUIRED)
if (Threads_FOUND)
target_link_libraries (libapollo ${CMAKE_THREAD_LIBS_INIT})
endif (Threads_FOUND)
于 2012-07-17T15:07:14.030 に答える