我有一个问题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
应该在第三行的末尾,而不是第一行的末尾。我该如何使CMake在此行的末尾添加
-lpthread
,或者甚至以某种不可靠的方式以某种方式修改生成的Makefile来使其正常工作?(如果答案涉及实际检测pthread,请回答链接的问题。)
最佳答案
1确保您的
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
库,该库出现在链接器对象链的末尾。