Cómo usar maquillaje y compilar como C99?
Pregunta
Estoy intentando compilar un kernel de Linux módulo utilizando 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
Lo que me da:
main.c:54: warning: ISO C90 forbids mixed declarations and code
Me necesidad de cambiar a C99. Después de leer me di cuenta de que necesito agregar una marca de -std = c99, no sabe dónde se supone que debe ser añadido.
¿Cómo cambio el Makefile por lo que se compilará como C99?
Solución
No tiene nada que ver con el makefile. prohíbe la norma ISO C90 declarar variables en cualquier lugar, pero en el comienzo de un bloque o el archivo - como esto
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;
}
Por lo tanto, tiene que ser modificado para este ...
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;
}
Sólo puede "solución" que en el código fuente, no en el makefile.
Esta regla se ha relajado en el C99, pero en mi opinión es una idea buena para separar las definiciones de variables, las declaraciones y las inicializaciones del código debajo de él:)
Así que para cambiar su makefile para que se compile con C99, es necesario cambiar el Makefile en el directorio "acumulación" de que su archivo MAKE se está refiriendo, y añadir el "-std = c99" en la línea "gcc" compilar el fuente de archivo.
Otros consejos
La forma correcta de añadir opciones del compilador al compilar módulos está estableciendo la variable ccflags-y
. De esta manera:
ccflags-y := -std=gnu99
Documentación / kbuild / makefiles.txt en el árbol del kernel para más información.
Tenga en cuenta que estoy usando el estándar gnu99
en lugar de c99
ya que el núcleo de Linux depende fuertemente de las extensiones de GNU.
Se podía añadir
CFLAGS=-std=c99
En la parte superior de su makefile
, o puede hacer que el código compatible con C90 (como sugiere Luken.)