Які GCC включають каталоги за замовчуванням?


131

Коли я компілюю дуже простий вихідний файл з gcc, мені не потрібно вказувати шлях до стандартних файлів, таких як stdio або stdlib.

Як GCC знає, як знайти ці файли?

У нього /usr/includeшлях прокладений всередині, або він отримає шляхи від інших компонентів ОС?

Відповіді:


188

Для того, щоб визначити шляхи за замовчуванням, які використовує gcc/ g++, а також їхні пріоритети, вам потрібно вивчити вихід наступних команд:

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

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


5
cpp -v /dev/null -o /dev/null
Nehal J Wani

36

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

$ 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 ++ .


1

Хоча я згоден з відповіддю Ігоря Кахарліченка щодо розгляду C ++ та з відповіддю безодні.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.

Підсумок: Під час друку каталогів, що включають, завжди враховуйте всі макроси та параметри компілятора .


1

Просто запустіть наступне, щоб переглянути список пошукових шляхів за замовчуванням:

$(gcc -print-prog-name=cc1) -v

Тут не вказано шляхи включення. Тільки програми шлях та бібліотеки шлях
kayahr

cc1Зазвичай не можна викликати безпосередньо, оскільки це внутрішня команда, яка відсутня в PATH. Можливо, ви хочете відредагувати свою відповідь, щоб описати, де знайти файл.
kayahr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.