如何使用CMake在链接命令行的末尾添加标志?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用CMake在链接命令行的末尾添加标志?相关的知识,希望对你有一定的参考价值。

我有一个问题,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应该在第3行的末尾,而不是第1行的结尾。

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

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

答案

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

首先要确保你的

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库。

以上是关于如何使用CMake在链接命令行的末尾添加标志?的主要内容,如果未能解决你的问题,请参考以下文章

在 Xcode 中添加链接器标志

使用 cmake 从命令行使用 /MT 标志编译

cmake - 全局链接器标志设置(适用于目录中的所有目标)

运行Chrome浏览器如何添加Options

如何在 CMake 中为外部 INTERFACE_SOURCES 设置编译标志?

如何在 CMake 的 try_compile 函数中为 OpenMP 设置链接器标志