编译内核模块 linux/module.h 时出错:找不到此类文件或目录
Error compiling kernel module linux/module.h: No such file or directory found
我正在使用一个简单的示例来创建一个 Hello World 内核模块。 Link 下面:
http://www.thegeekstuff.com/2013/07/write-linux-kernel-module/
当尝试 运行 使用与 hello.c 相同的目录中的 "make hello" 生成文件时。我收到以下错误:
hello.c:1:64: fatal error: linux/module.h: No such file or directory
我已经成功安装了 linux 个头文件:
$ sudo apt-get install linux-headers-$(uname -r)
$ sudo apt-get install linux-source
我什至可以导航到 /usr/src/linux-headers-3.13.0-51/include/linux/module.h
中的正确文件,但同样的错误仍然存在。
reddit 上的类似 post 给了我希望,但我不确定我是否在 makefile 中使用了正确的 -I dir 语法。
http://www.reddit.com/r/linux4noobs/comments/2o4u1r/linuxmoduleh_no_such_file_or_directory_found_help/
如有任何帮助,我们将不胜感激!谢谢!
我运行宁 Xubuntu 14.04 linux 版本 3.13.51。安装了 kmod。
编辑 1:更多信息
这是生成文件:
obj-m += hello.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
我使用这个 Makefile:
TARGET = hello
OBJS = hello.o
MDIR = drivers/misc
EXTRA_CFLAGS = -DEXPORT_SYMTAB
CURRENT = $(shell uname -r)
KDIR = /lib/modules/$(CURRENT)/build
PWD = $(shell pwd)
DEST = /lib/modules/$(CURRENT)/kernel/$(MDIR)
obj-m := $(TARGET).o
default:
make -C $(KDIR) SUBDIRS=$(PWD) modules
$(TARGET).o: $(OBJS)
$(LD) $(LD_RFLAG) -r -o $@ $(OBJS)
ifneq (,$(findstring 2.4.,$(CURRENT)))
install:
su -c "cp -v $(TARGET).o $(DEST) && /sbin/depmod -a"
else
install:
su -c "cp -v $(TARGET).ko $(DEST) && /sbin/depmod -a"
endif
clean:
-rm -f *.o *.ko .*.cmd .*.flags *.mod.c
-include $(KDIR)/Rules.make
我将它用于 3.2 内核。我认为关键是最后一行,其中一些内核相关的规则被添加到Makefile中。
root@devmachine:~/hello# make
make -C /lib/modules/3.2.0-4-amd64/build SUBDIRS=/root/hello modules
make[1]: Entering directory '/usr/src/linux-headers-3.2.0-4-amd64'
Makefile:10: *** mixed implicit and normal rules: deprecated syntax
CC [M] /root/hello/hello.o
/root/hello/hello.c: In function 'init_driver':
/root/hello/hello.c:25:18: warning: initialization makes pointer from integer without a cast [enabled by default]
Building modules, stage 2.
MODPOST 1 modules
CC /root/hello/hello.mod.o
LD [M] /root/hello/hello.ko
make[1]: Leaving directory '/usr/src/linux-headers-3.2.0-4-amd64'
好吧,我明白了,现在我觉得很傻...
我是 运行 $ make
但我遇到了错误
make: Nothing to be done for `all'.
我认为这意味着我没有正确地调用 make 所以我开始调用 $ make hello
到 "attempt to make the module" 这就是混乱开始的地方,因为尝试像这样制作文件不是 运行 我系统上正确的 make 文件。
相反,真正的解决方案是编辑 Makefile 以在构建调用之前删除空格并将其替换为制表符。这完全解决了我的问题,我能够顺利构建。
我正在使用一个简单的示例来创建一个 Hello World 内核模块。 Link 下面: http://www.thegeekstuff.com/2013/07/write-linux-kernel-module/
当尝试 运行 使用与 hello.c 相同的目录中的 "make hello" 生成文件时。我收到以下错误:
hello.c:1:64: fatal error: linux/module.h: No such file or directory
我已经成功安装了 linux 个头文件:
$ sudo apt-get install linux-headers-$(uname -r)
$ sudo apt-get install linux-source
我什至可以导航到 /usr/src/linux-headers-3.13.0-51/include/linux/module.h
中的正确文件,但同样的错误仍然存在。
reddit 上的类似 post 给了我希望,但我不确定我是否在 makefile 中使用了正确的 -I dir 语法。 http://www.reddit.com/r/linux4noobs/comments/2o4u1r/linuxmoduleh_no_such_file_or_directory_found_help/
如有任何帮助,我们将不胜感激!谢谢!
我运行宁 Xubuntu 14.04 linux 版本 3.13.51。安装了 kmod。
编辑 1:更多信息 这是生成文件:
obj-m += hello.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
我使用这个 Makefile:
TARGET = hello
OBJS = hello.o
MDIR = drivers/misc
EXTRA_CFLAGS = -DEXPORT_SYMTAB
CURRENT = $(shell uname -r)
KDIR = /lib/modules/$(CURRENT)/build
PWD = $(shell pwd)
DEST = /lib/modules/$(CURRENT)/kernel/$(MDIR)
obj-m := $(TARGET).o
default:
make -C $(KDIR) SUBDIRS=$(PWD) modules
$(TARGET).o: $(OBJS)
$(LD) $(LD_RFLAG) -r -o $@ $(OBJS)
ifneq (,$(findstring 2.4.,$(CURRENT)))
install:
su -c "cp -v $(TARGET).o $(DEST) && /sbin/depmod -a"
else
install:
su -c "cp -v $(TARGET).ko $(DEST) && /sbin/depmod -a"
endif
clean:
-rm -f *.o *.ko .*.cmd .*.flags *.mod.c
-include $(KDIR)/Rules.make
我将它用于 3.2 内核。我认为关键是最后一行,其中一些内核相关的规则被添加到Makefile中。
root@devmachine:~/hello# make
make -C /lib/modules/3.2.0-4-amd64/build SUBDIRS=/root/hello modules
make[1]: Entering directory '/usr/src/linux-headers-3.2.0-4-amd64'
Makefile:10: *** mixed implicit and normal rules: deprecated syntax
CC [M] /root/hello/hello.o
/root/hello/hello.c: In function 'init_driver':
/root/hello/hello.c:25:18: warning: initialization makes pointer from integer without a cast [enabled by default]
Building modules, stage 2.
MODPOST 1 modules
CC /root/hello/hello.mod.o
LD [M] /root/hello/hello.ko
make[1]: Leaving directory '/usr/src/linux-headers-3.2.0-4-amd64'
好吧,我明白了,现在我觉得很傻...
我是 运行 $ make
但我遇到了错误
make: Nothing to be done for `all'.
我认为这意味着我没有正确地调用 make 所以我开始调用 $ make hello
到 "attempt to make the module" 这就是混乱开始的地方,因为尝试像这样制作文件不是 运行 我系统上正确的 make 文件。
相反,真正的解决方案是编辑 Makefile 以在构建调用之前删除空格并将其替换为制表符。这完全解决了我的问题,我能够顺利构建。