C/C++ 动态链接库(dll)的生成与调用

文档声明:
以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正。并且该文档在后期会随着学习的深入不断补充完善。感谢各位的参考查看。


笔记资料仅供学习交流使用,转载请标明出处,谢谢配合。
如果存在相关知识点的遗漏,可以在评论区留言,看到后将在第一时间更新。
作者:Aliven888

1、开发环境

系统:win7 x64 旗舰版
编译器: Visual Studio 2015
编译环境:Debug x86

2、简介

  可以说,学习C/C++开发的人掌握动态链接库和静态链接库的制作与使用,可谓是最基本的技能了。

静态库和动态库:
静态库:包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。函数和数据被编译进一个二进制文件(扩展名通常为.lib),在使用静态库的情况下,在编译链接可执行文件时,链接器从静态库中复制这些函数和数据,并把它们和应用程序的其他模块组合起来创建最终的可执行文件(.exe)。当发布产品时,只需要发布这个可执行文件,并不需要发布被使用的静态库。

动态库:包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。在使用动态库时,往往提供两个文件:一个引入库(.lib,非必须)和一个.dll文件。这里的引入库和静态库文件虽然扩展名都是.lib,但是有着本质上的区别,对于一个动态链接库来说,其引入库文件包含该动态库导出的函数和变量的符号名,而.dll文件包含该动态库实际的函数和数据。

本章节只会介绍动态链接库的制作与使用;其中需要注意的是,动态链接库的制作有 使用 __declspec(dllexport) 创建dll使用模块定义(.def)文件创建dll 两种方式,这里我们先重点介绍第一种,因为第一种方式使用起来更加的方便和灵活。

使用动态链接库的好处:

  • 可以使用多种编程语言编写:比如我们可以用VC++编写dll,然后在VB编写的程序中调用它。
  • 增强产品功能:可以通过开发新的dll取代产品原有的dll,达到增强产品性能的目的。比如我们看到很多产品改动了界面插件功能,允许用户动态地更换程序的界面,这就可以通过更换界面dll来实现。
  • 提供二次开发的平台:用户可以单独利用dll调用其中实现的功能,来完成其他应用,实现二次开发。
  • 节省内存:如果多个应用程序使用同一个dll,该dll的页面只需要存入内存一次,所有的应用程序都可以共享它的页面,从而节省内存。

3、相关知识介绍

在开始制作动态链接库之前,我们先了解一些与之有关的知识。

dllexport类: 声明类dllexport时,将导出其所有成员函数和静态数据成员。您必须在同一程序中提供所有此类成员的定义。否则,将生成链接器错误。此规则的一个例外适用于纯虚函数,您无需为其提供显式定义。但是,因为抽象类的析构函数总是由基类的析构函数调用,所以纯虚拟析构函数必须始终提供定义。请注意,这些规则对于不可导出的类是相同的。如果导出类类型的数据或返回类的函数,请确保导出该类。

dllimport类 声明类dllimport时,将导入其所有成员函数和静态数据成员。与dllimport和dllexport在非类类型上的行为不同,静态数据成员不能在定义dllimport类的同一程序中指定定义。

4、制作一个动态链接库

第一步:创建一个dll项目工程:
C/C++ 动态链接库(dll)的生成与调用_第1张图片

C/C++ 动态链接库(dll)的生成与调用_第2张图片

第二步:在项目工程中添加一个 .cpp 文件和 .h文件(名称可以根据自己的需求去定义)。

C/C++ 动态链接库(dll)的生成与调用_第3张图片

第三步:再两个文件中,分别写入如下代码:

//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();


C/C++ 动态链接库(dll)的生成与调用_第4张图片

第四步:选择好编译环境后(这里我测试的环境的是 Debug x86),编译项目即可。最终我们可以获取到 Alivendll.dll 和 Alivendll.lib 文件。

C/C++ 动态链接库(dll)的生成与调用_第5张图片
C/C++ 动态链接库(dll)的生成与调用_第6张图片

5、使用动态链接库

第一步:创建一个项目工程,这里选择控制台应用程序。

C/C++ 动态链接库(dll)的生成与调用_第7张图片

C/C++ 动态链接库(dll)的生成与调用_第8张图片

调用动态链接库需要三个文件(.dll、.lib、*.h)如下图示;接下来我们详细讲解下调用过程:

在这里插入图片描述
第二步:将Alivendll.h放在应用程序的目录下(一般建议放到应用程序目录下,但是也可以放到其他目录下),并导入到应用程序中。

C/C++ 动态链接库(dll)的生成与调用_第9张图片
C/C++ 动态链接库(dll)的生成与调用_第10张图片
C/C++ 动态链接库(dll)的生成与调用_第11张图片

第三步:将Alivendll.lib放在应用程序的目录下(一般建议放到应用程序目录下,但是也可以放到其他目录下),并导入到应用程序中。

这里需要注意下,Alivendll.lib 的导入有三种方式:
第一种:#pragma comment(lib, “Alivendll.lib”)
第二种:在属性中配置附加依赖项
第三种,直接加载到项目中。

详细操作可以参见《C/C++ 静态链接库(lib)的三种常用调用方式》这篇博客。

C/C++ 动态链接库(dll)的生成与调用_第12张图片
第四步:将Alivendll.dll放在应用程序的可执行文件(exe)目录下。

C/C++ 动态链接库(dll)的生成与调用_第13张图片

笔记跟新记录

时间 内容
2020-11-04 创建笔记
2020-11-08 优化文章格式以及修改部分错别字

你可能感兴趣的:(C/C++,动态链接库,dll,C/C++)