如何安排Makefile来编译具有多个.c文件的内核模块?

发布于 2024-07-09 07:48:00 字数 834 浏览 11 评论 0原文

如何安排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

How to arrange a Makefile to compile a kernel module with multiple .c files?

Here is my current Makefile. It was auto generated by 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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

匿名。 2024-07-16 07:48:01

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

The dependencies for $(TARGET).o can be multiple object files, one for each source file in your driver. Many other drivers use the += operator after the initial declaration of OBJS. For example,

OBJS = nlb-driver.o
OBJS += file1.o
OBJS += file2.o
...

The target rule would then expand to be

$(TARGET).o: nlb-driver.o file1.o file2.o
    $(LD) $(LD_RFLAG) -r -o $@ $(OBJS)

This is nice if there are more source files than comfortably fit on a line. But if there are only a small number of files, you can also define all the objects on a single line

OBJS = nlb-driver.o file1.o file2.o
今天小雨转甜 2024-07-16 07:48:00

就我而言,该项目由 6 个文件组成:

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

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

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

这是我的 Makefile:

  • Makefile

    KDIR ?= /lib/modules/`uname -r`/build 
    
      默认: 
          $(MAKE) -C $(KDIR) M=$PWD 
    
      安装: 
          $(MAKE) -C $(KDIR) M=$PWD module_install 
    
      干净的: 
          $(MAKE) -C $(KDIR) M=$PWD 干净 
      
  • Kbuild

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

In my case the project consists of 6 files:

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

monter_main.c is the main file of my module.

Remember that you shouldn't have a file with the same name as the module you're trying to build (e.g. monter.c and monter.ko) unless you've got all code in that one file.

Here are my 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

    obj-m := monter.o
    monter-objs := monter_main.o monter_cdev.o monter_pci.o
    
神魇的王 2024-07-16 07:48:00

我认为只需在第二行中列出更多目标文件就可以解决问题。

I would assume that just listing more object files in the second line would do the trick.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文