Выход и компиляция препроцессора GCC за один проход - PullRequest
11 голосов
/ 28 января 2012

Возможно ли сгенерировать вывод и компиляцию препроцессора за один шаг с помощью GCC?

Что-то вроде:

gcc -E -c main.cc -o main.o

, что приведет к генерации main.o и main.i

Ответы [ 2 ]

16 голосов
/ 28 января 2012

Да.

Посмотрите на gcc -save-temps вариант.

Компилирует исходный файл и сохраняет результат предварительной обработки в файле .i. (Он также сохраняет результат фазы ассемблера в файл .s).

gcc -save-temps -c main.cc -o main.o

будет генерировать main.o, а также main.i и main.s.

main.i является результатом предварительной обработки.

6 голосов
/ 28 января 2012

Нет, не с самим -E, параметры -s, -c и -E называются параметрами "стоп". Они фактически останавливают процесс в определенной точке, поэтому вы не можете продолжать.

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

Из справочной страницы gcc, обсуждаемые материалы -E (слегка перефразировано):

Если вам нужны только некоторые этапы компиляции, вы можете использовать -x (или суффикс имени файла), чтобы указать gcc, с чего начать, и один из параметров -c, -S или -E, чтобы указать, где находится gcc прекратить. Обратите внимание, что некоторые комбинации (например, -x cpp-output -E) заставляют gcc вообще ничего не делать.

-E означает: остановка после этапа предварительной обработки; не запускайте компилятор должным образом. Выходные данные представлены в виде предварительно обработанного исходного кода, который отправляется на стандартный вывод (или в выходной файл, если указано -o).

Если вы используете опцию -E, ничего не делается, кроме предварительной обработки.

И описание -save-temps:

-save-Temps

Постоянно хранить обычные «временные» промежуточные файлы; поместите их в текущий каталог и присвойте им имена на основе исходного файла.

Таким образом, компиляция foo.c с помощью -c -save-temps создаст файлы foo.i и foo.s, а также foo.o.

Это создает предварительно обработанный выходной файл foo.i, даже если компилятор обычно использует встроенный препроцессор.

...