2013-04-09 12 views
6

Ho recentemente appreso come programmare i conducenti carattere semplice e mentre gioca con il codice che ho notato che ho un sacco di le seguenti avvertenze GCC gettato per il mio codice C99:Come compilare un modulo del kernel Linux usando -std = gnu99?

warning: ISO C90 forbids mixed declarations and code 

Presumo che ciò è dovuto al fatto il makefile del kernel Linux principale viene impostato per la compilazione utilizzando uno standard non C99. Ho cercato in giro ho trovato questa risposta qui su StackOverflow: How to use make and compile as C99?

così ho provato, naturalmente, il seguente nel mio Makefile:

ccflags-y := -std=gnu99 

Purtroppo questo non tacere gli avvertimenti del GCC. Ho controllato l'output dettagliato di make e verificato che GCC sia effettivamente eseguito con il -std=gnu99 attaccato alla fine; quindi sono un po 'confuso.

Come si compila correttamente un modulo del kernel Linux utilizzando l'opzione -std=gnu99?

EDIT:

ho notato l'uscita GCC mostra questa opzione: -Wdeclaration-after-statement. È per questo che sto ricevendo gli avvertimenti anche con l'opzione -std=gnu99?

+0

Il makefile Linux è intially chiamato prima il modulo, in modo da GCC potrebbe ottenere misto std = definizioni. – stdcall

+4

Perché non si dichiarano tutte le variabili all'inizio della funzione e si elimina l'avviso in questo modo? – Gonzalo

+1

Ciò è probabilmente dovuto al fatto che quella caratteristica di C99 (dichiarazione dopo dichiarazione) è una delle cose che Linus sembra odiare. Quindi lo stile di codifica di Linux lo proibisce. –

risposta

11

Si scopre che -std=gnu99fa in effetti funziona; Ho iniziato a vedere errori relativi alle funzionalità di C99 dopo aver rimosso il flag del compilatore. Ciò significava che qualcos'altro stava causando la stampa degli avvertimenti oltre all'opzione -std=.

Dopo aver analizzato l'output dettagliato tramite make V=1, ho scoperto l'opzione -Wdeclaration-after-statement come parte dell'esecuzione GCC. Questa è stata la causa degli avvertimenti sulla dichiarazione mista ISO C90 che ho visto.

Per disabilitare gli avvisi ISO C90, passare a GCC: -Wno-declaration-after-statement.

Ad esempio:

ccflags-y := -std=gnu99 -Wno-declaration-after-statement 
-1

È inoltre possibile specificare il flag nella tua Makefile, se ne hai uno:

FLAGS=-std=gnu99 
Problemi correlati