Gcc 我如何强制cmake包含-pthread";编译期间的选项?

Gcc 我如何强制cmake包含-pthread";编译期间的选项?,gcc,build,build-automation,cmake,Gcc,Build,Build Automation,Cmake,我知道有类似于find_-package(Threads)的东西,但它似乎没有什么区别(至少它本身是这样)。目前,我使用的是SET(CMAKE\u C\u FLAGS${CMAKE\u C\u FLAGS}“-pthread”),但对我来说,这似乎不是一个正确的解决方案。find\u package(Threads)调用一个CMAKE模块,该模块首先在文件系统中搜索适合此平台的Threads包,然后设置CMAKE\u THREAD\u LIBS\u INIT变量(以及一些其他变量)。它不会告诉C

我知道有类似于
find_-package(Threads)
的东西,但它似乎没有什么区别(至少它本身是这样)。目前,我使用的是
SET(CMAKE\u C\u FLAGS${CMAKE\u C\u FLAGS}“-pthread”)
,但对我来说,这似乎不是一个正确的解决方案。

find\u package(Threads)
调用一个CMAKE模块,该模块首先在文件系统中搜索适合此平台的Threads包,然后设置CMAKE\u THREAD\u LIBS\u INIT变量(以及一些其他变量)。它不会告诉CMake将任何可执行文件链接到它找到的任何线程库。您可以告诉CMake使用
target\u link\u libraries()
命令将可执行文件链接到“threads”库。例如,假设您的程序名为test。要将其链接到线程,您需要:

find_package( Threads )
add_executable( test test.cpp )
target_link_libraries( test ${CMAKE_THREAD_LIBS_INIT} )

那么以下内容如何:

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

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)

根据

的说法,强烈建议在新代码中使用导入的目标,但重点是在编译过程中添加“-pthread”选项,而不是链接。哦,我明白你的意思。我不相信有什么特殊的方法可以做到这一点。在大多数平台上,pthread添加-D_可重入和-lpthread。你可以相当轻松地添加-D_可重入(顺便说一句,这是我所看过的任何现代平台上的一个角落)。但真正的问题是您试图获得哪种类型的可移植性,-pthead选项是其他编译器可能不存在的gcc选项。如果您希望使用gcc支持尽可能多的操作系统平台,那么您当前所做的就是要走的路。如果您想在少数平台上支持多个编译器,请使用上述选项.就我个人而言,我不关心这个选项。问题是Boost.Interprocess关心。如果没有它,编译器将以#error指令退出,该指令明确指出需要-pthread(有针对不同系统的替代方案-现在无法引用,因为我目前无法访问该系统).Ahh.boost无法知道您是否真的在gcc命令行中添加了-pthread选项。它能知道的是是否设置了_REENTRANT宏。我看了一下,这确实是检查是否设置了-pthread选项的方法。无论如何,根据您的需求,看起来您已经实现的解决方案it’没关系。我还是保持原样吧。@ltc很抱歉,我没有注意日期。假设这不是今天最准确的答案。行
set(CMAKE\u THREAD\u preference\u PTHREAD TRUE)
将我从数小时的编译尝试中解救出来(Debian Jessie)除非运行cmake<3.1,否则最好直接链接带名称空间的目标(导入目标),而不是
${cmake\u THREAD\u LIBS\u INIT}
变量(请参见@alex che的答案).我同意helmesjo的观点,这篇文章解释了为什么我们应该偏爱目标而不是变量。你将2011年的帖子标记为2013年帖子的副本。拜托!@HenkvanBoeijen,没错,这个问题也有更好的解释answers@maxschlepzig这是高度基于意见的。我认为高质量的问题,有公认的答案,并且有相当数量的答案投票永远不应该被关闭。@maxschlepzig我确信这个问题有更好的答案,但列出的答案真的更好吗?如果你看,它实际上没有回答这个用户提出的问题,即“向我的编译行添加pthreads选项的更好方法是什么”这个问题的答案是:“为什么这里所接受的答案不起作用?提示:因为你的项目设置不正确。这个问题是我如何将线程变成C++的CMAP模块。另一个问题是我如何得到CuFe来识别一个模块是C++。它实际上是在问一个差异。关于同一主题的不同问题,以及@ltc的简短问题和非常简短的好答案,使得这篇文章对这个特定问题更有用。这两个标志之间的区别是什么?如果你只是找到了_包(需要线程),会发生什么和link?从链接的文档页面:
CMAKE\u THREAD\u preference\u PTHREAD
-在具有多线程库的系统上首选PTHREAD库。
THREADS\u preference\u PTHREAD\u FLAG
-preference
-PTHREAD
编译器和链接器标志。忽略这两个选项可能会导入另一个线程库或跳过
 -pthread
编译或链接期间的标志。