`
cloverprince
  • 浏览: 130588 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

插件问题回答第1题 另解

阅读更多
问题贴:http://cloverprince.iteye.com/blog/481307

引用
1. 现有一个主程序用C语言写成。现在要允许第三方开发人员编写扩展的模块,约定第三方开发的模块必须提供一系列已知名称的函数(如 foo(),bar(),baz())。如果要求第三方的模块必须与主程序的二进制代码分开发布,把dll或so丢在某个文件夹内即可被动态装载并使用,应如何实现?



回答:

除了用操作系统提供的接口外,还可以用Glib的简单封装。GLib简单封装了操作系统相关的动态库装载函数,位于GModule中。GModule相当于Library Handle,而g_module_open, g_module_symbol和g_module_close分别对应dlopen, dlsym和dlclose函数。


实现:

接口、动态库同原解 http://cloverprince.iteye.com/blog/481309 ,新的主程序如下:
#include <stdio.h>
#include <stdlib.h>

#include <glib.h>
#include <glib/gstdio.h>
#include <gmodule.h>

#include "plugin-interface.h"

const char * const PLUGINS_PATH = "plugins";

int main(int argc, char** argv) {
    GDir *dir;
    const gchar *filename;

    dir = g_dir_open(PLUGINS_PATH,0,NULL);

    while(filename=g_dir_read_name(dir)) {
        GModule *module;
        char *path;

        InitModuleFunc init_func;
        PluginInterface iface;

        printf("Openning %s ...\n",filename);

        path = g_strdup_printf("%s/%s",PLUGINS_PATH,filename);

        module = g_module_open(path,G_MODULE_BIND_LAZY);
        g_module_symbol(module,"init_module",(void**)(&init_func));
        init_func(&iface);

        iface.hello();
        iface.greet("wks");

        g_module_close(module);

        g_free(path);
    }

    g_dir_close(dir);

    return 0;
}



编译:
GLib程序的编译可以利用pkg-config辅助设置编译参数
引用
gcc $(pkg-config --cflags --libs glib-2.0 gmodule-2.0) -o main main.c



执行结果略。
分享到:
评论

相关推荐

    2015-16-2《高等数学》(经管类)期末考试试卷1

    - 第1题要求计算一个闭区域内的二重积分。 - 第2题涉及到隐函数求导和偏导数的计算。 - 第3题是求函数的极值点以及判断是极大值还是极小值,需要用到偏导数和二阶偏导数测试。 - 第4题是旋转体的体积计算,需要...

    第10章重积分自测1

    解答题部分,第一题求半球体在特定圆柱内的体积,需要用到三重积分的知识。第二题要求计算锥面被柱面截取部分的曲面面积,可能需要结合积分和微分方程来解。第三题是二重积分的直接计算,注意积分区域的定义。第四题...

    android面试题.rar

    "android面试题.rar"这个压缩包很可能包含了关于Android开发的常见面试问题和解答,旨在帮助求职者准备面试。以下是根据标题和描述推测出的一些可能涉及的Android面试知识点,以及相关的详细解释: 1. **Android...

    C语言课后习题答案包含大量源代码和题目及答案.zip

    这些是编程的基础,理解并熟练掌握它们是学习C语言的第一步。在这个压缩包中,你可能会找到关于这些基础知识的习题,以及对应的源代码实现,有助于你通过实践来加深理解。 其次,C语言的指针特性是其强大之处,也是...

    第十一届蓝桥杯大赛软件赛决赛_CB1

    总结来说,第十一届蓝桥杯大赛软件赛决赛_CB1是一个全面考查参赛者编程能力、算法设计能力以及问题解决能力的比赛。对于未来希望投身于软件开发和计算机科学领域的学生而言,这不仅仅是一场竞技的盛会,更是一个学习...

    PyPI 官网下载 | kolibri_exercise_perseus_plugin-0.9.3.tar.gz

    Kolibri Exercise Perseus Plugin是Kolibri中的一个重要组件,它引入了Perseus,一个强大的交互式学习工具,使得创建和解答数学、科学等学科的练习变得更加直观和动态。 Perseus是一个开源项目,由Khan Academy开发...

    第9章多元函数自测-参考答案1

    在解答题中,求解法线方程需要先求出函数在指定点的梯度向量,梯度向量给出了曲面在该点处增长最快的方向,而法线方向则是与梯度向量垂直的方向。因此,法线方程与多元函数的几何性质密切相关,它反映了函数的局部...

    NIIT在线考试SM3-MT1,最新的

    3. **SM3-MT1**:这是一个特定的课程或考试模块,SM3可能是课程系列中的第三阶段,而MT1可能代表该阶段的第一个模块或考试。具体的课程内容可能涵盖软件开发、项目管理、网络技术、数据库管理等IT领域的某一专题。 ...

Global site tag (gtag.js) - Google Analytics