动态库静态库
分类
linux
-
静态库 .a
- 命名 : lib + “库名称” + .a
- 例子:libadd.a
-
动态库 .so
- 命名:lib + "库名称“ + .so
- 例子:libadd.so
windows
- 静态库 .lib
- 动态库 .dll
what
本质是一种可执行的二进制代码,可被操作系统载入执行
通俗说,将常用函数生成的目标文件生成的目标文件打包,提供函数接口,便于程序员调用,使用前包含头文件即可
动态库和静态库的区别
静态库
- 静态库在编译的过程中编入目标程序中,可以独立运行,运行过程中不需要向外部要求读取函数库的内容,但是生成可执行文件较大
动态库
- 个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。
- 动态库在链接的过程中,动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个 DLL 副本的内容。
编译原理–过程
预编译
头文件插入源程序
编译
词法分析、语法分析、语义分析、中间代码生成
汇编
汇编阶段汇编器根据指令集将汇编程序helloworld.s翻译成机器指令
链接
链接器确保正确解析所有跨文件依赖项。例如,如果您在一个 .cpp 文件中定义某些内容,然后在另一个 .cpp 文件中使用它,则链接器会将两者连接在一起。如果链接器无法使用其定义连接对某事物的引用,您将收到链接器错误,并且链接过程将中止。
优缺点
静态库
-
内存和磁盘空间浪费
- 静态链接方式对于计算机内存和磁盘的空间浪费十分严重。假如一个c语言的静态库大小为1MB,系统中有100个需要使用到该库文件,采用静态链接的话,就要浪费进100M的内存,若数量再大,那浪费的也就更多。
-
更新麻烦
动态库
- ①毋庸置疑的就是节省内存;
- ②减少物理页面的换入换出;
- ③在升级某个模块时,理论上只需要将对应旧的目标文件覆盖掉即可。新版本的目标文件会被自动装载到内存中并且链接起来;
- ④程序在运行时可以动态的选择加载各种程序模块,实现程序的扩展。
制作和使用
linux
-
静态库
- 1.通过gcc -c add.c 生成目标文件 =》add.o
- 2.通过ar crs -o libadd.a add.o 生成静态库 =》libadd.a
- 3.通过gcc main.c -L. -ladd 链接静态库编译,生成可执行文件a.out
- 4.执行a.out即可
-
动态库
- 1.通过gcc -c add.c 生成目标文件 =》add.o
- 2.通过gcc -fPIC -shared -o libmyadd.so add.o 生成动态库文件 =》libmyadd.so
- 3.通过gcc main.c -L. -lmyadd 生成可执行文件 =》a.out
-
存放目录(找不到库文件)
- (1)将libmyadd.so放到/usr/lib或/lib目录下
- (2)通过export LD_LIBRARY_PATH=/home/linux/ych/lib 将库所在的绝对路径添加至环境变量中(通过echo $LD_LIBRARY_PATH查看此环境变量的值;通过unset LD_LIBRARY_PATH来删除此环境变量里的值)
- (3)在/etc/ld.so.conf.d/下新建一个sudo vi my.conf文件,在里面写入库所在的绝对路径,保存并执行sudo ldconfig执行配置文件。
windows
-
静态库
-
使用
- 1.将库文件放到项目的lib文件夹下
- 2.包含头文件#include “…/lib/staticlib.h”
- 3.在项目中调用函数即可
-
新建Win32 Static Library 项目
-
-
动态库
-
新建C++ Source File项目
-
函数类型
-
导出函数
- 可以被外部程序调用
- 方式一:用模块(.def)声明
- 方式二:用_declspec(dllexport)来声明函数
-
内部函数
- 只能在DLL内部使用
-
使用
-
加载方式
-
静态加载(隐式加载)
- 在编译程序代码时即完成对DLL加载,应用程序结束时卸载DLL
-
动态加载(显式加载)
- 使用API函数来加载和卸载DLL
-
-
-
-
XMind - Trial Version**