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?

È stato utile?

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.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top