简介
模块动态加载支持跨平台使用,支持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;
}