加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在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等.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读