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?

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 .


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


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.


1

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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.