cmake和libpthread


188

我正在跑步RHEL 5.1并使用gcc

我如何告诉cmake要添加-pthread到编译和链接?


1
您可以为此选择答案吗?
Jared Burrows

1
杜德,您必须选择@ Manuel's作为答案。

@Ehsan thehouse的答案更好!:-)
Ela782

Answers:


206

@Manuel在那儿。您也可以添加编译器选项,如下所示:

如果您拥有CMake 3.1.0+,这将变得更加容易

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(my_app PRIVATE Threads::Threads)

如果您使用的是CMake 2.8.12+,则可以简化为:

find_package(Threads REQUIRED)
if(THREADS_HAVE_PTHREAD_ARG)
  target_compile_options(my_app PUBLIC "-pthread")
endif()
if(CMAKE_THREAD_LIBS_INIT)
  target_link_libraries(my_app "${CMAKE_THREAD_LIBS_INIT}")
endif()

较旧的CMake版本可能需要:

find_package(Threads REQUIRED)
if(THREADS_HAVE_PTHREAD_ARG)
  set_property(TARGET my_app PROPERTY COMPILE_OPTIONS "-pthread")
  set_property(TARGET my_app PROPERTY INTERFACE_COMPILE_OPTIONS "-pthread")
endif()
if(CMAKE_THREAD_LIBS_INIT)
  target_link_libraries(my_app "${CMAKE_THREAD_LIBS_INIT}")
endif()

如果要在CMake 3.1+中使用前两种方法之一,则也需要使用set(THREADS_PREFER_PTHREAD_FLAG ON)


如果发现pthread库(NOT CMAKE_HAVE_THREADS_LIBRARY),例如在Ubuntu 15.04上,例如CMake 3.0.2似乎不会设置THREADS_HAVE_PTHREAD_ARG
::

1
由于代码的工作方式,为CMake 2.8.12+给出的版本无法按预期工作/usr/share/cmake-2.8/Modules/FindThreads.cmake(例如,请参见apt-browse.org/browse/ubuntu/trusty/main/all/cmake-data/…)基本上,THREADS_HAVE_PTHREAD_ARG(即,如果标志的其它变型均未发现仅设置-lpthread-lpthread-lthread
j1elo

这将产生错误“无法为目标“ my_app”指定链接库,该项目不是由该项目构建的。” -如何在不针对每个目标单独进行的情况下普遍启用它?
克里斯·多德

第一种仍然是2020年/ cmake 3.17中最简单的方法吗?
周杰伦

如果您未设置THREADS_PREFER_PTHREAD_FLAG标志,而只是查找并链接,该怎么办?
周杰伦

199

以下内容应该是干净的(使用find_package)并且可以正常工作(将find模块称为FindThreads):

cmake_minimum_required (VERSION 2.6) 
find_package (Threads)
add_executable (myapp main.cpp ...)
target_link_libraries (myapp ${CMAKE_THREAD_LIBS_INIT})

2
在仅限CXX的项目中使用时,这不起作用。有谁知道一个不错的解决方法?
西蒙(Simon)

1
@Simon有点晚了,但请看到这一点:stackoverflow.com/questions/15193785/...
congusbongus

@CongXu谢谢!很高兴知道!
西蒙(Simon)

1
该解决方案的工作accros的Mac OS X,CentOS 6的和Solaris 10
bernardn

1
请注意,这不会设置-pthread编译器标志
mlt 2015年

25

这是正确的答案:

ADD_EXECUTABLE(your_executable ${source_files})

TARGET_LINK_LIBRARIES( your_executable
pthread
)

相当于

-lpthread

这是等效的。“ -pthread”会捐赠更多-在编译时,它是-D_REENTRANT,在链接时是-lpthread。在某些系统上甚至可以超过此范围。
dimba

2
SET(CMAKE_CXX_FLAGS_DEBUG“ ... -lpthread”)SET(CMAKE_CXX_FLAGS_RELEASE“ ... -lpthread”)
Nadir SOUALEM

21
从Linux更改为freebsd或Windows时,此解决方案便会变砖。
亚历克斯

4
无效,应使用“ target_link_libraries(your_executable pthread)”编写。
章概述

6
无论如何,这不是正确的答案。即使您不喜欢房子的答案,并且考虑到它是2009年编写的,它也是完全非跨平台的。使用房屋的答案-如果您不喜欢它,则可以尝试target_link_libraries(target "$<$<CXX_COMPILER_ID:GNU>:-pthread>$<$<CXX_COMPILER_ID:Clang>:-pthreads>")至少基于目标并且在Windows和其他平台上不会失败的东西。
Ela782
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.