Clang:“-stdlib”标志究竟有什么作用?

gon*_*one 6 c++ c++11

[Mac OS 10.13.2、Xcode9.2]

Clang 有一个标志-stdlib,根据clang++ -cc1 --help (与 相同clang -cc1 --help)和LLVM 文档页面,该标志允许指定C++ standard library to use.

1) 这个标志对编译有什么影响?即它是否改变了库包含路径等的顺序。

2)这个标志如何影响链接?即它只是供应的捷径/替代方案-lc++吗?

我真的很想了解这个标志的细节,因为我找不到任何描述它精确行为的文档,而且自从 Xcode9 升级以来,它对我们的构建系统造成了严重破坏。-stdlib=libc++由于头文件问题,包含在我们的 Makefile 中会导致编译失败,但是,当-stdlib=libc++省略时,我们的项目编译良好(大概是因为libc++是 Mac OS 默认的标准 C++ 库)。针对该项目的链接libc++由于其他连接标志-lc++-lsupc++

关于我们用例的一些背景信息

我们正在使用 Clang 交叉编译到一个-march=i686 -target i686-linux-elf目标。在 Xcode9 更新之前,我们的构建系统运行良好。自升级以来,我们收到编译器错误,例如:

/usr/local/our-target/sysroot/usr/local/include/c++/v1/stdlib.h:111:82: error: use of undeclared identifier 'labs'; did you mean 'abs'?
inline _LIBCPP_INLINE_VISIBILITY long      abs(     long __x) _NOEXCEPT {return  labs(__x);}
Run Code Online (Sandbox Code Playgroud)

我现在已经能够通过更改标头包含路径来解决这个问题。即我已经删除了对 libc++ 和 gcc4.8.5 包含的父文件夹的路径引用。

#       -I${STAGING.nao}/usr/local/include/c++          \
        -I${STAGING.nao}/usr/local/include/c++/v1
Run Code Online (Sandbox Code Playgroud)

我仍然对了解标志的作用的细节很感兴趣。