阻止Apple clang将Xcode路径添加到标准包含路径

时间:2014-06-19 18:40:30

标签: c++ xcode macos clang

Apple的铿锵似乎神奇地包含了与我的代码冲突的Xcode头文件。例如,它们定义stoi(),而标准C ++标头则不定义$ clang -I. -I../../../include -c compile.cpp compile.cpp:949:18: error: call to 'stoi' is ambiguous arg.iValue = stoi(current.token); ^~~~ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/string:4019:37: note: candidate function _LIBCPP_FUNC_VIS int stoi (const string& __str, size_t* ... ^ 。 Clang不会在其他平台上执行此操作,例如FreeBSD的。

Mac OS上的错误示例:

-nobuiltininc

这个编译在FreeBSD上运行正常。

问题是因为除了/ usr / include / c ++中的标准C ++头文件之外,Apple clang还包含Xcode应用程序工具链中的头文件。有没有办法在不使用{{1}}标志的情况下关闭它?

1 个答案:

答案 0 :(得分:1)

OSX上更新版本的clang的默认C ++库是libc++,它是C ++ 11标准的完全实现。标题都是C ++ 11,并且没有条件部分来删除只应该在该标准中可用的方法(例如,尝试使用--std=c++03进行编译并不具有所需的效果。

苹果环境中出现的stdlib++版本没有这个问题,因为(1)它不是C ++ 11标准的完整实现, (2)你可以实际编译旧的c ++标准。

因此,如果使用--stdlib=libstdc++进行编译,那么您正在编译GNU标准库头文件库,这些文件库和库不会出现std::stoi(以及其他例程)定义的问题如果我正确地解释了这个问题。)

但请记住,您必须使用此标志编译项目的每个 c ++元素,否则您最终会得到使用不同标准库编译的代码,但它们不会联系在一起。

但真正的问题是,如果您开始使用C ++ 11功能并开始使用--std=c++11进行明确编译,那么您可能会在未来某个时候遇到此问题gcc也是如此。较新版本的编译器支持更多的C ++ 11标准,因此将在标题中定义此例程,然后重新回到原点。