質問

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を追加する必要があることに気付きました。どこに追加されるかわかりません。

C99としてコンパイルするように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が参照している「ビルド」ディレクトリのMakeFileを変更し、ソースファイルをコンパイルする「GCC」ラインに「-Std = C99」を追加する必要があります。

他のヒント

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

ccflags-y := -std=gnu99

見る ドキュメント/kbuild/makefiles.txt 詳細については、カーネルツリーで。

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

追加することができます

CFLAGS=-std=c99

あなたの一番上に makefile, 、または、コードをC90に準拠させることができます(Lukenが示唆するように)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top