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

Tom*_*lny 37 build-automation gcc build cmake

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

ltc*_*ltc 51

find_package( Threads )调用CMake模块,首先在文件系统中搜索该平台的相应线程包,然后设置CMAKE_THREAD_LIBS_INIT变量(以及其他一些变量).它没有告诉CMake将任何可执行文件链接到它找到的任何线程库.您告诉CMake使用该target_link_libraries()命令将可执行文件与"Threads"库链接.所以,例如,假设您的程序称为测试.要将它与您需要的线程相关联:

find_package( Threads )
add_executable( test test.cpp )
target_link_libraries( test ${CMAKE_THREAD_LIBS_INIT} )
Run Code Online (Sandbox Code Playgroud)

  • 但重点是在编译期间添加此"-pthread"选项,而不是链接. (3认同)

Ale*_*Che 49

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)
Run Code Online (Sandbox Code Playgroud)

根据CMake文档,强烈建议在新代码中使用导入的目标

  • 从链接的文档页面:“CMAKE_THREAD_PREFER_PTHREAD” - 更喜欢在具有多个可用线程库的系统上使用 pthread 库。`THREADS_PREFER_PTHREAD_FLAG` - 更喜欢 `-pthread` 编译器和链接器标志。省略这两个选项可能会导入另一个线程库或在编译或链接期间跳过“-pthread”标志。 (4认同)

小智 7

以下内容如何:

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} )
Run Code Online (Sandbox Code Playgroud)

  • 除非运行cmake <3.1,否则建议直接链接命名空间的目标(导入目标),而不要直接链接$$ {CMAKE_THREAD_LIBS_INIT}变量(请参见@ alex-che的回答)。 (2认同)