在C中创建静态模块接口
发布时间:2020-12-16 07:22:05 所属栏目:百科 来源:网络整理
导读:我正在尝试在我的C项目中创建一个模块化接口,它允许有选择地构建源文件,并且无需更改任何项目的核心组件即可添加和删除源文件.我已经在网上搜索了一个关于如何做到这一点的方法,却找不到任何东西. 我在这个阶段的猜测,将涉及每个模块的内容,它们有自己的源文
我正在尝试在我的C项目中创建一个模块化接口,它允许有选择地构建源文件,并且无需更改任何项目的核心组件即可添加和删除源文件.我已经在网上搜索了一个关于如何做到这一点的方法,却找不到任何东西.
我在这个阶段的猜测,将涉及每个模块的内容,它们有自己的源文件和头文件(module_1.c,module_1.h,module_2.c,module_2.h等).每个模块可能必须有一个包含指向所需函数的指针的结构,如: struct module_def { char *name; void (*module_init) (void); void (*module_shutdown) (void); }; 我相信核心代码需要访问这些定义结构的数组.我只是不知道如何使用已启用的模块列表自动生成这样的数组(或任何类似的数组),而不需要使用一个混乱的脚本,该脚本在构建过程中创建包含所有结构列表的新源文件. 至少,这就是我认为这应该有效的方式. 最后,我正在寻找一种在C中创建模块化编码接口的方法,它允许在构建期间选择性地链接单独的模块(源文件或目标文件,无关紧要),并由主应用程序调用.这适用于嵌入式解决方案,因此动态加载,共享库等无法工作. 解决方法
使用gcc,你可以使用类似的东西:
(例如在foo_module.c中) struct module_def foo_module { ... }; static void init_module(void) __attribute__ ((constructor)); static void init_module(void) { register_my_module(&foo_module); } 您可以将它放在每个模块文件中,并且应该在初始化时调用init_module函数(即在主代码启动之前清除bss等时). 请注意,这不是可移植的,但可以很好地与许多嵌入式平台配合使用,例如:与avr-gcc等. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |