【发布时间】: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