编译时出错:linux/module.h:没有这样的文件或目录
error compiling: linux/module.h: No such file or directory
我写了一个简单的模块:
#define __KERNEL__
#define MODULE
#include <linux/kernel.h>
#include <linux/module.h>
int init_module(void)
{
printk("Hello, worldn");
return 0;
}
void cleanup_module(void)
{
printk("Goodbyen");
}
并用以下命令编译它:
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.
首先你需要内核源代码。许多人混淆了用户空间标头和内核空间标头,因为它们中的许多具有相同的文件夹结构。大多数发行版只有用户空间标头,而没有内核空间标头。
通常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, worldn");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel worldn");
}
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
。
您需要内核构建环境(选择脚本、标头和 Makefiles),如果已经安装了内核,通常可以通过/lib/modules/version/build(指向它的符号链接)访问。否则,该目录是构建目录(System.map 所在的目录)。不需要完整的源代码(智能发行版可以识别这一点),/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 已经设置了。
大多数 Linux 发行版默认不安装内核标头。寻找软件包内核标头或类似的东西。
- 读取文件的最后一行并输入到链接列表时出错
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- .h 和.cpp文件分离时出错,但仅使用 .h 文件时没有错误.我做错了什么?
- 在 C/C++ 中打开驻留在 "/sys/" 下的文件时出错
- 在头文件中定义变量不会出错
- 如何在多写入器情况下对文件支持的共享内存中的大页面出错
- JNI,使用两个 .so 文件时出错,其中一个文件需要另一个文件
- 生成文件中隐式规则中的 -c 标志出错
- 编译时出错 - 链接.cpp和头文件
- 从人员矢量插入和读取文件时出错
- LNK2019 在文件中调用静态成员的方法时出错.cpp
- ./main:加载共享库时出错:libopencv_highgui.so.4.0:无法打开共享对象文件:没有这样的文件或
- 猫鼬 - 包含标准C++库文件时出错
- 在f2c.h文件中定义min()max()宏时出错
- ASIOSDK;从hostsample.cpp生成mex文件时出错
- 使用emscripten将c++文件转换为wasm时出错
- 编译后可执行文件出错
- 头文件C++出错
- ftell 非常大的文件出错
- 从磁盘读取映像文件出错