无法编译包含<linux leds.h =“”>的C程序

时间:2015-08-21 09:50:13

标签: linux gcc compilation kernel

我正在尝试使用 linux / leds.h

编译我的led包装函数程序文件

使用包含内核空间头文件 gcc -I /usr/src/linux-headers-3.13.0-44-generic/include/ example.c

通过编译它使控制台充斥着许多头文件中的错误,这些文件依赖于leds.h.任何人都可以帮我编译这个在用户空间中使用内核空间头文件的C文件。

提前致谢。 :)

2 个答案:

答案 0 :(得分:2)

这不会奏效。

首先,除了在内核编译后为用户空间提供的(已处理的?)之外,在用户模式程序中使用内核模式头。内核模式头文件取决于内核构建系统的工作。

我试过这个,只是为了好奇,虽然我已经知道为什么它不会工作(tl; dr,我使用Ubuntu修补的3.13.0-24内核):

$ cd /usr/src/linux-headers-3.13.0-24/
$ echo '#include <linux/leds.h>' | gcc -E -x c -o - - -Iinclude

预处理器声称缺少<asm/linkage.h>,如果我错了,请纠正我,该标头是由内核构建系统生成的。

如果需要,可以通过创建使用<linux/leds.h> 的内核模块来解决此问题,然后通过模块导出用户空间API(通常通过/proc完成或/sys)并使用该API来实现用户模式代码的逻辑。

希望这有帮助!

答案 1 :(得分:0)

感谢KemyLand,你是对的,我们不能在用户空间中使用内核空间头文件。但是你的方法对我不起作用。首先它要求asm / linkage.h,我明确地包含了它的路径但是再次编译在另一个头文件上终止并且我做了同样的事情。但最后我阻止了头文件中的一些错误,这是不期望的,因为我没有对这些文件进行任何更改。但最后我得到了解决方案。基本上我们必须在内核空间和硬件设备之间进行接口功能。我必须为它生成make文件。 obj-m:= file_name.o 并通过以下命令编译它 make -C /usr/src/linux-headers-3.13.0-44-generic/ -C / usr / include / M = pwd个模块它生成了4个文件file_name.mod.o,file_name.o,file_name.ko,file_name.mod.c。然后通过 insmod file_name.ko 以root身份加载模块。用于检查加载的模块类型命令 lsmod 。我也可以通过输入命令insmod ./file_name.o来执行它,或者可以通过 rmmod file_name

删除它
相关问题