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

标签 c++ xcode macos clang

Apple 的 clang 似乎神奇地包含了与我的代码冲突的 Xcode 头文件。例如,它们定义了 stoi() 而标准 C++ header 没有。 Clang 不会在其他平台上执行此操作,例如FreeBSD。

Mac OS 上的错误示例:

$ 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* ...
                                    ^

此编译在 FreeBSD 上运行良好。

问题是因为除了/usr/include/c++ 中的标准 C++ header 之外,Apple clang 还包括 Xcode 应用程序工具链中的 header 。有没有什么方法可以在不使用 -nobuiltininc 标志的情况下关闭它?

最佳答案

OSX 上较新版本的 clang 的默认 C++ 库是 libc++,它是 C++11 标准的相当完整的实现。 header 都是 C++11,并且没有条件部分来删除只应在该标准中可用的方法(例如,尝试使用 --std=c++03 进行编译不会达到预期的效果。

Apple 环境中存在的 stdlib++ 版本没有这个问题,因为 (1) 它不是 C++11 标准的完整实现,并且 (2) 您实际上可以为旧的 c++ 标准编译。

因此,如果您使用 --stdlib=libstdc++ 进行编译,您将针对 GNU 标准库头文件和库进行编译,而 std 的定义没有问题::stoi(如果我正确解释问题,还有其他例程)。

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

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

关于c++ - 阻止 Apple clang 将 Xcode 路径添加到标准包含路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24314053/

相关文章:

php - 拉维尔 5.6 | PHP artisan 迁移不工作

c++ - glEnableVertexAttribArray 中 "index"参数的含义和(可能)OS X OpenGL 实现中的错误

objective-c - 如何使用dispatch_async_f?

c++ - 如何从docker中的程序记录主机桌面(ubuntu中的c++ opencv)?

javascript - 从 UIWebView 添加 javascript 到页面中

swift - "Charts"(IOS) xcode 9.0 编译错误 : "static var ' defaultFormatter ' is not public"

C++:XCode EXC_BAD_ACCESS 问题

node.js - 如何使用 HomeBrew 安装 nodejs 4.1.2

c++ - 使用 trajectory_msgs 在 gazebo 和 Controller 之间发布

c++ - 与输入范围相关的排序算法的效率