2012-02-10 12 views
5

Ho un file sorgente che ho preelaborato utilizzando le opzioni -E e -P (utilizzando GCC 4.1.2 per una piattaforma embedded basata su vxWorks). Tutte le altre opzioni sono le stesse di quando compilo il file. Queste opzioni sono:Compilazione file preelaborato in precedenza cambia output

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

così come tutti i percorsi di inclusione. Ora quando compilo questo file preelaborato, il file oggetto risultante è molto più piccolo (circa il 30%) rispetto a quando compilo direttamente l'originale. E quando collego il programma, il linker si lamenta dei simboli mancanti (tutti in codice utente), cosa che ancora non accade quando si utilizza il file sorgente originale. Perché c'è una differenza? C'è un modo per farlo funzionare?

risposta

1

Sei sicuro che non ti manca nessuna delle definizioni -D dalla riga di comando? Il tuo risultato sarebbe coerente con parti non compilate a causa di condizionali.

Un'altra possibilità (dato che non si specifica specificamente il compilatore) è che si sta utilizzando un generico gcc -E anziché un cross-compiler specifico per l'arco per l'ambiente vxWorks. Cross-gcc predefinirà alcune variabili di cui avrai bisogno per gcc -E.

+0

Sto modificando la regola che crea il file oggetto aggiungendo semplicemente '-E'- e' -P'-flag, senza rimuovere nulla, quindi sono abbastanza sicuro che sto usando il compilatore corretto e ho tutto il definisce. –

1

Durante la compilazione dell'output preelaborato, provare a passare l'opzione -fpreprocessed per comunicare a GCC di non eseguire nuovamente il preprocesso.

L'unica differenza che posso pensare sono le macro che determinano l'espansione di un identificatore che è un nome di macro che è già stato espanso - il preprocessore interrompe l'espansione a quel punto, ma se si esegue nuovamente il preprocessore, l'identificatore sarebbe espanso di nuovo. Mi sarei aspettato che ogni istanza di questo causasse probabilmente un errore del compilatore, ma chi lo sa?