Linux动态使用共享库
起因
这篇应该是补充linux学习笔记5-共享库,使用共享库的另外一种方式.对应Windows的这篇Windows动态库使用.共享库代码(头文件,本次没有用到)
#ifndef SHARE_H
#define SHARE_H
#ifdef __cplusplus
extern "C"
{
#endif
int add(int a,int b);
int min(int a,int b);
int max(int a,int b);
#ifdef __cplusplus
}
#endif
#endif
共享库代码(主文件)
int add(int a,int b)
{
return a + b;
}
int min (int a,int b)
{
return a < b?a:b;
}
int max(int a,int b)
{
return a > b? a :b;
}
gcc -o libshare.so -fPIC -shared share.c
使用共享库
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
int main(int argc, char *argv[])
{
char *error; //错误消息
void *handle; //用于接收共享库的入口地址
//声明函数指针,用于接收动态加载共享库指定函数的地址
typedef int(*Add)(int a, int b);
//加载共享库
//参数一 指定共享库名称和路径(这里和程序同一目录)
//参数二 指定那种方式加载共享库,这里是延迟加载(在使用的时候,才会去加载共享库)
handle = dlopen("./libshare.so", RTLD_LAZY);
if (handle == NULL)
{
fprintf(stderr, "load share library failed:%s\n", dlerror());
exit(1);
}
//dlsym通过共享库的入口地址,找到add函数的地址
Add add = dlsym(handle, "add");
if ((error = dlerror()) != NULL)
{
fprintf(stderr, "load function address failed:%s\n", dlerror());
exit(1);
}
int result = add(10, 30);
fprintf(stdout, "function execute result:%d\n", result);
//在使用结束,一定要dlclose关闭(卸载)该共享库
if (dlclose(handle) < 0)
{
fprintf(stderr, "free share library failed:%s\n", dlerror());
exit(1);
}
return 0;
}
//使用共享库 ,生成要加参数指定
gcc -o share_lib -rdynamic -ldl share_lib.c
效果

秋风
2017-04-25