2010-05-29 14 views
14

estoy tratando de compilar un módulo del kernel de Linux usando un Makefile:¿Cómo usar make y compilar como C99?

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 

que me da:

main.c:54: warning: ISO C90 forbids mixed declarations and code 

que necesito para cambiar a C99. Después de leer me di cuenta de que necesito agregar un indicador -std = c99, no estoy seguro de dónde se supone que debe agregarse.

¿Cómo cambio el Makefile por lo que se compilará como C99?

+0

pensé C99 era un script PHP explotar con jeje – RobertPitt

Respuesta

-6

No tiene nada que ver con el makefile. ISO C90 prohíbe 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; 
} 

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 se puede "arreglar" eso en el código fuente, no en el archivo MAKE.

Esta regla se ha relajado en el C99, pero en mi opinión es una buena idea separar las definiciones de variables, las declaraciones y las inicializaciones del código debajo de ella :)

Así que para cambiar su makefile para que se compile con C99 , debe cambiar el archivo Make en el directorio "compilar" al que hace referencia su archivo Magel y agregar el "-std = c99" en la línea "gcc" que compila el archivo fuente.

+7

CFLAGS es mucho más común, preferido y menos frágil que la edición de cada invocación del compilador. –

+4

Después de vivir en el mundo orientado a objetos (Java) desde hace mucho tiempo y recientemente volver a meterse en el uso de C en un más día a día puedo estar de acuerdo con el punto sobre la separación de información variable a cabo. Mantener las cosas en un ámbito tan pequeño como sea posible parece más importante. Algunas variables solo serán necesarias dentro de un tiempo o para bucle, por ejemplo. – powerj1984

+0

@ powerj1984 En este caso, puede usar el alineamiento de llaves {}. LukeN es correcto como en * lo que sería aceptado por la línea principal del kernel *. Si eso es algo bueno, no diré nada y supongo que no es lo que pidió el OP. –

14

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

17

La forma correcta de añadir opciones del compilador al compilar módulos es estableciendo la variable ccflags-y. De esta manera:

ccflags-y := -std=gnu99 

Ver Documentation/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 kernel de Linux depende en gran medida de las extensiones de GNU.

+3

Hola, añadir ccflags-y para el Makefile para mi propio módulo, pero el compilador todavía advierte que "ISO C90 prohíbe declaraciones mixtos y el código". ¿Por qué? – basicthinker

+3

@basicthinker: tal vez [esto] (http://stackoverflow.com/questions/15910064/how-to-compile-a-linux-kernel-module-using-std-gnu99) ayuda –

Cuestiones relacionadas