在Fedora 20中查找简单设备驱动程序的头文件

时间:2018-05-09 12:46:04

标签: c++ linux linux-device-driver fedora

因此,我尝试按照简单示例加载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可以很好地加载。

3 个答案:

答案 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(gccg++)和CLang(clangclang++)都使用-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语句,就像我想要的那样。