我对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文件也有区别。工作构建目录包含以下行:
但是,我不确定这些是否会有所作为。我想这些结果都是缓存的。
答案 0 :(得分:0)
在网络搜索没有运气之后,我终于放弃了,只是手动添加线程到CMake要求。这很好用,现在每次修改CMakeLists.txt时都不需要重建库
find_package(Threads REQUIRED)
if (Threads_FOUND)
target_link_libraries (libapollo ${CMAKE_THREAD_LIBS_INIT})
endif (Threads_FOUND)