2010-05-29 10 views
14

Ich versuche, ein Linux-Kernel-Modul mit einem Makefile zu kompilieren:Wie make und compile als C99 verwenden?

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 

Welche gibt mir:

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

ich zu C99 wechseln müssen. Nach dem Lesen bemerkte ich, dass ich ein Flag -std = c99 hinzufügen muss, nicht sicher, wo es hinzugefügt werden soll.

Wie kann ich das Makefile so ändern, dass es als C99 kompiliert wird?

+0

Ich dachte, C99 war ein Exploit-Skript für PHP hehe – RobertPitt

Antwort

-6

Es hat nichts mit dem Makefile zu tun. ISO C90 verbietet Variablen überall, aber am Anfang eines Blocks oder die Datei erklärt wird - wie diese

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; 
} 

So muss es geändert werden, um diese ...

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; 
} 

Sie können nur „fix“ das im Quellcode, nicht im Makefile.

Diese Regel wurde in C99 entspannt, aber meiner Meinung nach ist es eine gute Idee, variable Definitionen, Erklärungen und Initialisierungen aus dem Code darunter zu trennen :)

Also Ihre Make-Datei zu ändern, um es mit C99 zu machen kompiliert , müssen Sie das Makefile im Verzeichnis "build" ändern, auf das Ihr Makefile verweist, und "-std = c99" in der Zeile "gcc" hinzufügen, die die Quelldatei kompiliert.

+7

CFLAGS ist viel häufiger, bevorzugt und weniger zerbrechlich als jeden Aufruf des Compilers bearbeiten. –

+4

Nachdem ich lange in der OO (Java) Welt gelebt habe und vor kurzem immer wieder mit der Verwendung von C beschäftigt war, muss ich dem Punkt bezüglich der Trennung variabler Informationen nicht zustimmen. Es ist wichtiger, die Dinge so klein wie möglich zu halten. Einige Variablen werden nur innerhalb einer while- oder for-Schleife benötigt. – powerj1984

+0

@ powerj1984 Sie können in diesem Fall die geschweifte Klammer {} verwenden. LukeN ist korrekt wie in * was von der Kernel-Hauptleitung * akzeptiert würde. Ob das alles eine gute Sache ist, werde ich nicht sagen und ich denke, es ist nicht das, was das OP gefragt hat. –

14

könnten Sie fügen nur

CFLAGS=-std=c99 

Nach oben Ihren makefile, oder Sie können den Code kompatibel mit C90 machen (wie Lüken vermuten lassen.)

17

Den richtigen Weg Compiler-Flags hinzufügen beim Kompilieren Module ist durch Setzen der ccflags-y Variable. Wie folgt aus:

ccflags-y := -std=gnu99 

Siehe Documentation/kbuild/makefiles.txt im Kernel Baum für weitere Informationen.

Beachten Sie, dass ich den gnu99-Standard anstelle von c99 verwende, da der Linux-Kernel stark auf GNU-Erweiterungen angewiesen ist.

+3

Hallo, ich füge ccflags-y dem Makefile für mein eigenes Modul hinzu, aber der Compiler warnt immer noch, dass "ISO C90 verbietet gemischte Deklarationen und Code". Warum? – basicthinker

+3

@basicthinker: vielleicht hilft [this] (http://stackoverflow.com/questions/15910064/how-to-compile-a-linux-kernel-module-using-std-gnu99) –