【问题标题】:How can I add a flag at the end of the linking command line using CMake?如何使用 CMake 在链接命令行的末尾添加标志?
【发布时间】:2014-09-08 23:36:08
【问题描述】:

我遇到了 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,或者甚至以某种骇人听闻的方式修改生成的 Makefile 以使其正常工作?

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

【问题讨论】:

  • 在您的set() 之后是否还有其他includesset(CMAKE_EXE_LINKER_FLAGS ...) 或包引用?另请注意:对于当前标准,您应该只指定全局 -pthread 选项。
  • @πάνταῥεῖ:有,我把这个放在最上面。有趣的是,使用-pthread 让它工作了!
  • 编译和链接阶段都需要此选项 (-pthread)。很高兴它似乎解决了您的问题(恕我直言链接器自动化)。 CMake 有时有点笨拙,无法按正确的顺序处理:P。我最近一直在使用 make 和 mighty mighty make template evaluation functions 来管理我的构建系统。 CMake 或多或少提供了相同的功能,但我一直遇到无法解决的情况(例如将 CMake 生成的库列表嵌入到适当的 --start-group/--end-group 对中)

标签: c++ compilation linker makefile cmake


【解决方案1】:

“我怎样才能让 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 库,链接出现在链接器对象链的末尾。

【讨论】:

  • -lpthread 选项在带有 gcc 5.4 的 Linux x64 中的 cmake 3.11.0 中没有帮助。您必须使用 -pthread 而不是编译器和链接器来为 cmake 解析它。
  • 请注意,在 cmake 中添加-pthread 的正确方法是使用set(THREADS_PREFER_PTHREAD_FLAG true)find_package(Threads REQUIRED)target_link_libraries(myprogram Threads::Threads)
  • @Andry IIRC,-pthread-lpthread 在 Linux 上是个问题,即使您手动调用编译器。
猜你喜欢
  • 2021-04-10
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
相关资源
最近更新 更多