继续以《C/C++静态链接库》的add.cpp为例子。要编译动态库只要修改下编译命令就可以了。编译生成libadd.so文件。
目录
g++ -m64 add.cpp -fPIC -shared -o add.so
动态库调用有编译时调用的隐式调用和另一种是使用过程中加载的显式调用两种。
隐式调用
g++ main.cpp -L./ -ladd -o main -Wl,--rpath=/mydisk/dev/dll
显式调用
显式调用要修改add.h和main.cpp源文件。
add.h文件
#ifndef add_fun
#define add_fun
#include <stdio.h>
extern "C" {
int add(int a,int b);
}
#endif
main.cpp文件
#include <stdio.h>
#include <dlfcn.h>
int main()
{
typedef int (*tfun)(int,int);
char *err = NULL;
void* handle = dlopen("./libadd.so",RTLD_NOW);
if(!handle)
{
printf("error:%s",dlerror());
return 1;
}
dlerror();
tfun add_fun = (tfun)dlsym(handle,"add");
err=dlerror();
if(err)
{
printf("find add fun error:%s",err);
return 1;
}
printf("12+23=%d",add_fun(12,23));
dlclose(handle);
return 1;
}
#endif
编译方法
#编译libadd.so
g++ main.cpp -L./ -ladd -o main -Wl,--rpath=/mydisk/dev/dll
#编译执行文件
g++ -o main main.cpp -ldl