cmake和libpthread

dim*_*mba 161 pthreads cmake

我正在跑步RHEL 5.1和使用gcc.

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

Man*_*uel 189

以下应该是clean(using find_package)和work(调用find模块FindThreads):

cmake_minimum_required (VERSION 2.6) 
find_package (Threads)
add_executable (myapp main.cpp ...)
target_link_libraries (myapp ${CMAKE_THREAD_LIBS_INIT})
Run Code Online (Sandbox Code Playgroud)

  • 在仅CXX项目中使用时,这不起作用.有谁知道一个很好的解决方法? (2认同)
  • @Simon 有点晚了,但请看这个:http://stackoverflow.com/questions/15193785/how-to-get-cmake-to-recognize-pthread-on-ubuntu (2认同)

the*_*use 171

@Manuel是那里的一部分.您也可以添加编译器选项,如下所示:

如果你有CMake 3.1.0+,这变得更容易:

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(my_app Threads::Threads)
Run Code Online (Sandbox Code Playgroud)

如果您使用的是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()
Run Code Online (Sandbox Code Playgroud)

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

如果你想使用CMake 3.1+的前两种方法之一,你也需要set(THREADS_PREFER_PTHREAD_FLAG ON)它.

  • 如果不设置 THREADS_PREFER_PTHREAD_FLAG 标志,而只是查找并链接,会发生什么情况? (2认同)

Nad*_*LEM 17

这是正确的anwser:

ADD_EXECUTABLE(your_executable ${source_files})

TARGET_LINK_LIBRARIES( your_executable
pthread
)
Run Code Online (Sandbox Code Playgroud)

相当于

-lpthread
Run Code Online (Sandbox Code Playgroud)

  • 一旦你从linux改为freebsd或windows,这个解决方案就会出现问题. (17认同)
  • 不起作用,"target_link_libraries(your_executable pthread)"是应该如何编写的. (3认同)
  • 无论如何,这不是正确的答案.即使你不喜欢thehouse的答案,并且考虑到这是在2009年写的,它完全是非跨平台的.使用thehouse的答案 - 如果你不喜欢它,那就选择`target_link_libraries(目标"$ <$ <CXX_COMPILER_ID:GNU>: - pthread> $ <$ <CXX_COMPILER_ID:Clang>: - pthreads>")`至少是基于目标的,并且在Windows和其他平台上不会失败. (3认同)
  • SET(CMAKE_CXX_FLAGS_DEBUG"... -lpthread")SET(CMAKE_CXX_FLAGS_RELEASE"... -lpthread") (2认同)

小智 7

target_compile_options上面的解决方案是错误的,它不会链接库。

使用:

SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -pthread")

或者

target_link_libraries(XXX PUBLIC pthread)

或者

set_target_properties(XXX PROPERTIES LINK_LIBRARIES -pthread)