一、前言
之前学过,没有留下笔记,现在忘记的差不多了,现在重新学习,并记录下来。
二、使用库的好处
2.1 为什么要使用库
- 封装底层代码,只保留使用接口,供上层使用,用户无需关注具体实现方式
- 方便开发部门间合作,只需要传递库文件(.dll或者.lib文件)
- 使得工程更加简洁(除了自己的代码,其他的全是库文件)
- 等
2.2 动态库和静态库的区别
静态库随程序一起加载。
优点:是发布项目文件少,只有一个运行文件。
缺点:更新不方便,每次更新需要更新全部内容。
动态库在程序启动后,被调用才加载。
优点:更新方便,只需要替换对应的组件,无需全部更新,现在程序发布的主流方式。
缺点:发布文件过多。
2.3 完整库的一般组成
- 一个库文件
- 一个或多个头文件
- 依赖库,无需头文件,因为已经被编译到主库之中。
2.4 一般查看工具
vs自带工具,在命令行输入以下命令,即可查看动态库
1
D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>dumpbin /exports D:\WorkSpace\DLLTutorial\Debug\DLLTutorial.dll
vs自带工具,在命令行输入以下命令,即可查看静态库
1
dumpbin /LINKERMEMBER vpxmtd.lib
三、库的生成
- 系统:win10
- 工具:vs2013
3.1 静态库的生成与测试
3.1.1 建立工程
文件->新建->项目->win32项目

3.1.2 编写代码
建立文件LibTest.h,写入以下代码
1
2
3
4
5
6
7
extern "C" int sum(const int x, const int y);
extern "C" int sub(const int x, const int y);建立文件LibTest.cpp,写入以下代码
1
2
3
4
5
6
7
8
9
10
11
12
int sum(const int x, const int y)
{
return x + y;
}
int sub(const int x, const int y)
{
return x - y;
}生成解决方案,成功和失败都会有提示,生成文件为:
test.lib 内容实体,导入即可使用
test.pdb 调试文件,内含源码
其他说明
在cpp文件中一定要包含stdafx.h头文件,这个文件里面包含了生成lib文件的配置信息,一般不需要修改。注:只有接口.cpp才需要包含。
3.1.3 工具测试
使用VS自带工具进行测试,测试结果如下图。

出现接口,则表示成功。
3.1.4 github工程代码
链接附上:https://github.com/coldspace/VSDllLib/tree/master/test
3.2 动态库生成与测试
3.2.1 建立工程
文件->新建->项目->win32项目

3.2.2 编写代码
建立文件dlltest.h,并写入以下内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CALL_Dll int sum(const int x, const int y);
CALL_Dll int sub(const int x, const int y);建立文件dlltest.cpp,并写如以下内容
1
2
3
4
5
6
7
8
9
10
11
int sum(const int x, const int y)
{
return x + y;
}
int sub(const int x, const int y)
{
return x - y;
}生成解决方案,生成文件为
dlltest.dll 内容函数实体
dlltest.lib 函数地址,以供编译器使用
dlltest.pdb 调试使用,内含源码信息
使用时,需要将dlltest.dll和dlltest.lib放入同一文件夹,编译时只需导入dlltest.lib即可。
其他说明
C++允许重载,C不允许。限制以C的方式导出,可以防止生成dll时,函数名重复编码。
3.2.3 工具测试
使用vs自带的工具进行测试,测试结果如下图

出现红框框部分,说明成功
3.2.4 github工程代码
链接附上:https://github.com/coldspace/VSDllLib/tree/master/dlltest
四、总结
静态库生成使用的是向导,系统自带了一些文件,虽然功能全面,但不是很喜欢,没有dll生成方式简洁,后期找找其他方法,库的使用见下文。