OS X/Clang 不会使用 c++11 头文件

Posted

技术标签:

【中文标题】OS X/Clang 不会使用 c++11 头文件【英文标题】:OS X/Clang won't use c++11 headers 【发布时间】:2015-12-13 09:55:10 【问题描述】:

系统信息: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> v1, 2, 3, 4;

    int sum = std::accumulate(v.begin(), v.end(), 0);

    printf("Sum = %d\n", sum);
    return 0;
 

当我运行“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)

当我构建时,会创建此输出(摘录):

[100%] 构建 CXX 对象 CMakeFiles/c11Test.dir/main.cpp.o /usr/bin/c++ -stdlib=libc++ -std=gnu++11 -o CMakeFiles/c11Test.dir/main.cpp.o -c /Users/username/c11Test/main.cpp /Users/username/c11Test/main.cpp:11:20:错误:没有成员命名 命名空间“std”中的“累积” int sum = std::accumulate(v.begin(), v.end(), 0); ~~~~~^ 产生了 1 个错误。

(whole output here):

我知道this post,这似乎意味着我需要做的只是包含这些编译器标志。但这似乎不起作用。

此外,我可能需要在不同版本的各种 OS X 计算机上构建它,所以我真的想知道我在这里忽略了一个通用的解决方案吗?

【问题讨论】:

【参考方案1】:

另一位朋友提供了答案:

在我更大的程序中(未在此处发布,obv。)某些东西以某种隐藏的方式包含了&lt;numeric&gt;。当我在 OSX 上编译时,它不再包含在内。我曾认为&lt;algorithm&gt; 是必要的组件,但显然不是。所以只是我的错误。

【讨论】:

如果您愿意尝试使用实验性功能,您可以打开-fmodules,当您尝试使用设施但未包含正确的标题时,它将直接告诉您.例如这里它会告诉你你正在使用accumulate,但未能#include数字标题。 我提到“futzing”实验性功能的原因是我记得曾经有一个 libc++ 头文件需要进行一次更改才能纠正将它们模块化的错误。我想我有一个脚本或某处应用了适当的补丁。我不知道 Apple 是否已经更新了 Xcode 附带的版本。

以上是关于OS X/Clang 不会使用 c++11 头文件的主要内容,如果未能解决你的问题,请参考以下文章

C语言之在头文件中定义全局变量

Ubuntu和OS-X之间的头文件兼容性

linux下C/C++头文件梳理,看完这篇再也不会搞糊涂头文件了!

李洪强经典iOS面试题11

Clang:找不到 C++11 头文件

c 中conio.h是啥头文件?c++中能用吗