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 文件之一(例如添加新的 .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

在网络搜索失败后,我终于放弃了,只是手动将线程添加到 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 回答