Frage

Ich versuche zu kompilieren ein Linux-Kernel-Modul mit einem 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

Was mir gibt:

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

Ich muss Schalter auf C99. Nach der Lektüre bemerkte ich, dass ich eine Flagge -std = c99, nicht sicher, hinzufügen müssen, wo sie hinzugefügt werden, annehmen.

Wie kann ich das Makefile ändern, damit es als C99 kompilieren?

War es hilfreich?

Lösung

Es hat nichts mit der Make-Datei zu tun. ISO C90 verbietet Variablen überall, aber am Anfang eines Blocks oder der Datei erklärt wird - wie dies

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 hat es so weit geändert werden ...

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", dass im Quellcode, nicht in der Make-Datei.

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

So Ihre Make-Datei zu ändern, um es mit C99 zu machen zu kompilieren, müssen Sie das Makefile in dem „Build“ Verzeichnis ändern, dass Ihre Make-Datei verweist, und fügen Sie das „-std = c99“ an der „gcc“ -Linie Kompilieren des Quelldatei.

Andere Tipps

Der richtige Weg Compiler-Flags hinzuzufügen, wenn Module kompiliert durch die ccflags-y variable Einstellung ist. Wie folgt aus:

ccflags-y := -std=gnu99

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

Beachten Sie, dass ich die gnu99 Standard statt c99 bin mit, da der Linux-Kernel stützt sich stark auf GNU-Erweiterungen.

Sie können nur hinzufügen

CFLAGS=-std=c99

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top