此文是这几天的工作总结,写的不正确的地方欢迎大家交流探讨。
-什么是动态链接库?
主程序可以在需要的时候链接,不需要的时候闲置(不占主程序内存)。而动态链接库里的内容往往是一些函数的接口实现,库对外部只提供函数的接口。在 linux 下动态链接库就是XX.so文件,在windows下就是XX.dll文件。
-为什么要使用动态链接库?
在我们实际应用中,有些函数在程序中被调用的很少,但是不可或缺,这样如果直接将其写在主程序中会占用主程序内存等资源;另外当一个项目非常大,需要很多人参与,想想如果每个人都将其功能放在主函数中,这样调试起来很麻烦,而且迁一发而动全身,也许更改了某个功能后,整个程序就得全部更改。为了避免以上两点,动态链接库是一个很好的选择。
-Linux下动态链接库的使用
1.生成动态链接库,我们要生成一个含有加法接口名为libarg.so的动态链接库
声明函数: // arg.h
extern “C” int add(int a, int b)
{
return a+b;
}
生成arg.so文件: g++ -fPIC arg.h ld -shared -o libarg.so
2 动态链接库的显式加载 // include “dlfcn.h”
要在程序中使用libarg.so 中的add接口,在此显式的动态加载。
typedef int(*ADD)(int a,int b); //定义add函数别名为ADD
void* handle = NULL;
handle = dlopen(“.so文件的绝对路径”,RTLD_NOW);//需要绝对路径
if(NULL == handle){ //加载失败,一般时路径问题
std::cout<<“Failed reason: ”<<dlerror()<<‘\n’;
}
ADD add_h = (ADD)dlsym(handle,”add”);
int result = add_h(5,6);
dlclose(handle);
在此,基本的用法就时这样了,若加载函数错误,或者加载动态库错误,则可以打印dlerror()来查看错误原因。
linux下编译: g++ -o main main.cpp -l dl //注意加上-l dl