22

Makefileを使用してLinuxカーネルモジュールをコンパイルしようとしています。

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としてコンパイルするにはどうすればよいですか?

4

3 に答える 3

22

モジュールをコンパイルするときにコンパイラフラグを追加する正しい方法は、ccflags-y変数を設定することです。このような:

ccflags-y := -std=gnu99

詳細については、カーネルツリーのDocumentation / kbuild/makefiles.txtを参照してください。

LinuxカーネルはGNU拡張機能に大きく依存しているため、gnu99代わりに標準を使用していることに注意してください。c99

于 2011-04-04T19:53:08.193 に答える
19

あなたはただ追加することができます

CFLAGS=-std=c99

の一番上にmakefile、またはコードをC90に準拠させることができます(LukeNが提案するように)。

于 2011-01-16T02:30:31.790 に答える
-8

makefileとは何の関係もありません。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;
}

これは、makefileではなく、ソースコードでのみ「修正」できます。

このルールはC99で緩和されましたが、私の意見では、変数の定義、宣言、および初期化をその下のコードから分離することをお勧めします:)

したがって、makefileを変更してC99でコンパイルするには、makefileが参照している「build」ディレクトリのMakefileを変更し、ソースファイルをコンパイルする「gcc」行に「-std=c99」を追加する必要があります。

于 2010-05-29T12:42:45.837 に答える