Come utilizzare marca e compilare come C99?
Domanda
Sto cercando di compilare un kernel linux modulo usando un Makefile:
obj-m += main.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Il che mi dà:
main.c:54: warning: ISO C90 forbids mixed declarations and code
Ho bisogno di passare a C99. Dopo aver letto ho notato che ho bisogno di aggiungere un flag -std = C99, non è sicuro dove supponiamo di essere aggiunta.
Come faccio a cambiare il Makefile in modo che compilerà come C99?
Soluzione
Non ha niente a che fare con il makefile. proibisce ISO C90 dichiarazione di variabili ovunque ma all'inizio di un blocco o il file - come questo
int main(int argc, char **argv) {
int a; /* Ok */
int b = 3; /* Ok */
printf("Hello, the magic number is %d!\n", b);
int c = 42; /* ERROR! Can only declare variables in the beginning of the block */
printf("I also like %d.. but not as much as %d!\n", c, b);
return 0;
}
Così deve essere modificato a questo ...
int main(int argc, char **argv) {
int a; /* Ok */
int b = 3; /* Ok */
int c = 42; /* Ok! */
printf("Hello, the magic number is %d!\n", b);
printf("I also like %d.. but not as much as %d!\n", c, b);
return 0;
}
Si può solo "fix" che nel codice sorgente, non nel makefile.
Questa regola è stato rilassato in C99, ma a mio parere è una buona idea separare definizioni di variabili, le dichiarazioni e inizializzazioni dal codice sotto di essa:)
Quindi, per cambiare il vostro makefile per renderlo compilare con C99, è necessario modificare il Makefile nella directory "Build" che il makefile fa riferimento, e aggiungere la "-std = C99" alla linea "gcc" compilazione del file sorgente.
Altri suggerimenti
Il modo corretto per aggiungere flag di compilazione durante la compilazione dei moduli è impostando la variabile ccflags-y
. In questo modo:
ccflags-y := -std=gnu99
Documentation / kbuild / makefiles.txt nel kernel per ulteriori informazioni.
Si noti che sto utilizzando lo standard gnu99
anziché c99
dal momento che il kernel di Linux si basa fortemente su estensioni GNU.
Si può solo aggiungere
CFLAGS=-std=c99
Per la parte superiore del vostro makefile
, oppure si può fare il codice compatibile con C90 (come suggerisce Luken.)