多个源文件编译成一个模块注意Makefile 书写
多个源文件编译成一个模块不正确的Makefile 会使printk 不能输出信息。细细观测发现是对Makefile 语法未深刻理解所致。 下面附上一例说明问题。简单的测试文件1[roothjj/home/samba/printk]# cat print.c#includelinux/module.hintmod_entry(void){printk(hello entry\n);return0;}voidmod_exit(void){printk(leave the program\n);}module_init(mod_entry);module_exit(mod_exit);MODULE_LICENSE(GPL);简单的测试文件2[roothjj/home/samba/printk]# cat abc.c--------------------------------------------------------------------------------#includelinux/kernel.hvoiddummy(void){}错误的Makefile. 这样虽然生成了print.ko,但是只连接了abc.o 而丢失了print.o, 当然连接了print.mod.o, 可用make V1 观察[roothjj/home/samba/printk]# cat Makefileifneq($(KERNELRELEASE),)obj-m:print.o print-objs:abc.oelsePWD$(shell pwd)KVER$(shell uname-r)KDIR/lib/modules/$(KVER)/build all:make-C $(KDIR)M$(PWD)clean:rm*.o*.ko modules.*endif正确的 Makefile. 生成了myprint.ko, 连接了print.o abc.o 两个目标文件[roothjj/home/samba/printk]# cat Makefileifneq($(KERNELRELEASE),)obj-m:myprint.o myprint-objs:print.o abc.oelsePWD$(shell pwd)KVER$(shell uname-r)KDIR/lib/modules/$(KVER)/build all:make-C $(KDIR)M$(PWD)clean:rm*.o*.ko modules.*endif至此问题已完全解决。 不过也花费了我不少时间结论obj-m(或-y) 说明要生成的模块名是什么就是所谓的.ko文件的名称模块名-objs(或-y)说明这个模块由哪些.o 文件连接而成