
Ubuntu日本語フォーラム

ログインしていません。
学習のため、Ubuntu9.04で簡単なデバイスドライバ作成サンプルをコンパイルしましたが、"hello.c"のコンパイルが通りません。 参考にしたサンプルソースは、webページの「How to: Compile Linux kernel modules」です。
make hello とタイプすると、インクルードパスにファイルがないと叱られてしまいます。
最初のエラー出力:
error: linux/module.h: No such file or directory
標準のインクルードパスは/usr/include/linuxだと思いますが、ここにmodule.hはありません。 でも、/usr/srcにはカレントバージョン用のlinux-headers-2.6.28-17-genericがあります。 そのなかの、include/linuxにはmodule.hがあります。 インクルードパスがここに届いていないのが原因のようです。
Makefileの内容は下記のとおりです。
obj-m = hello.o
KVERSION = $(shell uname -r)
all:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean
makeの中からmakeしているので、このMakefileの本体が/lib/modules/2.6.28-17-generic/build/にあるのは確認しました。
このMakefileの中で、先ほどのインクルードパスの設定を指定しているのだと思いますが、どこをいじればよいのかわかりません。
/usr/include/linuxをカレントバージョンのソースで上書きすればコンパイルが通る気もしますが、後戻りできなさそうで躊躇しています。
皆さんの環境ではいかがでしょうか、なにかアドバイスをよろしくお願いします。
オフライン
1点だけ。
/usr/include/linuxをカレントバージョンのソースで上書きすればコンパイルが通る気もしますが、後戻りできなさそうで躊躇しています。
カーネルやモジュールの構築にのみ必要なヘッダーファイルは、/usr/includeの下には移されません。もともとインストールした場所である、/usr/src/linux-headers-2.6.31-14-generic/include/linux といったような場所のまま利用されます(カーネルのバージョン番号は個々の環境で異なる可能性があります)。移動してしまうと、予期せぬ問題が発生する可能性がありますから、行わないよう注意してください。
この辺の必要なパスをかき集めて指定するのは、buildというmakefileがうまく扱ってくれている・・・と思うのですが、中を見たことが無いので詳細は不明です。
もし、実際に実行されていると思われる、コンパイラのコマンド(cc なんたら か、gcc なんたら の、長い行全て)を見ることで、インクルードファイルのパスの指定がどうなっているのか(抜けているとか、存在しないパスを刺しているとか)、わかるかもしれません。
オフライン
weykさん、すばやい回答ありがとうございます。
じつは、いろいろ試しているうちに解決しました。
原因は2つありました。
(1)Makefileの内容をwebからコピペしたため、TABではなくスペースでインデントしていた。
(2)make の実行で、引数 hello は必要なかった。(makeだけでよい。)
(1)が最大の要因でしたが、わけも分からず引数helloで実行したため、とんちんかんなエラーが出てしまったようです。
下記がコンパイルの出力メッセージです。
$ make
make -C /lib/modules/2.6.28-17-generic/build M=/home/my/gcc/mod-1 modules
make[1]: ディレクトリ `/usr/src/linux-headers-2.6.28-17-generic' に入ります
CC [M] /home/my/gcc/mod-1/hello.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/my/gcc/mod-1/hello.mod.o
LD [M] /home/my/gcc/mod-1/hello.ko
make[1]: ディレクトリ `/usr/src/linux-headers-2.6.2
原因が判るまで、いろんなものを apt-get してしまい、ディスクスペースを狭くしてしまいました。
オフライン