为了让应用程序在发不之后不需要重新
函数库分为
Linux下默认的动态库搜索路径是/lib跟/usr/lib,为了让
dlopen——加载动态库并返回
dlerror——如果动态库加载失败,返回错误详细消息的
dlsym——传入句柄跟函数名,返回函数指针;
dlclose——释放dlopen返回的句柄。
下面演示一个用插件实现加法功能的C语言实例:
1、plugintest.c
#include
#include
int main(){
//句柄
void *flib;
//入口函数原型
int (*padd)(int a, int b);
//错误信息字符串
char *error_message;
int a = 2, b = 7, result = 0;
//加载plugin.so,以RTLD_LAZY方式
flib = dlopen("./libplugin.so", RTLD_LAZY);
error_message = dlerror();
if(error_message)
{
printf("%s:%d %s\n", __FILE__, __LINE__, error_message);
return -1;
}
//找到函数名为func的函数,返回其指针
padd = dlsym(flib, "add");
error_message = dlerror();
if(error_message)
{
printf("%s:%d %s\n", __FILE__, __LINE__, error_message);
return -1;
}
//调用padd指向的指针,即add函数
result = padd(a, b);
printf("%d + %d = %d\n", a, b, result);
//释放
dlclose(flib);
error_message = dlerror();
if(error_message)
{
printf("%s:%d %s\n", __FILE__, __LINE__, error_message);
return -1;
}
return 0;
}
2、plugin.c
int add(int a, int b)
{
return a+b;
}
二、编译
//生成plugin.o
gcc -fpic -c plugin.c
//生成libplugin.so
gcc -shared -lc -o libplugin.so plugin.o
//生成可执行文件plugintest
gcc plugintest.c -o plugintest -ldl
三、运行结果
./plugintest
2 + 7 = 9
除非注明,文章均为CppLive 编程在线原创,转载请注明出处,谢谢。