5_06_GLib库入门与实践_模块动态加载

简介

模块动态加载支持跨平台使用,支持Windows、Linux和MacOS,每个平台都有单独的实现,最后统一封装成对外调用的接口。

  • Windows的实现代码在gmodule-win32.c
  • Linux的实现代码在gmodule-dl.c
  • MacOS的实现代码在gmodule-dyld.c

数据结构

模块动态加载的数据结构是一个不透明数据结构,只能整体使用它,无法单独引用其内部成员。

typedef struct _GModule GModule;

函数列表

gboolean 	g_module_supported ()
gchar * 	g_module_build_path ()
GModule * 	g_module_open ()
gboolean 	g_module_symbol ()
const gchar * 	g_module_name ()
void 	g_module_make_resident ()
gboolean 	g_module_close ()
const gchar * 	g_module_error ()

函数功能分类

打开

GModule * 	g_module_open ()

符号查找

gboolean 	g_module_symbol ()

关闭

gboolean 	g_module_close ()

其他

gchar * 	g_module_build_path ()
const gchar * 	g_module_name ()
gboolean 	g_module_supported ()
void 	g_module_make_resident ()
const gchar * 	g_module_error ()

函数功能说明及综合演示

函数功能说明:

// 本平台是否支持模块动态加载特性
gboolean 	g_module_supported ()

// 给定动态加载库路径和文件名得到全路径
gchar * 	g_module_build_path ()

// 打开动态链接库
GModule * 	g_module_open ()

// 符号查找
gboolean 	g_module_symbol ()

// 关闭动态链接库
gboolean 	g_module_close ()

// 获取加载的动态链接库名
const gchar * 	g_module_name ()

// 使动态库常驻内存,即使调用g_module_close也不会退出
void 	g_module_make_resident ()

// 获取错误信息
const gchar * 	g_module_error ()

下面是官方帮助文档给出的使用示例。
和dlopen系列函数类似,都是先open打开库,再symbol查找符号,最后再close关闭。

// the function signature for 'say_hello'
typedef void (* SayHelloFunc) (const char *message);

gboolean
just_say_hello (const char *filename, GError **error)
{
  SayHelloFunc  say_hello;
  GModule      *module;

  module = g_module_open (filename, G_MODULE_BIND_LAZY);
  if (!module)
    {
      g_set_error (error, FOO_ERROR, FOO_ERROR_BLAH,
                   "%s", g_module_error ());
      return FALSE;
    }

  if (!g_module_symbol (module, "say_hello", (gpointer *)&say_hello))
    {
      g_set_error (error, SAY_ERROR, SAY_ERROR_OPEN,
                   "%s: %s", filename, g_module_error ());
      if (!g_module_close (module))
        g_warning ("%s: %s", filename, g_module_error ());
      return FALSE;
    }

  if (say_hello == NULL)
    {
      g_set_error (error, SAY_ERROR, SAY_ERROR_OPEN,
                   "symbol say_hello is NULL");
      if (!g_module_close (module))
        g_warning ("%s: %s", filename, g_module_error ());
      return FALSE;
    }

  // call our function in the module
  say_hello ("Hello world!");

  if (!g_module_close (module))
    g_warning ("%s: %s", filename, g_module_error ());
  return TRUE;
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值