错误编译: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 

有什么build议么?

编辑:我用这个commad:

 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. 

Solutions Collecting From Web of "错误编译:linux / module.h:没有这样的文件或目录"

首先你需要内核源码 。 很多人都混淆了用户空间头和内核空间头,因为他们中的许多人都有相同的文件夹结构。 大多数发行版只有用户空间头,而不是内核空间头。

一般 make是用来构建一个内核模块而不是一个裸cc 。 按照这里给出的简单分步说明Hello World内核模块

源文件名是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做文件

首先在你的终端上键入$(uname -r),那么你将得到在你的系统上使用的版本

 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 

你需要内核头文件; 它们通常位于/usr/include/如果已安装)。

除非你使用的是基于源码的发行版,或者建立了自己的内核机会,否则它们并不是默认安装的。 使用你的发行版软件包管理器来安装它们。 该软件包通常被称为linux-headers

如果已经安装了内核,则需要内核构建环境(选择脚本,头文件和Makefile),通常这可以通过/ lib / modules / version / build(一个符号链接)来访问。 否则,目录是build目录(System.map所在的目录)。 完整的源代码是不需要的(聪明的发行版认识到这一点),也不是/ usr / include /不管。

你也必须使用kbuild; 叫cc -I是不够的,已经有十多年了。 你从一个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

__KERNEL__MODULE也是毫无意义的,因为如果需要的话已经由kbuild设置了。

大多数Linux发行版都不安装内核头文件。 寻找一个包内核头文件或类似的东西。