Кажется, что и gcc, и clang незаметно удаляют /usr/include из списка включаемых каталогов при явном включении через -I. Есть ли какая-то конкретная причина, почему обычные компиляторы, по-видимому, не позволяют включать системный каталог include?


фон:

Предположим, вы зависите от файла заголовка, расположенного в / usr / include , при этом унаследовав каталог, содержащий несовместимую версию того же заголовка, от вашей системы сборки через переменную среды CPATH ( эффективно добавляя этот каталог в список -I справа).

3
vega8 22 Ноя 2018 в 23:40

1 ответ

Лучший ответ

GCC игнорирует -I/usr/include, поскольку по умолчанию это каталог системного заголовка, а использование -I превратит его в несистемный заголовок, что приведет к путанице, особенно с системными заголовками, которые не полностью соответствуют языковым стандартам. . (Например, GCC дает системным заголовкам больше свободы и подавляет предупреждения.)

Если вы используете -isystem /usr/include, то /usr/include перемещается в начало списка поиска. Однако вам, вероятно, придется переместить и другие записи пути поиска по умолчанию, чтобы не нарушить слишком много вещей. gcc -v напечатает весь путь поиска.

2
Florian Weimer 22 Ноя 2018 в 21:39