2010-05-29 3 views
14

Я пытаюсь скомпилировать модуль ядра Linux с помощью Makefile:Как использовать make и скомпилировать как C99?

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?

+0

Я думал, что C99 был сценарием эксплойта для PHP hehe – RobertPitt

ответ

-6

Это не имеет никакого отношения к 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, но по-моему, это хорошая идея, чтобы отделить переменные определения, заявления и инициализацию из кода под ним :)

Так, чтобы изменить свой Makefile, чтобы сделать его компиляции с C99 , вам необходимо изменить Makefile в каталоге «build», на который ссылается ваш make-файл, и добавить «-std = c99» в строку «gcc», компилируя исходный файл.

+7

CFLAGS гораздо более распространен, предпочтительнее и менее хрупким, чем редактирование каждого вызова компилятора. – 2010-05-29 13:00:49

+4

После долгой жизни в мире OO (Java) и недавнего возвращения к использованию C более изо дня в день, я должен не соглашаться с тем, чтобы отделить переменную информацию. Хранение вещей как можно меньших масштабов представляется более важным. Некоторые переменные потребуются только в течение некоторого времени или, например, для цикла. – powerj1984

+0

@ powerj1984 В этом случае вы можете использовать скобку {}. LukeN правильно, как в *, что будет принято основной линией ядра *. Хорошо ли это во всем, я не буду говорить, и я думаю, что это не то, о чем спрашивал ОП. –

14

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

CFLAGS=-std=c99 

К верхней части вашего makefile, или вы можете сделать код совместимым с C90 (как предполагает LukeN.)

17

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

ccflags-y := -std=gnu99 

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

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

+3

Привет, я добавляю ccflags-y в Makefile для своего собственного модуля, но компилятор все еще предупреждает, что «ISO C90 запрещает смешанные декларации и код». Зачем? – basicthinker

+3

@basicthinker: возможно [это] (http://stackoverflow.com/questions/15910064/how-to-compile-a-linux-kernel-module-using-std-gnu99) помогает –

 Смежные вопросы

  • Нет связанных вопросов^_^