English 中文(简体)
如何安排Makefile以编译带有多个 .c 文件的内核模块?
原标题:
  • 时间:2008-12-08 15:06:17
  •  标签:

如何编写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
问题回答

在我的情况下,该项目由6个文件组成:

  • monter_main.c, monter_main.h
  • monter_cdev.c, monter_cdev.h
  • monter_pci.c, monter_pci.h

monter_main.c是我的模块的主文件。

请记住,除非您在一个文件中拥有所有的代码,否则您不应该有与您尝试构建的模块相同的文件名(例如monter.cmonter.ko)。

这是我的Makefiles:

  • 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:Kbuild

    obj-m := monter.o
    monter-objs := monter_main.o monter_cdev.o monter_pci.o
    

我会假设在第二行列出更多的对象文件就可以解决问题。

$(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




相关问题
热门标签