Как использовать make и скомпилировать как C99? - PullRequest
18 голосов
/ 29 мая 2010

Я пытаюсь скомпилировать модуль ядра 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 ]

18 голосов
/ 04 апреля 2011

Правильный способ добавить флаги компилятора при компиляции модулей - установить переменную ccflags-y. Как это:

ccflags-y := -std=gnu99

См. Documentation / kbuild / makefiles.txt в дереве ядра для получения дополнительной информации.

Обратите внимание, что я использую стандарт gnu99 вместо c99, поскольку ядро ​​Linux в значительной степени зависит от расширений GNU.

14 голосов
/ 16 января 2011

Вы можете просто добавить

CFLAGS=-std=c99

В начало вашего makefile, или вы можете сделать код совместимым с C90 (как рекомендует LukeN)

0 голосов
/ 29 мая 2010

Это не имеет ничего общего с 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», компилируя исходный файл.

...