Jakie są domyślne katalogi w GCC?

135

Kiedy kompiluję bardzo prosty plik źródłowy za pomocą gcc, nie muszę określać ścieżki do standardowych plików dołączanych, takich jak stdio lub stdlib.

Skąd GCC wie, jak znaleźć te pliki?

Czy ma /usr/includewbudowaną ścieżkę na stałe, czy też będzie pobierać ścieżki z innych składników systemu operacyjnego?

Raxvan
źródło

Odpowiedzi:

193

Aby ustalić domyślne ścieżki używane przez gcc/ g++, a także ich priorytety, musisz sprawdzić dane wyjściowe następujących poleceń:

  1. Dla C :
    gcc -xc -E -v -
  1. Dla C ++ :
    gcc -xc++ -E -v -

Kredyt trafia do zespołu Qt Creator .

Ihor Kaharlichenko
źródło
5
cpp -v /dev/null -o /dev/null
Nehal J Wani
37

Istnieje polecenie z krótszym wyjściem, które umożliwia automatyczne wycinanie ścieżek dołączania z linii, zaczynając od pojedynczej spacji:

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

Kredyt trafia do głównej strony libc ++ .

przepaść 7
źródło
Użyj /dev/nullzamiast -, a nie będziesz potrzebować fajki
Ruslan
1

Chociaż zgadzam się z odpowiedzią Ihora Kaharlichenko dotyczącą rozważenia C ++ oraz z odpowiedzią Abyss.7 dotyczącą zwartości jego danych wyjściowych, są one nadal niekompletne dla wersji gcc z wieloma łukami, ponieważ przetwarzanie danych wejściowych zależy od parametrów wiersza poleceń i makr.

Przykład:

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 plony

⋮
/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                                                                                  
⋮

natomiast echo | /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/arm-none-eabi-g++ -x c++ -E -Wp,-v - -fsyntax-onlyplony

⋮
/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                                                                                  
⋮

Pierwsze wywołanie wykorzystuje newlib(patrz linie 1 i 3 wyjścia), drugie jest zgodne ze standardowymi dołączeniami. Typowe pliki na końcu listy są przykładem użycia include_next.

Konkluzja: Zawsze rozważaj wszystkie makra i opcje kompilatora podczas drukowania katalogów dołączanych.

hermannk
źródło
1

Po prostu uruchom poniższe, aby wyświetlić domyślne ścieżki wyszukiwania:

$(gcc -print-prog-name=cc1) -v
Daniele Testa
źródło
To nie wymienia ścieżek dołączania. Tylko ścieżka programów i ścieżka bibliotek
kayahr
cc1zwykle nie można wywołać bezpośrednio, ponieważ jest to polecenie wewnętrzne, którego nie ma w PATH. Może chcesz zmienić swoją odpowiedź, aby opisać, gdzie znaleźć plik.
kayahr