gcc с параметрами "-S -save-temps" помещает промежуточные файлы в текущий каталог - PullRequest
13 голосов
/ 29 января 2010

Параметры -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 для сбора вызовов, вызывается файл проекта проекта. Я сканирую эти вызовы на наличие вызовов компилятора и добавляю опции -save-temps и -S. Цель состоит в том, чтобы получить каждый предварительно обработанный файл, который используется в процессе компиляции проекта.

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

Ответы [ 2 ]

9 голосов
/ 16 февраля 2011

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

3 голосов
/ 30 января 2010

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

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

...