我遇到了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,则回答链接的问题。)
答案 0 :(得分:2)
"我怎样才能让CMake在这一行的末尾添加
-lpthread
,或者甚至以某种黑客的方式修改生成的Makefile以使其工作?&#34 ;
首先确保你的
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
库。