Какие каталоги GCC по умолчанию включают в себя?

Когда я компилирую очень простой исходный файл с помощью gcc, мне не нужно указывать путь к стандартным включаемым файлам, таким как stdio или stdlib.

Как GCC знает, как найти эти файлы?

Есть ли у него /usr/include путь внутри, или он получит пути от других компонентов ОС?

6 ответов

Решение

Чтобы выяснить пути по умолчанию, используемые gcc/g++В дополнение к их приоритетам необходимо проверить вывод следующих команд:

  1. Для C:
    gcc -xc -E -v -
  1. Для C++:
    gcc -xc++ -E -v -

Кредит принадлежит команде Qt Creator.

Есть команда с более коротким выводом, которая позволяет автоматически вырезать включаемые пути из строк, начиная с одного пробела:

$ echo | gcc -Wp,-v -x c++ - -fsyntax-only
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.2/include-fixed"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../x86_64-redhat-linux/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../include/c++/4.8.2
 /usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../include/c++/4.8.2/x86_64-redhat-linux
 /usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../include/c++/4.8.2/backward
 /usr/lib/gcc/x86_64-redhat-linux/4.8.2/include
 /usr/local/include
 /usr/include
End of search list.

Кредит идет на главную страницу libC++.

Подводя итог другим ответам:

Для С++:

c++ -xc++ /dev/null -E -Wp,-v 2>&1 | sed -n 's,^ ,,p'

Для С:

cc -xc /dev/null -E -Wp,-v 2>&1 | sed -n 's,^ ,,p'

Хотя я согласен с ответом Игоря Кахарличенко о рассмотрении C++ и с ответом abyss.7 о компактности его вывода, они все еще неполны для многоархивных версий gcc, поскольку обработка ввода зависит от параметров командной строки и макросов.

Пример:

echo | /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/arm-none-eabi-g++ -specs=nano.specs -mcpu=cortex-m4 -march=armv7e-m -mthumb -mfloat-abi=soft -x c++ -E -Wp,-v\ - -fsyntax-only дает

⋮
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../arm-none-eabi/include/newlib-nano                                                                                                              
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1                                                                        
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1/arm-none-eabi/thumb/v7e-m/nofp                                         
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1/backward                                                               
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/include                                                                                                            
 /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/include-fixed                                                                                                      
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include                                                                                  
⋮

в то время как echo | /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/arm-none-eabi-g++ -x c++ -E -Wp,-v - -fsyntax-only дает

⋮
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1                                                                        
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1/arm-none-eabi                                                          
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1/backward                                                               
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/include                                                                                                            
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/include-fixed                                                                                                      
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include                                                                                  
⋮

В первом заклинании используется newlib(см. строки 1 и 3 вывода), последний идет со стандартными включениями. Общие файлы в конце списка являются примером использованияinclude_next.

Итог: всегда учитывайте все макросы и параметры компилятора при печати подключаемых каталогов.

Вот статья, описывающая пути поиска gcc: http://www.network-theory.co.uk/docs/gccintro/gccintro_21.html

Кроме того, вы можете указать дополнительные пути поиска с помощью -I переключатель. Вы можете сделать это из командной строки или в вашем make-файле.

Просто запустите следующее, чтобы перечислить пути поиска по умолчанию:

$(gcc -print-prog-name=cc1) -v
Другие вопросы по тегам