gcc с параметрами "- s-save-temps " помещает промежуточные файлы в текущий каталог

параметры -S -save-temps работать нормально, пока я не использую их на файлы с тем же именем.

подумайте о следующей ситуации: у меня есть проект с основным каталогом и подкаталогом с именем subDir и в обоих каталогах файлы с именем file.c. Если я сейчас позвоню gcc -S -save-temps file.cpp subDir/file.c только один промежуточный файл с именем file.i будет сгенерирован.

это ожидаемое поведение, как человек файл gcc говорит мне, что промежуточные файлы всегда будут помещены в текущий путь, при использовании -save-temps.

моя проблема в том, что я работаю над проектами, я не знаю заранее. Вполне возможно, что кто-то построил вышеупомянутый пример в своих файлах Makefile. В этом случае я бы застрял, потому что мне нужны оба промежуточных файла.

несколько слов к системе, которую я создаю (для лучшего понимания): мой инструмент использует make --just-print для сбора вызовов, сделать файл проекта применяет. Я сканирую эти вызовы для вызовов компилятора и добавляю -save-temps и -S параметры. Цель состоит в том, чтобы получить каждый предварительно обработанный файл, который используется в процессе компиляции проекта.

у вас есть идеи, как я могу получить каждый предварительно обработанный файл, даже если должен появиться вышеупомянутый пример?

2 ответов


с файлом нет проблем.cpp / file.C в разных каталогах. GCC создаст *.ii и *.i в зависимости от расширения файлов.

если у них обоих есть c / / cpp, вы можете использовать -E и получить только один *.i где вы можете искать pragma # 1 "<FILE_PATH>" и извлечь его с помощью скрипта.


в 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.*