在CMakeLists.txt发生更改后,CMake会忘记pthread

时间:2012-07-16 17:03:21

标签: c++ boost pthreads cmake

我对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构建目录运行了一个diff并且失败了cmake构建目录。可执行构建目录的link.txt存在差异(如上所述)。主Makefile.cmake文件也有区别。工作构建目录包含以下行:

  • “的/ usr /共享/ cmake的-2.8 /模块/ CMakeCCompiler.cmake.in”
  • “/ usr / share / cmake-2.8 / Modules / CMakeCCompilerABI-
  • “的/ usr /共享/ cmake的-2.8 /模块/ CMakeCCompiler.cmake.in”
  • “的/ usr /共享/ cmake的-2.8 /模块/ CMakeCCompilerABI.c” .c“的
  • “的/ usr /共享/ cmake的-2.8 /模块/ CMakeCXXCompiler.cmake.in”
  • “的/ usr /共享/ cmake的-2.8 /模块/ CMakeCXXCompilerABI.cpp”
  • “的/ usr /共享/ cmake的-2.8 /模块/ CMakeDetermineCCompiler.cmake”
  • “的/ usr /共享/ cmake的-2.8 /模块/ CMakeDetermineCXXCompiler.cmake”
  • “的/ usr /共享/ cmake的-2.8 /模块/ CMakeDetermineCompilerABI.cmake”
  • “的/ usr /共享/ cmake的-2.8 /模块/ CMakeDetermineCompilerId.cmake”
  • “的/ usr /共享/ cmake的-2.8 /模块/ CMakeDetermineSystem.cmake”
  • “的/ usr /共享/ cmake的-2.8 /模块/ CMakeFindBinUtils.cmake”
  • “的/ usr /共享/ cmake的-2.8 /模块/ CMakeParseImplicitLinkInfo.cmake”
  • “的/ usr /共享/ cmake的-2.8 /模块/ CMakeSystem.cmake.in”
  • “的/ usr /共享/ cmake的-2.8 /模块/ CMakeTestCCompiler.cmake”
  • “的/ usr /共享/ cmake的-2.8 /模块/ CMakeTestCXXCompiler.cmake”
  • “的/ usr /共享/ cmake的-2.8 /模块/ CMakeTestCompilerCommon.cmake”
  • “的/ usr /共享/ cmake的-2.8 /模块/ CMakeUnixFindMake.cmake”

但是,我不确定这些是否会有所作为。我想这些结果都是缓存的。

1 个答案:

答案 0 :(得分:0)

在网络搜索没有运气之后,我终于放弃了,只是手动添加线程到CMake要求。这很好用,现在每次修改CMakeLists.txt时都不需要重建库

find_package(Threads REQUIRED)
if (Threads_FOUND)
target_link_libraries (libapollo ${CMAKE_THREAD_LIBS_INIT})
endif (Threads_FOUND)