编译内核模块linux / module.h时出错:找不到这样的文件或目录

时间:2015-05-04 01:38:13

标签: c linux makefile linux-kernel kernel-module

我使用一个简单的例子来创建一个Hello World内核模块。下方链接: http://www.thegeekstuff.com/2013/07/write-linux-kernel-module/

尝试在与hello.c相同的目录中使用“make hello”运行makefile时。我收到以下错误:

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的类似帖子给了我希望,但我不确定我是否在makefile中使用了正确的-I dir语法。 http://www.reddit.com/r/linux4noobs/comments/2o4u1r/linuxmoduleh_no_such_file_or_directory_found_help/

这里的任何帮助都将非常感谢!谢谢!

我正在使用Linux版本3.13.51运行Xubuntu 14.04。 kmod安装。

EDIT1:更多信息 这是makefile:

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

2 个答案:

答案 0 :(得分:1)

我使用这个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'

答案 1 :(得分:1)

好的,我想通了,现在我觉得很傻......

我正在运行$ make,但我收到了错误

  

make:没有什么可以为'all'。

我认为这意味着我没有正确调用make所以我开始调用$ make hello来"尝试制作模块"这就是混乱开始的地方,因为尝试使这样的文件没有在我的系统上运行正确的make文件。

相反,真正的解决方案是编辑Makefile以在构建调用之前取出空格并用制表符替换它们。这完全解决了我的问题,我能够毫不费力地构建。