web-dev-qa-db-ja.com

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

私は簡単なモジュールを書きました:

#define __KERNEL__
#define MODULE
#include <linux/kernel.h> 
#include <linux/module.h>

int init_module(void)
{
    printk("Hello, world\n");
    return 0;
}

void cleanup_module(void)
{
    printk("Goodbye\n");
}

次のコマンドでコンパイルします:

cc -c hello.c

しかし、私はこのエラーを受け取っています:

 linux/module.h: No such file or directory

助言がありますか?

編集:私はこれをコンマで使用しました:

cc -I/usr/src/linux-headers-3.0.0-17-generic/include -c hello.c

そしてそれは一歩先に進みます、今私はこのエラーを受け取ります:

In file included from /usr/src/linux-headers-3.0.0-17-generic/include/linux/kernel.h:13:0,
                 from hello.c:3:
/usr/src/linux-headers-3.0.0-17-generic/include/linux/linkage.h:5:25: fatal error: asm/linkage.h: No such file or directory
compilation terminated.
12
Uzair Farooq

カーネルソースが最初に必要です。ユーザースペースヘッダーとカーネルスペースヘッダーの多くは同じフォルダー構造を持っているため、多くのものが混乱しています。ほとんどのディストリビューションにはユーザー空間のヘッダーのみがあり、カーネル空間のヘッダーはありません。

そしてgeneralallymakeは、カーネルモジュールの構築に使用され、裸のccではありません。簡単なステップバイステップの説明に従ってくださいHello Worldカーネルモジュールを指定 ここ

10
Pavan Manjunath

ソースファイル名はbasic.cです

#include <linux/init.h>
#include <linux/module.h>
/*MODULE_LICENSE("Dual BSD/GPL");*/
static int hello_init(void)
{
    printk(KERN_ALERT "Hello, world\n");
    return 0;
}
static void hello_exit(void)
{
    printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);

=====================================

今ubuntu用のファイルを作ります

最初にur端末で$(uname -r)と入力すると、uはバージョンを取得します。urシステムで使用しているバージョンです。

obj-m +=basic.o

KDIR =//usr/src/linux-headers-3.13.0-44-generic

all:
 $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
 rm -rf *.o *.ko *.mod.* *.symvers *.order

================================================

コードを実行するには

$Sudo insmod basic.ko
$dmesg
u will get the output
$Sudo rmmod basic.ko
$dmesg
4
Sudip Das

カーネルヘッダーが必要です。インストールされている場合、それらは通常/usr/include/にあります。

ソースベースのディストリビューションを使用しているか、独自のカーネルを構築していない限り、デフォルトではインストールされません。それらをインストールするには、ディストリビューションのパッケージマネージャーを使用します。パッケージはしばしばlinux-headersと呼ばれます。

3
ThiefMaster

カーネルビルド環境(スクリプト、ヘッダー、Makefileの選択)が必要です。カーネルが既にインストールされている場合は、通常、/ lib/modules/version/build(それにシンボリックリンク)でアクセスできます。それ以外の場合、ディレクトリはビルドディレクトリ(System.mapがあるディレクトリ)です。完全なソースはnotが必要であり(スマートディストリビューションはこれを認識します)、どちらも/ usr/include/whateverではありません。

あなたも必須 kbuildを使用します。 cc -Iを呼び出すだけでは不十分で、10年以上経っていません。 Kbuildファイルから始めます。

obj-m += mymodule.o

Makefile

kdir=/lib/modules/$(Shell uname -r)/build
all:
        make -C ${kdir} M=$$PWD
modules_install clean:
        make -C ${kdir} M=$$PWD $@

次にmakeを利用します。

#defining __KERNEL__およびMODULEも無意味です。これは、必要に応じてkbuildによってすでに設定されているためです。

3
jørgensen

ほとんどのLinuxディストリビューションは、デフォルトでカーネルヘッダーをインストールしません。カーネルヘッダーなどのパッケージを探します。

2
hburde