【发布时间】: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()之后是否还有其他includes、set(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