如何在编译期间强制cmake包含“-pthread”选项?

时间:2011-03-22 17:23:58

标签: gcc build build-automation cmake

我知道有类似find_package(Threads)之类的内容,但它似乎没有任何区别(至少本身)。现在我正在使用SET(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} "-pthread"),但它对我来说看起来不是一个正确的解决方案。

3 个答案:

答案 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)

根据CMake docs

,强烈建议在新代码中使用导入的目标

答案 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} )