我对 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”
但是,我不确定这些是否会有所作为。我想这些结果被缓存了。