2013-04-09 11 views
7

So che se si esegue GCC come tale:Come si comporta GCC se ha superato flag di compilazione in conflitto?

gcc -O3 -O2 foo.c 

GCC utilizzerà l'ultima flag di ottimizzazione passato (in questo caso O2). Tuttavia, è vero per tutte le bandiere? Per esempio, se eseguo GCC in questo modo:

gcc -mno-sse -msse bar.c 

Sarà supportare SSE dato che era l'ultimo flag passato, o se tale risultato in un comportamento indefinito? La mia sperimentazione iniziale sembra indicare che supporterà l'SSE, ma non sono sicuro che questo sia vero per tutti i casi.

risposta

10

Normalmente le opzioni successive sulla linea hanno precedenza su quelle passate, come si menziona nel primo esempio. Personalmente non ho riscontrato alcun comportamento diverso per i flag -m o -f, ma non conosco un riferimento specifico nella documentazione.

Nota che alcune opzioni non si comportano in questo modo:

$ gcc example.c -DABC -DABC=12 
<command-line>: warning: "ABC" redefined 
<command-line>: warning: this is the location of the previous definition 

Quindi non ci sarebbe bisogno di essere un -UABC in mezzo ci di chiudere quell'avvertimento up.

A parte questo, clang è particolarmente adatto a risolvere questo problema - genererà un avviso se ignora un'opzione della riga di comando, che può essere d'aiuto.

+3

Forse vale la pena notare che gcc si comporta ancora nelle "opzioni successive sulla linea ignora quelle passate in precedenza", anche nel tuo esempio. È solo che * anche * ti dà un avvertimento. – codetaku

Problemi correlati