多个驱动编译成一个模块: 一个模块只能拥有一个初始化和析构接口,即一对module_init和module_exit,如果存在多个接口会导致编译失败。 1.屏蔽hello1.c和hello2.c模块初始化和析构函数 module_init(hello1_init);
//将函数指定为驱动的入口函数 module_exit(hello1_exit); //将函数指定为驱动的出口函数 2.导出函数 EXPORT_SYMBOL(hello1_init); EXPORT_SYMBOL可以将一个函数以符号的方式导出给其他模块使用,跟添加hello.h全局声明类似。 例程源码: hello1.c #include <linux/init.h> #include <linux/module.h> int hello1_init(void){ printk(KERN_ALERT "Hello1 World enter\n"); return 0; } EXPORT_SYMBOL(hello1_init); void hello1_exit(void){ printk(KERN_ALERT "Hello1 World exit\n"); } EXPORT_SYMBOL(hello1_exit); /*module_init(hello1_init); module_exit(hello1_exit);*/ MODULE_DESCRIPTION("A Sample Hello World Module"); MODULE_ALIAS("A Sample module"); hello2.c #include <linux/init.h> #include <linux/module.h> int hello2_init(void){ printk(KERN_ALERT "Hello2 World enter\n"); return 0; } void hello2_exit(void){ printk(KERN_ALERT "Hello2 World exit\n"); } MODULE_DESCRIPTION("A Sample Hello World Module"); MODULE_ALIAS("A Sample module"); hello3.c #include <linux/init.h> #include <linux/module.h> #include "hello1.h" #include "hello2.h" static int hello3_init(void){ hello1_init(); hello2_init(); printk(KERN_ALERT "Hello3 World enter\n"); return 0; } static void hello3_exit(void){ hello1_exit(); hello2_exit(); printk(KERN_ALERT "Hello3 World exit\n"); } module_init(hello3_init); module_exit(hello3_exit); MODULE_DESCRIPTION("A Sample Hello World Module"); MODULE_ALIAS("A Sample module"); 修改Makefile KERNELDIR := /home/forlinx/work/OK8MP-linux-sdk/OK8MP-linux-kernel CURRENT_PATH := $(shell pwd) obj-m += hello.o hello-objs += hello1.o hello2.o hello3.o build: kernel_modules kernel_modules: $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules clean: $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean makeifle作用:将所有目标文件(hello1.o hello2.o hello3.o)链接为一个执行文件 |
|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )
GMT+8, 2024-11-8 14:23
Powered by Discuz! X3.4
© 2001-2013 Comsenz Inc.