因此,我尝试按照简单示例加载O'Rielly Linux设备驱动程序手册中的“Hello World”设备驱动程序。问题是,除非我在include语句中明确定义头文件的路径,否则它将无法工作。即我必须输入#include </usr/src/kernels/3.19.8-100.fc20.i686+PAE/include/linux/init.h>
而不是#include </linux/init.h>
这是我的makefile
obj-m := hello.o
KDIR =/usr/src/kernels/3.19.8-100.fc20.i686+PAE/include
all:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) clean
并且它会在所有头文件中返回一个找不到错误,除非明确定义为#include </usr/src/kernels/3.19.8-100.fc20.i686+PAE/include/linux/init.h>
,我宁愿不这样做。
感谢您的帮助。
如果它对任何人有帮助,如果我保留显式include语句然后编译,则得到的hello.mod.c文件如下。
#include <linux/module.h>
#include <linux/vermagic.h>
#include <linux/compiler.h>
MODULE_INFO(vermagic, VERMAGIC_STRING);
__visible struct module __this_module
__attribute__((section(".gnu.linkonce.this_module"))) = {
.name = KBUILD_MODNAME,
.init = init_module,
#ifdef CONFIG_MODULE_UNLOAD
.exit = cleanup_module,
#endif
.arch = MODULE_ARCH_INIT,
};
static const char __module_depends[]
__used
__attribute__((section(".modinfo"))) =
"depends=";
使用insmod可以很好地加载。
答案 0 :(得分:2)
KDIR = / usr / src / kernels / 3.19.8-100.fc20.i686 + PAE / include
我认为您的&#34; KDIR系列&#34;是错误的....这个Makefile工作(通常):
obj-m := hello.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
假设# dnf install kernel kernel-devel
→I.e。 kernel-devel
必须与kernel
完全匹配。
注意:/ lib / modules / [version] / { build } /是/usr/src/kernels/[version]/
的链接,不是到/ usr / src / kernels / [version] / include / ....链接是在安装kernel-devel
时创建的
答案 1 :(得分:1)
您的编译器应该有一个选项来指定包含的搜索路径。 GnuCC(gcc
,g++
)和CLang(clang
,clang++
)都使用-I
。
如果您的头文件位于/usr/src/kernels/3.19.8-100/include/linux/init.h
并且您调用了,请说g++
:
g++ -I /usr/src/kernels/3.19.8-100/include/ source.cpp
然后source.cpp
可以#include <linux/init.h>
。
现在,您需要了解如何通过OS makefile为您的编译器提供命令行选项来构建模块。这在几个地方都有记录,但通常是定义一个包含其他选项的环境变量CPPFLAGS
:
$ export CPPFLAGS="-I /usr/src/kernels/3.19.8-100/include/"
$ make
答案 2 :(得分:1)
我找到了答案。感谢YSC指出了我正确的道路。我只需要在这里找到一些额外的东西Where Does GCC Look to Find its Header Files?
基本上,我需要将include目录添加到gcc的header include路径中。我通过输入cpp -I <desired path> -v
来做到这一点,对我来说这是/ usr / src / kernels / .......等。
只运行cpp -v
给了我一个包含gcc搜索路径的列表。只要确保它在那里。
所以现在我的驱动程序模块正确构建并使用#include <linux/init.h>
加载include语句,就像我想要的那样。