Comment utiliser make et compiler comme C99?
Question
Je suis en train de compiler un module noyau Linux en utilisant 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
Ce qui me donne:
main.c:54: warning: ISO C90 forbids mixed declarations and code
Je dois passer à C99. Après avoir lu, j'ai remarqué que je dois ajouter un drapeau std = c99, pas sûr où il suppose à ajouter.
Comment puis-je modifier le Makefile pour compiler, selon C99?
La solution
Il n'a rien à voir avec le makefile. ISO C90 des variables partout déclarant défend mais au début d'un bloc ou le fichier - comme celui-ci
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;
}
Ainsi, il doit être modifié à cette ...
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;
}
Vous ne pouvez "solution" que dans le code source, et non pas dans le makefile.
Cette règle a été assouplie dans C99, mais à mon avis, il est une bonne idée de séparer les définitions variables, déclarations et initialisations à partir du code en dessous:)
Donc, pour changer votre makefile pour faire compiler avec C99, vous devez modifier le Makefile dans le répertoire « build » que votre makefile fait référence, et ajoutez la ligne « std = c99 » au « gcc » compilation du fichier source.
Autres conseils
La bonne façon d'ajouter des drapeaux du compilateur lors de la compilation des modules est en réglant la variable ccflags-y
. Comme ceci:
ccflags-y := -std=gnu99
Voir Documentation / kbuild / makefiles.txt dans l'arborescence du noyau pour plus d'informations.
Notez que j'utilise la norme gnu99
au lieu de c99
depuis le noyau Linux repose en grande partie sur les extensions GNU.
Vous pouvez simplement ajouter
CFLAGS=-std=c99
Vers le haut de votre makefile
, ou vous pouvez faire le compatible avec le code C90 (comme le suggère Lüken.)