这里用一个程序源码来说明:
#include <iostream>
#include <dlfcn.h>
using namespace std;
typedef int (*Func)(int); // 定义函数指针,用来接受so文件里的函数,so文件里的函数原型需要一个int参数,返回一个int值
void *FuncLib; // 存放动态链接库的句柄
char *pcError = NULL; // 存放错误码
int main(void)
{
int iRet = 0;
// 载入动态链接库,可用相对路径和绝对路径
FuncLib = dlopen("./libComDll.so", RTLD_LAZY);
// 获取错误信息
pcError = dlerror();
if (pcError)
{
cout<<"dlopen Error info:"<<pcError<<endl;
return -1;
}
// 用函数指针承接so文件里的函数,注意ComTest才是so文件源码里的函数名,生成so文件的时候会自动添加__Fi
Func func = (Func)dlsym(FuncLib, "ComTest__Fi");
pcError = dlerror();
if (pcError)
{
cout<<"dlsym Error info:"<<pcError<<endl;
return -1;
}
// 执行函数
iRet = (*func)(-5);
pcError = dlerror();
if (pcError)
{
cout<<"Func Error info:"<<pcError<<endl;
return -1;
}
cout<<"return value:"<<iRet<<endl;
// 关闭载入的动态链接库
iRet = dlclose(FuncLib);
pcError = dlerror();
if (iRet)
{
cout<<"dlclose Error info:"<<pcError<<endl;
return -1;
}
return 0;
}
注意事项:
1.在编译的时候要添加 -ldl,否则会报错。