C99として作成してコンパイルする方法は?
質問
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が示唆するように)
所属していません StackOverflow