Компиляция предварительно обработанного вывода изменений файла

У меня есть исходный файл, который я предварительно обрабатываю с помощью параметров -E и -P (используя GCC 4.1.2 для встраиваемой платформы на основе vxWorks). Все остальные параметры такие же, как и при компиляции файла. Вот эти варианты:

-Wall  
-march=pentium 
-nostdinc 
-O0 
-fno-builtin 
-fno-defer-pop
-g  
-c
-o

а также все include-пути. Теперь, когда я компилирую этот предварительно обработанный файл, результирующий объектный файл намного меньше (около 30%), чем при прямой компиляции оригинала. И когда я потом компоную программу, компоновщик жалуется на отсутствующие символы (все в пользовательском коде), чего опять же не происходит при использовании оригинального исходного файла. Почему есть разница? Есть ли способ заставить это работать?


person Björn Pollex    schedule 10.02.2012    source источник


Ответы (2)


Вы уверены, что не пропустили ни одного определения -D из своей командной строки? Ваш результат будет соответствовать частям, которые не компилируются из-за условий.

Другая возможность (поскольку вы не называете компилятор конкретно) заключается в том, что вы используете общий gcc -E, а не перекрестный компилятор для конкретной архитектуры для вашей среды vxWorks. Кросс-gcc предопределит некоторые переменные, которые вам понадобятся для gcc -E.

person Ben Jackson    schedule 13.02.2012
comment
Я изменяю правило, которое создает объектный файл, просто добавляя флаги -E и -P, ничего не удаляя, поэтому я почти уверен, что использую правильный компилятор и у меня есть все определения. - person Björn Pollex; 14.02.2012

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

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

person Michael Burr    schedule 13.02.2012