Я пытаюсь скомпилировать модуль ядра Linux с помощью Make-файла:
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
Который дает мне:
main.c:54: warning: ISO C90 forbids mixed declarations and code
Я должен переключиться на C99. После чтения я заметил, что должен добавить флаг-std=c99, не уверенный, где оно предполагает, чтобы быть добавленным.
Как я изменяю Make-файл, таким образом, он скомпилирует как C99?
Это не имеет ничего общего с make-файлом. ISO C90 запрещает объявлять переменные где угодно, кроме начала блока или файла - вот так
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;
}
Таким образом, это должно быть изменено на это ...
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;
}
Вы можете «исправить» это только в исходном коде, а не в make-файл.
Это правило было ослаблено в C99, но, на мой взгляд, было бы неплохо отделить определения переменных, объявления и инициализации от кода ниже:)
Итак, чтобы изменить свой make-файл, чтобы он скомпилировался с C99, вы необходимо изменить Makefile в каталоге «build», на который ссылается ваш make-файл, и добавить «-std = c99» в строку «gcc», компилирующую исходный файл.