我有一个问题CMake can't detect pthread。作为一种解决方法,我尝试过:

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lpthread")

但是,这会将-lpthread插入错误的位置:
/usr/bin/c++    -std=c++11 -D_GNU_SOURCE  -Wall [manyflags ...]    -lpthread \
    CMakeFiles/connectivity_tool.dir/connectivity_tool/conn_tool.cpp.o       \
    -o connectivity_tool -rdynamic -lboost_system [many libraries...]

结果是:
/usr/bin/ld: /tmp/ccNvRifh.ltrans3.ltrans.o: undefined reference to symbol 'pthread_mutexattr_settype@@GLIBC_2.2.5'
/lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line

当然,-lpthread应该在第三行的末尾,而不是第一行的末尾。

我该如何使CMake在此行的末尾添加-lpthread,或者甚至以某种不可靠的方式以某种方式修改生成的Makefile来使其正常工作?

(如果答案涉及实际检测pthread,请回答链接的问题。)

最佳答案



1确保您的

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lpthread")

是CMake在行中看到的最后一个。
任何其他库/模块引用(例如 FIND_BOOST )都可能弄乱您要直接提供的标志的顺序。

我会用
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")


set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pthread")

我认为使用此选项,链接器会自动检测相应的pthread库,该库出现在链接器对象链的末尾。

07-24 13:57