Gcc с параметрами "-S -save-temps" помещает промежуточные файлы в текущий каталог
Параметры -S -save-temps
работают нормально, пока я не использую их в файлах с тем же именем.
Подумайте о следующей ситуации: у меня есть проект с основным каталогом и подкаталог с именем subDir
, а в обоих каталогах находятся файлы, помещенные с именем file.c
. Если я теперь вызову gcc -S -save-temps file.cpp subDir/file.c
, будет создан только один промежуточный файл с именем file.i
.
Это ожидаемое поведение, так как файл man из gcc
сообщает мне, что промежуточные файлы всегда будут помещаться в текущий путь при использовании -save-temps
.
Моя проблема в том, что я работаю над проектами, которые я не знаю заранее. Вполне возможно, что кто-то создал вышеупомянутый пример в своих Makefile. В этом случае я бы застрял, потому что мне нужны оба промежуточных файла.
Несколько слов для системы, которую я создаю (для лучшего понимания): Мой инструмент использует make --just-print
для сбора вызовов, вызывает файл make проекта. Я просматриваю эти вызовы для вызовов компилятора и добавляю параметры -save-temps
и -S
. Цель состоит в том, чтобы получить каждый предварительно обработанный файл, который используется в процессе компиляции проекта.
Есть ли у вас какие-либо идеи, как я могу получить каждый предварительно обработанный файл, даже если появился вышеприведенный пример?
Ответы
Ответ 1
Нет проблем с файлом file.cpp/file.c в разных каталогах. GCC создаст *.ii
и *.i
в зависимости от расширения файлов.
Если они оба имеют c || cpp, вы можете использовать -E
и получать только один *.i
, где вы можете найти прагму # 1 "<FILE_PATH>"
и извлечь ее с помощью script.
Ответ 2
В gcc 4.5 вы можете использовать опцию "-save-temps = obj" при использовании опции -o. Это сохраняет промежуточные файлы в том же каталоге, что и выходной файл, что может помочь предотвратить проблемы, если у вас одинаковое имя файла, используя разные исходные и выходные каталоги.
gcc -save-temps=obj -c dir1/foo.c -o dir1/foo.o
gcc -save-temps=obj -c dir2/foo.c -o dir2/foo.o
Промежуточные файлы будут сохранены как dir1/foo.*
и dir2/foo.*