Wie machen, um zu verwenden und als C99 kompilieren?
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?
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.)