为什么CMake似乎没有使用add_compile_options命令应用-pthread?

时间:2014-10-13 15:08:37

标签: c++ multithreading c++11 cmake

我正在尝试使用CMake 2.8.12.2使用g ++ 4.8.2编译一个简单的C ++程序,它使用C ++ 11特性和多线程。为此,必须使用编译器标志-std = c ++ 11和-pthread。根据我的理解,在CMake中,设置这些标志可以通过各种方式完成,一种是使用set命令:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread")

另一种(假设是首选的)方法是使用add_compile_options命令:

add_compile_options(-std=c++11)
add_compile_options(-pthread)

(或在一行中:add_compile_options(-std=c++11 -pthread)

所以,问题是在我的情况下,只有第一种方法有效 - 通过使用set命令。问题是使用add_compile_options会导致已编译的输出可执行文件崩溃并显示以下消息(就像根本没有指定-pthread一样):

terminate called after throwing an instance of 'std::system_error'
  what():  Enable multithreading to use std::thread: Operation not permitted
Aborted (core dumped)

我测试的代码:

#include <future>

int main()
{
    auto a = std::async(std::launch::async, [](){});
    a.wait();
    return 0;
}

从这个程序编译的事实来看,我可以推断应用了-std = c ++ 11。问题是为什么不应用-pthread?

2 个答案:

答案 0 :(得分:1)

假设您肯定使用g ++进行编译(只需通过检查/usr/bin/c++实际上是什么来澄清 - 我假设它是g ++的链接)g ++的手册页给出:

gcc [-c|-S|-E] [-std=standard]
    [-g] [-pg] [-Olevel]
    [-Wwarn...] [-pedantic]
    [-Idir...] [-Ldir...]
    [-Dmacro[=defn]...] [-Umacro]
    [-foption...] [-mmachine-option...]
    [-o outfile] [@file] infile...

这意味着您需要:

g++ -std=c++11 -g -pthread ...
按顺序

或许值得尝试使用此调整手动运行命令行,看看生产的内容是否有效。

在我看来(没有任何研究,我添加)add_compile_options可能仅对添加严格的编译器选项有用,因此可能必须使用{{ 1}}为所有其他编译器选项设置set-std=c++11 - 即在add_compile_options之后指定

答案 1 :(得分:0)

尝试以下方法:

set (
  CMAKE_CXX_FLAGS
  "${CMAKE_CXX_FLAGS} "
  "-Wall -Werror -pthread -std=c++11 -Wl,--no-as-needed"
)

来源:here