文档声明:
以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正。并且该文档在后期会随着学习的深入不断补充完善。感谢各位的参考查看。
笔记资料仅供学习交流使用,转载请标明出处,谢谢配合。
如果存在相关知识点的遗漏,可以在评论区留言,看到后将在第一时间更新。
作者:Aliven888
系统:win7 x64 旗舰版
编译器: Visual Studio 2015
编译环境:Debug x86
可以说,学习C/C++开发的人掌握动态链接库和静态链接库的制作与使用,可谓是最基本的技能了。
静态库和动态库:
静态库:包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。函数和数据被编译进一个二进制文件(扩展名通常为.lib),在使用静态库的情况下,在编译链接可执行文件时,链接器从静态库中复制这些函数和数据,并把它们和应用程序的其他模块组合起来创建最终的可执行文件(.exe)。当发布产品时,只需要发布这个可执行文件,并不需要发布被使用的静态库。
动态库:包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。在使用动态库时,往往提供两个文件:一个引入库(.lib,非必须)和一个.dll文件。这里的引入库和静态库文件虽然扩展名都是.lib,但是有着本质上的区别,对于一个动态链接库来说,其引入库文件包含该动态库导出的函数和变量的符号名,而.dll文件包含该动态库实际的函数和数据。
本章节只会介绍动态链接库的制作与使用;其中需要注意的是,动态链接库的制作有 使用 __declspec(dllexport) 创建dll 和 使用模块定义(.def)文件创建dll 两种方式,这里我们先重点介绍第一种,因为第一种方式使用起来更加的方便和灵活。
使用动态链接库的好处:
在开始制作动态链接库之前,我们先了解一些与之有关的知识。
dllexport类: 声明类dllexport时,将导出其所有成员函数和静态数据成员。您必须在同一程序中提供所有此类成员的定义。否则,将生成链接器错误。此规则的一个例外适用于纯虚函数,您无需为其提供显式定义。但是,因为抽象类的析构函数总是由基类的析构函数调用,所以纯虚拟析构函数必须始终提供定义。请注意,这些规则对于不可导出的类是相同的。如果导出类类型的数据或返回类的函数,请确保导出该类。
dllimport类 声明类dllimport时,将导入其所有成员函数和静态数据成员。与dllimport和dllexport在非类类型上的行为不同,静态数据成员不能在定义dllimport类的同一程序中指定定义。
第二步:在项目工程中添加一个 .cpp 文件和 .h文件(名称可以根据自己的需求去定义)。
第三步:再两个文件中,分别写入如下代码:
//Alivendll.cpp
#include "Alivendll.h"
void AlivenTest()
{
cout << "This is a dll test ." << endl;
}
//Alivendll.h
#pragma once
#include
using namespace std;
#ifdef ALIVENDLL_EXPORTS //该宏是项目自定义的
#define ALIVEN_API extern "C" __declspec(dllexport)
#else
#define ALIVEN_API extern "C" __declspec(dllimport)
#endif //ALIVENDLL_EXPORTS
ALIVEN_API void AlivenTest();
第四步:选择好编译环境后(这里我测试的环境的是 Debug x86),编译项目即可。最终我们可以获取到 Alivendll.dll 和 Alivendll.lib 文件。
第一步:创建一个项目工程,这里选择控制台应用程序。
调用动态链接库需要三个文件(.dll、.lib、*.h)如下图示;接下来我们详细讲解下调用过程:
第二步:将Alivendll.h放在应用程序的目录下(一般建议放到应用程序目录下,但是也可以放到其他目录下),并导入到应用程序中。
第三步:将Alivendll.lib放在应用程序的目录下(一般建议放到应用程序目录下,但是也可以放到其他目录下),并导入到应用程序中。
这里需要注意下,Alivendll.lib 的导入有三种方式:
第一种:#pragma comment(lib, “Alivendll.lib”)
第二种:在属性中配置附加依赖项
第三种,直接加载到项目中。
详细操作可以参见《C/C++ 静态链接库(lib)的三种常用调用方式》这篇博客。
第四步:将Alivendll.dll放在应用程序的可执行文件(exe)目录下。
时间 | 内容 |
---|---|
2020-11-04 | 创建笔记 |
2020-11-08 | 优化文章格式以及修改部分错别字 |