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

8

系统信息:OS X 10.10.5,Clang = Apple LLVM版本6.1.0(基于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;
 }

当我运行"clang++ -stdlib=libc++ -std=c++11 main.cpp"时,我得到了错误:
main.cpp:11:20: error: no member named 'accumulate' in namespace 'std' 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%] Building CXX object 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: error: no member named 'accumulate' in namespace 'std' int sum = std::accumulate(v.begin(), v.end(), 0); ~~~~~^ 1 error generated.

(完整输出在此处):

我知道这篇文章,它似乎暗示我只需要包含这些编译器标志。但这似乎不起作用。

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

1个回答

17

另一个朋友给出了答案:

在我的更大的程序中(显然没有贴在这里),某些地方以某种隐藏的方式包含了 <numeric>。当我在OSX上编译时,它不再被包含。我原本以为 <algorithm> 是必需的组件,但很明显它不是。所以只是我的错误。


如果你愿意尝试实验性功能,可以打开-fmodules,这将直接告诉你当你尝试使用某个功能但没有包含正确的头文件时。例如,在这里它会告诉你正在使用accumulate但是没有#include数值头文件。 - bames53
我提到“futzing”实验性功能的原因是,我记得有一次libc ++头文件需要进行一次更改,以纠正在模块化它们时发生的错误。我想我有一个脚本或其他东西可以应用适当的补丁。我不知道苹果是否已经更新了他们随Xcode一起提供的版本。 - bames53

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接