之间有什么区别-std=c++11
和-std=gnu++11
GCC和铿锵的编译参数?同样的问题c99
和gnu99
?我了解C++和C标准,这是我感兴趣的参数差异.
我已经读到某处与某些扩展有关但我不清楚哪些扩展以及如何在新项目之间进行选择.
系统信息:OS X 10.10.5,Clang = Apple LLVM版本6.1.0(clang-602.0.53)(基于LLVM 3.6.0svn),cmake = 2.8.12.2
假设我有一些简单的文件main.cpp:
#include <stdio.h>
#include <vector>
#include <algorithm>
int main(void)
{
std::vector<int> v{1, 2, 3, 4};
int sum = std::accumulate(v.begin(), v.end(), 0);
printf("Sum = %d\n", sum);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我运行"clang ++ -stdlib = libc ++ -std = c ++ 11 main.cpp"时,我收到错误:
main.cpp:11:20:错误:命名空间'std'中没有名为'accumulate'的成员int sum = std :: accumulate(v.begin(),v.end(),0);
当我看,使用IDE(Qt Creator),我看到包含的头是/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/algorithm
当我查看我的文件系统时,我发现/usr/include/c++/4.2.1存在符合c ++ 11标准的文件.
接下来,我使用cmake来控制更大的构建(上面只是一个示例设置).
所以这是上面例子的标记CMakeLists.txt文件:
project(c11Test)
cmake_minimum_required(VERSION 2.8)
set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_CXX_FLAGS "-stdlib=libc++ -std=gnu++11")
add_executable(${PROJECT_NAME} main.cpp)
Run Code Online (Sandbox Code Playgroud)
在我构建时,创建此输出(摘录):
[100%]构建CXX对象CMakeFiles/c11Test.dir/main.cpp.o/usr/bin/c ++ -stdlib = libc ++ -std …