转自:http://cloverprince.iteye.com/blog/481309

现有一个主程序用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,,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 ;
}

编译:
GLib程序的编译可以利用pkg-config辅助设置编译参数

引用

gcc $(pkg-config --cflags --libs glib-2.0 gmodule-2.0) -o main main.c

C语言动态调用库(转)的更多相关文章

  1. 通过实例简介python使用ctypes模块调用C语言动态库

    看介绍python语言时,说它是胶水语言,可以调用其他语言.通过使用ctypes模块就可以调用C语言的动态库.下面先放上官方文档和几个比较好的博文. 1.官方文档:http://python.net/ ...

  2. C语言创建共享库(动态库)步骤

    C语言创建共享库(动态库)步骤: 创建sth.c,共享库源文件: //sth.c库源程序 unsigned long long sth(unsigned int x, unsigned int y) ...

  3. c++调用matlab生成的Dll动态连接库

    点击打开链接http://download.csdn.net/detail/nuptboyzhb/4228429 c++调用matlab生成的Dll动态连接库 实验平台:   matlab 7.0(R ...

  4. 【C#】 使用Gsof.Native 动态调用 C动态库

    [C#] 使用Gsof.Native 动态调用 C动态库 一.背景 使用C# 开发客户端时候,我们经常会调用一些标准的动态库或是C的类库.虽然C# 提供的PInvoke的方式,但因为使用的场景的多变, ...

  5. VS2013 生成sqlite3动态连接库及sqlite3.dll的调用

    一,生成sqlite3动态连接库1,去sqlite官网上下载最近的sqlite源码包,解压后得到四个文件:shell.c,sqlite3.c,sqlite3.h,sqlite3ext.h此处还需要sq ...

  6. Java动态调用脚本语言Groovy

    Java动态调用脚本语言Groovy 2019-05-15 目录 0. pom.xml添加依赖1. 使用GroovyShell计算表达式2. 使用GroovyScriptEngine脚本引擎加载Gro ...

  7. R语言中动态安装库

    R语言中动态安装库 在一个R脚本中,我们使用了某些library,但是发现运行环境中没有这个library,如果能检测一下有没有这个包,没有就自动安装该多好.而R中非常方便地支持这些,只要联网. 代码 ...

  8. C# 动态调用DLL库

    最近经常用到C#动态调用类库,简单的做下记录方便以后查询. 使用下面的几行代码就可以简单实现DLL类库的调用了 using System.Reflection; // 引入该命名空间 // 获取roc ...

  9. C#程序实现动态调用DLL的研究(转)

    摘 要:在<csdn开发高手>2004年第03期中的<化功大法——将DLL嵌入EXE>一文,介绍了如何把一个动态链接库作为一个资源嵌入到可执行文件,在可执行文件运行时,自动从资 ...

随机推荐

  1. 一起做RGB-D SLAM 第二季 (一)

    小萝卜:师兄!过年啦!是不是很无聊啊!普通人的生活就是赚钱花钱,实在是很没意思啊! 师兄:是啊…… 小萝卜:他们都不懂搞科研和码代码的乐趣呀! 师兄:可不是嘛…… 小萝卜:所以今年过年,我们再做一个S ...

  2. sql like 时间

    and Convert(varchar(),TimeStamp,) like '%2013-09-06 09:46:03%'

  3. Go加密解密之RSA[转]

    安全总是很重要的,各个语言对于通用的加密算法都会有实现.前段时间,用Go实现了RSA和DES的加密解密,在这分享一下.(对于RSA和DES加密算法本身,请查阅相关资料) 在PHP中,很多功能经常是一个 ...

  4. struts2 hello world

    注意:仅需要如下这些jar包,否则启动时会出错 commons-lang3-3.2.jar commons-logging-1.1.3.jarcommons-logging-api-1.1.jarfr ...

  5. Java知多少(106)程序与数据库连接

    一个网络关系数据库应用系统是一个三层次结构.客户机与服务器采用网络连接,客户机端应用程序按通信协议与服务器端的数据库程序通信:数据库服务程序通过SQL命令与数据库管理系统通信. Java程序与数据库连 ...

  6. 一步一步实战扩展 ASP.NET Route,实现小写 URL、个性化 URL

    介绍 不知道大家在使用 ASP.NET MVC 时有没有一些扩展要求,反正我是有很多.在使用 MVC 这几年(PS:我是从 1.0 开始学,2.0.3.0 开发至今),我深深地觉得 MVC 的扩展性真 ...

  7. libtool: link: `dftables.lo' is not a valid libtool object

    手误造成的错误: make & make install.&位操作符导致的错误!应该是make && make install.

  8. read和write函数

    读函数read  ssize_t read(int fd,void *buf,size_t nbyte)  如果是ECONNREST表示网络连接出了问题. 写函数write  ssize_t writ ...

  9. SharePoint 2013中规划企业搜索体系结构

    摘要:了解如何规划小型.中型或大型企业搜索体系结构. 设置企业搜索体系结构之前,需要仔细规划很多事项.我们将逐步帮助您规划小型.中型或大型企业搜索体系结构. 您是否熟悉 SharePoint 2013 ...

  10. #敏捷个人资料# 免费下载 《敏捷个人-认识自我,管理自我 v0.8.pdf》

    快乐.高效.平衡,做一个爱学习.有目标.懂生活的影响者. 从今天开始至7月31日,点击http://t.cn/Rv3koHU 免费收到 1000多页的 <敏捷个人-认识自我,管理自我 v0.8. ...