9

複数の .c ファイルでカーネル モジュールをコンパイルするための Makefile の配置方法は?

これが私の現在の 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
4

3 に答える 3

4

2 行目にさらに多くのオブジェクト ファイルをリストするだけでうまくいくと思います。

于 2008-12-08T15:12:15.837 に答える
3

$(TARGET).o の依存関係は、ドライバーの各ソース ファイルに 1 つずつ、複数のオブジェクト ファイルにすることができます。他の多くのドライバーは、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)

これは、1 行に収まりきらないほど多くのソース ファイルがある場合に便利です。ただし、ファイルの数が少ない場合は、すべてのオブジェクトを 1 行で定義することもできます。

OBJS = nlb-driver.o file1.o file2.o
于 2008-12-08T16:03:40.960 に答える