当通过-I
显式包含时,gcc和clang似乎都会从包含目录列表中静默地丢弃/usr/include
。为什么常见的编译器显然不允许包含系统的include-dir,有什么具体的原因吗?
背景:
假设您依赖于位于/usr/include
中的头文件,同时通过CPATH
环境变量从构建系统继承了一个包含同一头的不兼容版本的目录(实际上是将该目录从右侧附加到-I
列表中(。
GCC会忽略-I/usr/include
,因为默认情况下它是一个系统头目录,而使用-I
会将其变成非系统头,从而导致混乱的行为,尤其是与语言标准不完全一致的系统头。(例如,GCC为系统标题提供了更多的自由度,并抑制了警告。(
如果使用-isystem /usr/include
,则/usr/include
将移动到搜索列表的前面。然而,您可能还必须移动其他默认搜索路径条目,以避免破坏太多内容。gcc -v
将打印整个搜索路径。