如何安排Makefile编译带有多个.c文件的内核模块?
这是我当前的Makefile。它由KDevelop
自动生成TARGET = nlb-driver
OBJS = nlb-driver.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) M=$(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
make -C $(KDIR) M=$(PWD) clean
-include $(KDIR)/Rules.make
答案 0 :(得分:4)
我认为只是在第二行列出更多的目标文件就可以了。
答案 1 :(得分:3)
$(TARGET).o的依赖项可以是多个目标文件,一个用于驱动程序中的每个源文件。在初始声明OBJS之后,许多其他驱动程序使用+ =运算符。例如,
OBJS = nlb-driver.o
OBJS += file1.o
OBJS += file2.o
...
目标规则将扩展为
$(TARGET).o: nlb-driver.o file1.o file2.o
$(LD) $(LD_RFLAG) -r -o $@ $(OBJS)
如果有更多的源文件比在线上舒适,那么这很好。但是,如果只有少量文件,您还可以在一行中定义所有对象
OBJS = nlb-driver.o file1.o file2.o
答案 2 :(得分:1)
在我的情况下,该项目包含6个文件:
monter_main.c
,monter_main.h
monter_cdev.c
,monter_cdev.h
monter_pci.c
,monter_pci.h
monter_main.c
是我模块的主要文件。
请记住,除非您在该文件中包含所有代码,否则您不应该拥有与您尝试构建的模块同名的文件(例如monter.c
和monter.ko
)
这是我的Makefile:
<强>生成文件强>
KDIR ?= /lib/modules/`uname -r`/build
default:
$(MAKE) -C $(KDIR) M=$$PWD
install:
$(MAKE) -C $(KDIR) M=$$PWD modules_install
clean:
$(MAKE) -C $(KDIR) M=$$PWD clean
<强>的kbuild 强>
obj-m := monter.o
monter-objs := monter_main.o monter_cdev.o monter_pci.o