我知道有类似find_package(Threads)
之类的内容,但它似乎没有任何区别(至少本身)。现在我正在使用SET(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} "-pthread")
,但它对我来说看起来不是一个正确的解决方案。
答案 0 :(得分:47)
find_package( Threads )
调用CMake模块,首先在文件系统中搜索此平台的相应线程包,然后设置CMAKE_THREAD_LIBS_INIT变量(以及其他一些变量)。它没有告诉CMake将任何可执行文件链接到它找到的任何线程库。你告诉CMake将你的可执行文件与" Threads"带有target_link_libraries()
命令的库。所以,例如,假设您的程序称为测试。要将它与您需要的线程相关联:
find_package( Threads )
add_executable( test test.cpp )
target_link_libraries( test ${CMAKE_THREAD_LIBS_INIT} )
答案 1 :(得分:31)
CMake的最新版本(> = 3.1)中的Threads模块生成 Threads :: Threads导入目标。将目标链接到Threads :: Threads会添加所有必要的编译和链接标志。可以这样做:
set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
set(THREADS_PREFER_PTHREAD_FLAG TRUE)
find_package(Threads REQUIRED)
add_executable(test test.cpp)
target_link_libraries(test Threads::Threads)
,强烈建议在新代码中使用导入的目标
答案 2 :(得分:6)
以下内容如何:
set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
find_package(Threads REQUIRED)
if(CMAKE_USE_PTHREADS_INIT)
set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} "-pthread")
elseif(...)
...
endif()
add_executable( test test.cpp )
target_link_libraries( test ${CMAKE_THREAD_LIBS_INIT} )