Ich habe sys/ptrace.h
in mein C-Programm aufgenommen.
Die Ausgabe von /usr/lib/gcc/x86_64-linux-gnu/4.8/cc1 -v
gibt die folgenden Pfade an, in denen gcc nach Header-Dateien sucht
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/x86_64-linux-gnu/4.8/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed
/usr/include
End of search list.
Die Ausgabe von gcc -M
für mein Programm gibt die folgenden Speicherorte für Header-Dateien an
pt.o: pt.c /usr/include/stdc-predef.h /usr/include/stdio.h \
/usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \
/usr/include/x86_64-linux-gnu/bits/wordsize.h \
/usr/include/x86_64-linux-gnu/gnu/stubs.h \
/usr/include/x86_64-linux-gnu/gnu/stubs-64.h \
/usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h \
/usr/include/x86_64-linux-gnu/bits/types.h \
/usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/libio.h \
/usr/include/_G_config.h /usr/include/wchar.h \
/usr/lib/gcc/x86_64-linux-gnu/4.8/include/stdarg.h \
/usr/include/x86_64-linux-gnu/bits/stdio_lim.h \
/usr/include/x86_64-linux-gnu/bits/sys_errlist.h \
/usr/include/x86_64-linux-gnu/sys/ptrace.h
/usr/include/x86_64-linux-gnu/
Wie findet gcc, da es nicht in der ersten Ausgabe enthalten ist sys/ptrace.h
?
BEARBEITEN:
Die Ausgabe von echo '#include <sys/ptrace.h>' | gcc -fsyntax-only -xc -v -H -
Ergebnissen in
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-2ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04)
/usr/include
. Welches Problem versuchen Sie zu lösen?/sys/ptrace.h
abersys/ptrace.h
?/usr/include/x86_64-linux-gnu
wird als System-Include-Verzeichnis behandelt und sollte in die von gedruckte Suchpfadliste aufgenommen werdengcc -v
. Ich bin nicht sicher, wie jemand diesen Fehler erreicht hat. Wenn ich mich richtig erinnere, fügt der naheliegendste Weg, Systemeinschlussverzeichnisse hinzuzufügen, diese dem hinzu, was von gedruckt wird-v
. (Ich habe ~ 50% von GCCs Präprozessor geschrieben, aber das war vor 15 Jahren, also kann ich mich an etwas erinnern.)/usr/include
. Das würde fast jede C-Bibliothek der Welt zerstören.Antworten:
Kürzere Antwort.
Ihre Frage
cc1 -v
bezieht sich auf die Ausgabe von , berücksichtigt jedoch nicht den CPP (C Pre-Processor) und die Includes, die in die gesamte Kompilierungskette eingemischt sind. Wenn Siecpp -v
auf Ihrem System ausgeführt werden, sollten Sie eine Mischung von Includes sehen, die der Ausgabe von ähnelt,cc1 -v
aber mindestens den/usr/include/x86_64-linux-gnu
Pfad enthält, der dort hinzugefügt wurde.Längere Antwort.
Technisch
/usr/include/x86_64-linux-gnu/
wird in der ersten Ausgabe nicht explizit gesetzt, ist es aber/usr/include/
definitiv. Und das ist ein Standardsuchpfad, wie in der offiziellen GNU GCC-Dokumentation erläutert :Und hier weiter erklärt:
Dies bedeutet also, dass der
x86_64-linux-gnu/
Pfad einfach/usr/include/*/sys/
wie folgt eingefügt wird :Zumindest habe ich das ursprünglich in einer früheren Version dieser Frage gedacht . Aber nach dem Auschecken dieser Site ist die Erklärung dessen, was passiert, etwas detaillierter und die direkte Antwort dieser Site auf den entsprechenden Inhalt zu dem, was ich oben gepostet habe, wird unten erneut veröffentlicht. kühne Betonung liegt bei mir:
Da der CPP (C Pre-Processor) der erste Schritt im Compilerprozess ist, schauen wir uns die Include-Ausgabe
cpp -v
meines Ubuntu 12.04.5-Testsystems an:Dort kann man deutlich sehen
/usr/include/x86_64-linux-gnu
. Und zum Vergleich: Hier ist die ähnliche "Include" -Ausgabe/usr/lib/gcc/x86_64-linux-gnu/4.6/cc1 -v
auf demselben Ubuntu 12.04.5-Testsystem:Beachten Sie, wie
/usr/include/x86_64-linux-gnu
durch die anfängliche CPP-Aktion (C Pre-Processor) eindeutig in die Mischung eingefügt wird. In dem Beitrag auf dieser Website wird weiter erläutert, woher diese Pfade stammen. wieder ist kühne Betonung meine:Alles läuft also darauf hinaus, dass der CPP (C Pre-Processor) als erster Teil einer C-Kompilierungskette aufgerufen wird.
quelle
$TARGET
Teil, den ich in meiner Antwort und meinem Kommentar erwähnt habe. Es ist die Ausgabe,config.guess
wann GCC kompiliert wurde oder was seinemconfigure
Skript mit dem--target
Flag übergeben wurde. Die eigentliche Frage ist, wie dieser Weg zusammengesetzt wird. Geht es nur durch dieselbe Liste, die$TARGET
an jede angehängt wird , nachdem der Header beim ersten Mal nicht gefunden wurde?Ohne mich mit dem GCC-Quellcode zu befassen, kann ich Ihnen kein "Warum" nennen, aber ich kann Ihnen sagen, dass die Version von GCC, die ich hier habe, zurückgreift,
/usr/include/$TARGET
nachdem Sie und JakeGould die Auswahlmöglichkeiten erschöpft haben . Sie können es so sehen:wo
foo.c
enthält a#include <sys/ptrace.h>
.Sie brauchen das
-f
Argument hier, weilgcc
Kinder erzeugt werden, um die eigentliche Kompilierungsarbeit zu erledigen. Sie benötigen das,2>&1
weilstrace
es seine Ergebnisse in stderr schreibt, nicht in stdout.Beachten Sie, dass Sie
ENOENT
Fehler für alle dokumentierten Verzeichnisse erhalten, bevor es schließlich das erfolgreiche versucht.quelle