2010-01-29 12 views
11

Los parámetros -S -save-temps funcionan bien, siempre que no los use en archivos con el mismo nombre.gcc con parámetros "-S -save-temps" coloca archivos intermedios en el directorio actual

Considere la siguiente situación: Tengo un proyecto con un directorio principal y un subdirectorio con el nombre subDir y en ambos directorios hay archivos colocados con el nombre file.c. Si ahora llamo al gcc -S -save-temps file.cpp subDir/file.c, solo se generará un archivo intermedio con el nombre file.i.

Ese es el comportamiento esperado, como me dice el archivo man de gcc, que los archivos intermedios siempre se colocarán en la ruta actual, cuando se usa -save-temps.

Mi problema es que estoy trabajando en proyectos que no sé de antemano. Podría ser que alguien haya construido el ejemplo mencionado anteriormente en sus Makefiles. En ese caso, me quedaría estancado, porque necesito ambos archivos intermedios.

Algunas palabras para el sistema que estoy construyendo (para una mejor comprensión): Mi herramienta usa make --just-print para recoger las llamadas, un archivo make de un proyecto invoca. Escaneo estas llamadas para llamadas al compilador y agrego las opciones -save-temps y -S. El objetivo es obtener cada archivo preprocesado, que se utiliza en el proceso de compilación del proyecto.

¿Tiene alguna idea de cómo puedo obtener cada archivo preprocesado, incluso si el ejemplo mencionado anteriormente debería aparecer?

Respuesta

3

No hay problema con file.cpp/file.c en directorios diferentes. GCC creará un *.ii y un *.i dependiendo de la extensión de los archivos.

Si ambos tienen c || cpp, puede usar -E y recibir solo un *.i donde puede buscar el pragma # 1 "<FILE_PATH>" y extraerlo a través de un script.

+1

Ha habido un error en mi puesto. Ambos archivos en mi ejemplo tienen la misma extensión. – Customizer

+1

Sí, sé el parámetro -E. Pero el problema es que hay más de una línea del patrón n. ° 1 "". Bueno, hasta hace un minuto, pensé, esto sería un problema. Pero creo que cada línea con este patrón simplemente declara una ruta o incluye un archivo de encabezado con la terminación .h. Entonces realmente debería ser posible analizar esas cosas. Pero todavía no estoy seguro, si puedo contar con eso. – Customizer

+1

Muchas gracias. Con la ayuda de http://gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html#Preprocessor-Output debería poder analizar los archivos que obtengo usando ''E'. – Customizer

8

En gcc 4.5 puede usar la opción "-save-temps = obj" cuando usa la opción -o. Esto guarda los archivos intermedios en el mismo directorio que el archivo de salida, lo que puede ayudar a evitar problemas cuando tiene el mismo nombre de archivo utilizando diferentes directorios de origen y de salida.

gcc -save-temps=obj -c dir1/foo.c -o dir1/foo.o 
gcc -save-temps=obj -c dir2/foo.c -o dir2/foo.o 

Los archivos intermedios se guardarán como dir1/foo.* y dir2/foo.*

Cuestiones relacionadas