【问题标题】:cmake and libpthreadcmake 和 libpthread
【发布时间】:2023-03-09 10:39:02
【问题描述】:

我正在运行 RHEL 5.1 并使用 gcc

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

【问题讨论】:

  • 你能选择一个答案吗?
  • 老兄,你必须选择@Manuel's 作为答案。
  • @Ehsan thehouse 的回答要好得多! :-)

标签: pthreads cmake


【解决方案1】:

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

如果你有 CMake 3.1.0+,this becomes even easier:

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),CMake 3.0.2 将不会设置 THREADS_HAVE_PTHREAD_ARG,例如在 Ubuntu 15.04 上:(
  • 为 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),则设置
  • 这给出了错误“无法为不是由该项目构建的目标“my_app”指定链接库。” -- 如何在不为每个目标单独启用的情况下通用地启用它?
  • 2020/cmake 3.17第一个还是最简单的方法吗?
  • 如果不设置 THREADS_PREFER_PTHREAD_FLAG 标志,只查找并链接会怎样?
【解决方案2】:

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

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

【讨论】:

【解决方案3】:

这是正确的答案:

ADD_EXECUTABLE(your_executable ${source_files})

TARGET_LINK_LIBRARIES( your_executable
pthread
)

相当于

-lpthread

【讨论】:

  • 这是等价的。 “-pthread”贡献更多——在编译时它是-D_REENTRANT,在链接时是-lpthread。在某些系统上,甚至可能不止于此。
  • SET(CMAKE_CXX_FLAGS_DEBUG "... -lpthread") SET(CMAKE_CXX_FLAGS_RELEASE "... -lpthread")
  • 当你从 linux 切换到 freebsd 或 windows 时,这个解决方案就会变砖。
  • 不行,"target_link_libraries(your_executable pthread)" 应该这样写。
  • 这无论如何都不是正确的答案。即使您不喜欢 thehouse 的答案,并且考虑到这是在 2009 年编写的,它也完全是非跨平台的。使用 thehouse 的答案 - 如果您不喜欢它,请选择 target_link_libraries(target "$<$<CXX_COMPILER_ID:GNU>:-pthread>$<$<CXX_COMPILER_ID:Clang>:-pthreads>") 之类的东西,它至少是基于目标的,并且在 Windows 和其他平台上不会失败。
【解决方案4】:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多