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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top