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