Как использовать make и скомпилировать как C99?
Я пытаюсь скомпилировать модуль ядра Linux, используя 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
Что дает мне:
main.c:54: warning: ISO C90 forbids mixed declarations and code
Мне нужно переключиться на C99. После прочтения я заметил, что мне нужно добавить флаг -std = c99, но я не уверен, где он будет добавлен.
Как мне изменить Makefile, чтобы он компилировался как C99?
3 ответа
Это не имеет ничего общего с 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, вам нужно изменить Make-файл в каталоге "build", на который ссылается ваш make-файл, и добавить "-std=c99" в строку "gcc", компилирующую исходный файл.
Правильный способ добавить флаги компилятора при компиляции модулей - это установить ccflags-y
переменная. Как это:
ccflags-y := -std=gnu99
См. http://lxr.free-electrons.com/source/Documentation/kbuild/makefiles.txt в дереве ядра для получения дополнительной информации.
Обратите внимание, что я использую gnu99
стандарт вместо c99
поскольку ядро Linux сильно зависит от расширений GNU.
Вы можете просто добавить
CFLAGS=-std=c99
К вершине вашего makefile
или вы можете сделать код совместимым с C90 (как рекомендует LukeN).