- 程序编译过程
- 库文件
- 静态链接和动态链接的区别?
- 从0开始 - 创建和使用静态链接库
- 创建静态库项目
- 向静态库中添加文件
- 编译静态库
- 创建引用静态库的C++控制台应用
- 在应用中使用静态库功能
- 从0开始 - 创建和使用 DLL
- 创建 DLL 项目
- 向 DLL 中添加文件
- 编译动态库
- 创造使用 DLL 的客户端应用
- 隐式调用
- 显式调用
- 演练
- 创建 DLL 项目
- 向 DLL 中添加文件
- 创建使用 DLL 的客户端应用
- 将 DLL 标头添加到包含路径
- 将 DLL 导入库添加到项目中
(这个目录来的,别点了,还是这页)
笔记不写容易忘,谁脑袋记得住这么多东西(秃)。
事情是这样的,上学期老师给的一个阅读代码的任务,但由于我常年身处文化沙漠死活读不懂。一学期过去了,懒癌终于拿起花瓶浇自己了。
今天的笔记内容说的是平时经常能看见的,运行 VS 项目的时候老在下方加载的 .dll
。包括一小部分的理论和超大部分的实操。
什么是动态链接库(DLL)?
解构一下,”动态“、”链接“、”库“。
- 动态:与静态相对,对比理解。
- 链接:程序编译过程的一步。
- 库:一种代码仓库。
程序编译过程
- 编译:把文本形式的源代码翻译成机器语言,并形成目标文件。
- 预处理:处理 # 开头的的指令。(.cpp .i)
- 编译优化:确定指令是否符合规则,之后翻译成汇编代码。(.i .s)
- 汇编:把汇编语言翻译成目标机器指令,生成目标文件。(.s .o)
链接:把目标文件、操作系统的启动代码和库文件组织起来形成可执行程序。(.o .exe )
库文件
可以简单的把库文件看成一种代码仓库,它提供给使用者一些可以直接拿来用的变量、函数或类。
库文件分为静态库和动态库。
静态链接和动态链接的区别?
预编译 -> 编译 -> 汇编 -> ==链接==
区别在于链接阶段如何处理库。
静态库(.lib):链接阶段将汇编生成的目标文件.o和引用的库一起链接打包到可执行文件.exe 中。
特点:移植方便、浪费空间和资源。
动态库(.dll):程序运行时载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。
特点:资源共享、模块化、简化部署和安装。
C++ 操作实例
- Windows10、x64
- VS2019、C++ 的桌面开发
接下来介绍如何创建和使用动态链接库:
- 创建和使用静态链接库
- 创建和使用动态链接库
- 隐式调用
- 显式调用
- C语言模块
- 模块定义文件
为了便于学习,简化理解,先 从0开始 创建静态库和动态库,然后使用应用程序来链接库。最后通过演练应用来实操 DLL 。
接下来的实例可以分解为以下任务:
- 创建 DLL 项目。
- 声明和实现函数,导出函数到项目。
- 创建控制台应用项目。
- 从 DLL 导入函数。
- 运行应用。
从0开始 - 创建和使用静态链接库
使用静态库是重用代码的一种绝佳方式。
不必在每个应用中重新实现同一例程,只需将其写入静态数据库一次,然后引用它们即可。 从静态库链接的代码成为了应用的一部分,这样就不必安装另一个文件来使用代码。
接下来从空项目开始创建静态库。
创建静态库项目
将“语言” 设置为“C++” ,将“平台” 设置为“Windows” ,并将“项目类型” 设置为“库”。选择“Windows 桌面向导”。
![82d7bf52e107f6dbe5898ec569e95417.png](https://i-blog.csdnimg.cn/blog_migrate/13216db7f1264b8f3fddb90a36dccd2b.png)
静态库、空项目。
![38a51004168c0ba58b23bb4a6bf73b2b.png](https://i-blog.csdnimg.cn/blog_migrate/a784c3bfd5402d64bbd83f10f5b0f86b.png)
向静态库中添加文件
新建头文件、源文件。
![0d8c304fd11ce3265c46e0a67a0a3d4a.png](https://i-blog.csdnimg.cn/blog_migrate/578cafcb8fbcf289785386e4f691161c.png)
在 testlib.h
中添加声明:
#ifndef TESTLIB_H
#define TESTLIB_H
// 防止头文件重复包含
// 条件编译指令
// 加减乘除
int add(int a, int b); // 声明
#else
int a = 0;
// 满足条件才会编译,所以这里代码没有被高亮。
#endif
在 testlib.cpp
中实现功能:
#include "testlib.h"
// 加法
int add(int a, int b) // 实现
{
return a + b;
}
编译静态库
在菜单栏上依次选择“生成” > “生成解决方案” ,将创建一个可供其他程序使用的静态库 testLib.lib
。
![7bf166137b970eeb2d3d98735b99beae.png](https://i-blog.csdnimg.cn/blog_migrate/99a16a976b38964ac5dff27b3a087155.png)
查看项目路径可以找到。
![974eec753d586b7c4c46b1d7ab3f9603.png](https://i-blog.csdnimg.cn/blog_migrate/42d4df9f1adadf4902f74cbed38b5c1a.jpeg)
注:.lib
文件不能独立运行。
至此,静态库已经创建完毕!
创建引用静态库的C++控制台应用
在“解决方案资源管理器”中,右键单击顶部节点“解决方案”,打开快捷菜单 。 选择“添加” > “新建项目”,打开“添加新项目”对话框 。