Компиляция предварительно обработанного файла изменений файла - PullRequest
5 голосов
/ 10 февраля 2012

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

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

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

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

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

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

1 голос
/ 14 февраля 2012

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

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

...