如何使用CMake在链接命令行结束时添加标志?



我有一个问题,CMake不能检测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在这一行的末尾,或者甚至修改生成的Makefiles以某种黑客的方式让这个工作?

(如果答案涉及到正确地检测pthread,那么回答链接的问题)

"我怎样才能让CMake在这行末尾添加-lpthread,或者甚至修改生成的Makefiles以某种黑客的方式使其工作?"

首先要确保你的

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库,链接出现在链接器对象链的末尾。

最新更新