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/include
wbudowaną ścieżkę na stałe, czy też będzie pobierać ścieżki z innych składników systemu operacyjnego?
cpp -v /dev/null -o /dev/null
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 ++ .
źródło
/dev/null
zamiast-
, a nie będziesz potrzebować fajkiChociaż 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-only
plony⋮ /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życiainclude_next
.Konkluzja: Zawsze rozważaj wszystkie makra i opcje kompilatora podczas drukowania katalogów dołączanych.
źródło
Po prostu uruchom poniższe, aby wyświetlić domyślne ścieżki wyszukiwania:
$(gcc -print-prog-name=cc1) -v
źródło
cc1
zwykle 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.