web-dev-qa-db-ja.com

linux / module.h:そのようなファイルまたはディレクトリはありません

私は初心者で、Linuxでのカーネルプログラミングの基本をいくつか試しています。今日の朝、VIMでmodule.hファイルを開き、変更も保存せずに閉じました。その後、私はコードをコンパイルできません。次のエラーメッセージが表示される

[root@localhost helloworld]# cc helloworld.c
helloworld.c:1:25: error: linux/module.h: No such file or directory
[root@localhost helloworld]# 

以下は、最終日まで正常に実行されていたサンプルコードです。

#include<linux/module.h>
#include<linux/kernel.h>

int init_module(void)
{
        printk("HELLO WORLD");
        return 0;
}

void cleanup_module(void)
{
        printk("GOODBYE");
}

私は次のようにmodule.hファイルを検索しましたが、存在します

[root@localhost usr]# find . -name module.h
./src/kernels/2.6.18-194.el5-i686/include/asm-x86_64/module.h
./src/kernels/2.6.18-194.el5-i686/include/asm-i386/module.h
./src/kernels/2.6.18-194.el5-i686/include/linux/module.h
./include/sepol/policydb/module.h
./include/sepol/module.h
./include/kde/kunittest/module.h
[root@localhost usr]# 

私を助けてください。仮想ボックスでCentOSを使用しています。

18
ajishalfred

周囲のkbuildフレームワークを含まないプレーンなgccでモジュールをコンパイルしようとしています。あなたはこのアプローチで過去に何かを働かせたかもしれませんが、pure-kbuild Makefileアプローチ以外のものを使用してモジュールを維持しようとするのはpainfulひどいです。私はkbuildとの戦いで人生の多くを無駄にしてきました。同じことがあなたに起こってほしくありません-kbuildを受け入れて、あなたがあなたのモジュールを構築するのを手伝ってください。別のコード行を書く前にDocumentation/kbuild/modules.txtを読んでください。

あなたがする必要があるのはあなたのモジュールのためのMakefileを作成することです。その内容は次のようになります。

ifneq ($(KERNELRELEASE),)
# kbuild part of makefile
obj-m  := modulename.o

else
# normal makefile
    KDIR ?= /lib/modules/`uname -r`/build

default:
$(MAKE) -C $(KDIR) M=$$PWD

endif

慣れているほとんどのMakefilesよりもはるかに複雑であることは知っていますが、これには2つの目的があります。ディレクトリでmakeを実行すると、makeが再起動され、現在実行中のカーネルからkbuildメカニズムが使用されます(少なくとも/lib/modules/.../buildから正しいリンクへのシンボリックリンクがあると想定されます)。ロケーション)。

再度呼び出されたmakeコマンド($(MAKE))は、モジュールを適切にビルドし、これまで以上に時間を節約します。 (本当に。)

この作業を行う間、Documentation/kbuild/modules.txtを傍らに置いてください。

注:Documentation/kbuild/modules.txtは、Linuxシステムの/usr/share/linux-headers-$(uname -r)/Documentation/kbuild/modules.txtで利用できる場合があります

25
sarnold

Kernel-develパッケージをインストールします。

yum install kernel-devel

その後、次のものが必要です。

/usr/src/kernels/$kernelversion/include/linux/module.h

その後、次のようなものを渡すことができます:

-I/usr/src/kernels/$(uname -r)/include

コンパイラーへ

6
duncan

モジュールをコンパイルするためにMakefileが必要な場合があります。パーソナルコンピュータ(Ubuntu 10.04.4)で試してみましたが、gcc -c hello.cを使用しても同じ問題が発生しますが、Makefileを使用すると、すべて問題ありません。カーネルバージョンは2.6.32-54-genericです

0
njuzwr