静态链接库与动态链接库:
静态链接库和程序打包在一起,确定是安装包过大,后续修改需要重新生成安装包;
动态链接库,和程序安装包是独立的,后续库文件需要升级,只需要更新动态链接库即可,比较方便灵活。
加载动态库的两种方式:
一是在程序开始时将库文件(.so,.dl)加载到内存中;
另一种是动态的加载,在程序需要时加载,不需要时卸载。此时使用动态加载的函数库对动态链接库库进行加载。
动态加载的函数库Dynamically Loaded (DL) Libraries:
动态加载的函数库是一类函数库,它可以在程序运行过程中需要某个模块时才动态的加载。
Linux中使用 dlpoen() API,
Windows使用 LoadLibraryA() API,
Python调用C/C++动态链接库 使用 ctypes 方式
linux下动态的加载库使用和示例:
dlopen()函数打开一个函数库然后为后面的使用做准备。C语言原形是:
void * dlopen(const char *filename, int flag);//flag: RTLD_LAZY、RTLD_NOW
dlsym() 这个函数在一个已经打开的函数库里面查找给定的符号。定义如下:
void * dlsym(void *handle, char *symbol);
dlclose() 关闭一个DL函数库
例:
#include <dlfcn.h>
void *handle;
double (*cosine)(double);
handle = dlopen ("/lib/libm.so.6", RTLD_LAZY);//RTLD_NOW
cosine = dlsym(handle, "cos");
printf ("%f ", (*cosine)(2.0));
dlclose(handle);
此外,在linux下有SoManager.cpp对dl API进一步做了封装,可以使用SoManager来动态的加载库。
动态链接库后缀 .so 与 .dll的区别:
.so 为linux下的格式,so: shared object
.dll 为wiendows下的格式,dll:dynamic link library
版权声明:本文为weixin_39087379原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。