so dll动态链接库,动态加载的库函数dlopen,dlclose,dlsym,somanager,somanager.load

静态链接库与动态链接库:

静态链接库和程序打包在一起,确定是安装包过大,后续修改需要重新生成安装包;
动态链接库,和程序安装包是独立的,后续库文件需要升级,只需要更新动态链接库即可,比较方便灵活。

加载动态库的两种方式:

一是在程序开始时将库文件(.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版权协议,转载请附上原文出处链接和本声明。