【问题标题】:CMake forgets about pthreads after changes in CMakeLists.txtCMakeLists.txt 更改后,CMake 忘记了 pthreads
【发布时间】:2012-07-15 13:57:45
【问题描述】:

我在使用 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"

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

【问题讨论】:

  • 如果你 grep 整个项目,哪个 makefile 提到了-lpthread,在哪个上下文中?我的猜测是,当您的可执行文件由于其依赖项更改而被重建时,它会将-lpthread 添加到链接库中,但是当它因为 CMakefile 更改而被重建时,该标志不会被添加到链接库中
  • 嘿乔恩,我的代码都没有特别需要 pthreads,但我通过 boost 线程间接地做到了。我刚刚在两个 make 目录上运行了 'grep -e "pthread" -R release/',两个 grep 之间的唯一区别是 link.txt 中没有 -lpthread

标签: c++ boost pthreads cmake


【解决方案1】:

在网络搜索失败后,我终于放弃了,只是手动将线程添加到 CMake 要求中。这很好用,现在我不必每次修改 CMakeLists.txt 时都重新构建库

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

【讨论】:

    猜你喜欢
    • 2018-05-09
    • 2012-06-01
    • 2013-12-23
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    相关资源
    最近更新 更多