Lo he incluido sys/ptrace.h
en mi programa C.
La salida de /usr/lib/gcc/x86_64-linux-gnu/4.8/cc1 -v
da las siguientes rutas donde gcc busca archivos de encabezado
#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.
salida de gcc -M
para mi programa da las siguientes ubicaciones de archivo de encabezado
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
Como /usr/include/x86_64-linux-gnu/
no está contenido en el primer resultado, ¿cómo encuentra gcc sys/ptrace.h
?
EDITAR:
La salida de echo '#include <sys/ptrace.h>' | gcc -fsyntax-only -xc -v -H -
resultados en
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
... ¿Qué problema estás tratando de resolver?/sys/ptrace.h
perosys/ptrace.h
, ¿verdad?/usr/include/x86_64-linux-gnu
se trata como un directorio de inclusión del sistema y debe incluirse en la lista de rutas de búsqueda impresa porgcc -v
. No estoy seguro de cómo alguien logró lograr ese error; Si no recuerdo mal, la forma más obvia de agregar directorios de sistema incluye agregarlos a lo que imprime-v
. (Escribí ~ 50% del preprocesador de GCC, pero eso fue hace 15 años, así que puede ser algo misremembering.)/usr/include
. Eso rompería casi todas las bibliotecas de C del mundo.Respuestas:
Respuesta más corta
Su pregunta es sobre el resultado de
cc1 -v
, pero eso no tiene en cuenta el CPP (preprocesador de C) e incluye que se mezclan en toda la cadena de compilación. Si ejecutacpp -v
en su sistema, debería ver, una combinación de incluye que se parece a la salida decc1 -v
pero con al menos la/usr/include/x86_64-linux-gnu
ruta agregada allí.Respuesta larga
Técnicamente,
/usr/include/x86_64-linux-gnu/
no se establece explícitamente en la primera salida, pero/usr/include/
definitivamente sí. Y esa es una ruta de búsqueda predeterminada como se explica en la documentación oficial de GNU GCC :Y más explicado aquí:
Esto implica que la
x86_64-linux-gnu/
ruta simplemente se inserta/usr/include/*/sys/
así:Al menos eso es lo que inicialmente pensé en una versión anterior de esta pregunta . Pero después de revisar este sitio, la explicación de lo que está sucediendo es un poco más detallada y la respuesta directa de ese sitio al contenido equivalente al que publiqué arriba se vuelve a publicar a continuación; El énfasis en negrita es mío:
Sepa que el CPP (C preprocesador) es el primer paso en el proceso del compilador, echemos un vistazo a la salida "incluir" de
cpp -v
mi sistema de prueba Ubuntu 12.04.5:Ahí puedes ver claramente
/usr/include/x86_64-linux-gnu
. Y para comparar, aquí está la salida similar de "incluir"/usr/lib/gcc/x86_64-linux-gnu/4.6/cc1 -v
en el mismo sistema de prueba Ubuntu 12.04.5:Observe cómo
/usr/include/x86_64-linux-gnu
se inserta claramente en la mezcla mediante la acción inicial de CPP (C preprocesador). Y la publicación en ese sitio continúa explicando de dónde provienen esos caminos; Una vez más, el énfasis es mío:Por lo tanto, todo se reduce a que se llame al CPP (preprocesador C) como la primera parte de una cadena de compilación C.
fuente
$TARGET
parte que mencioné en mi respuesta y comentario. Es la salida deconfig.guess
cuándo se compiló GCC, o qué se le dio a suconfigure
script con la--target
bandera. La verdadera pregunta es, ¿cómo se ensambla ese camino? ¿Simplemente vuelve a la misma lista, agregando$TARGET
a cada uno, después de no encontrar el encabezado la primera vez?A menos que profundice en el código fuente de GCC, no puedo darle un "por qué", pero puedo decirle que la versión de GCC que tengo aquí recurre
/usr/include/$TARGET
después de agotar las opciones que usted y JakeGould han encontrado . Puedes verlo así:donde
foo.c
contiene a#include <sys/ptrace.h>
.Necesita el
-f
argumento aquí porquegcc
genera hijos para hacer el trabajo de compilación real. Necesita el2>&1
porquestrace
está escribiendo sus resultados en stderr, no en stdout.Observe que obtiene
ENOENT
errores para todos los directorios documentados antes de que finalmente pruebe el que tiene éxito.fuente