类似windows下的LoadLibrary, GetProAddress,FreeLibrary, linux 下可以通过dlopen, dlsym,dlclose对共享库进行加载,得到函数的地址,来调用函数。
提供一个例子如下:
#include <dlfcn.h>
#include <stdint.h>
//#include "plus.h"
//#include "minor.h"
typedef int (*pmmethod)(int,int);
int main()
{
int a = 5;
int b = 3;
void *dlh = dlopen("libpmmethod.so",RTLD_LAZY);
if(!dlh)
{
printf("error!");
}
dlerror();
pmmethod func_plus = (pmmethod)(uintptr_t)dlsym(dlh,"plus");
pmmethod func_minor = (pmmethod)(uintptr_t)dlsym(dlh,"minor");
char *error;
if((error = dlerror()) != NULL)
{
fprintf(stderr,"%s\n",error);
}
printf("%d + %d = %d\n",a,b,func_plus(a,b));
printf("%d - %d = %d\n",a,b,func_minor(a,b));
dlclose(dlh);
}
如果不需要动态加载共享库,就需要添加头文件。
在这里如果出现undefined symbol: plus,表明在你的共享库中不存在plus这个名字,一种原因是没有定义,还有一种就是你生成共享库的时候是以C++的方式生成的。需要在你导出的函数前添加extern “C”来以C语言方式导出。
也可以通过命令查看nm libpmmethod.so
......
0000047c T minor
0000046c T plus
如果以C++导出函数。通过nm libpmmethod.so得到
......
0000046c T _Z4plusii
0000047c T _Z5minorii
如果这样,上面的代码就会出现undefined symbol:的问题。
生成最终可执行程序,gcc -o main main.cpp -ldl