0
点赞
收藏
分享

微信扫一扫

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 条评论