一般扩展名为( .a 或 .lib ),这类函数库通常名为libxxx.a或xxx.lib。
这类库在编译的时候会直接整合到目标程序中,所以利用静态函数库编译成的文件会比较大,这类函数库最大的优点就是编译成功的可执行文件可以独立运行,而不在需要向外部要求读取函数库的内容。
动态函数库的扩展名一般为( .so 或 .dll ),这类函数库通常名为libxxx.so或xxx.dll
动态库是程序设计常用的技术。采用动态库可以有效的减少程序大小、节省空间、提高效率。增加程序的可扩展性。便于模块化管理。在Windows和Linux操作系统中都有动态库的概念。Windows将其称为动态链接库(Dvnamic link Library. DLL),其文件扩展名.dll,Linux称其为共享库技术(Shared Library),相应的共享库文件扩展名为.so。
动态函数库在编译的时候,在程序里只有一个“指向”的位置而已,也就是说当可执行文件需要使用到函数库的机制时,程序才会去读函数库来使用。
动态库在程序运行的时候被动态链接。但是在具体使用动态库的时候却有两种不同的方式:隐式链接和显式链接。
1.3.1 隐式链接隐式链接在编译/链接阶段完成,由编译系统根据动态库的头文件和库文件进行编译和链接。从而确定待调用的函数原形和地址。
1.3.2 显式链接利用API函数实现加载和卸载共享库,获取带调用函数地址,获取错误信息等功能。
2 dlfcn.h#includevoid *dlopen(const char *pathname, int mode); void *dlsym(void *handle, const char* symbol); char *dlerror(void); int dlclose(void *handle);
有的代码可能用到了两个特殊的函数 __init和__fini。这两个函数用在装载和卸载某个动态库的时候。
void __init(void); void __fini(void);gcc编译的时候添加参数-ldl
参考1:dlopen函数详解
参考2:linux 动态库 显式调用 与 隐式调用



