鸭脖娱乐 (Windows平台)详细介绍了用C++创建动态链接库DLL以及如何使用它(一)

日期:2021-02-19 08:13:01 浏览量: 111

[k1号]

[k1号]

前言:C和C++动态链接库和静态链接库,说起来很简单,但其实在创建的过程中有很多漏洞,我也一路踩了很多漏洞,查了很多资料银河体育 ,决定写一篇完整的文章,详细解释使用VS创建C++动态链接库的完整过程。本文的开发环境是vs2017

Windows下动态链接库简介

DLL是动态链接库的缩写,相当于Linux下的共享对象。DLL机制在Windows系统中有着广泛的应用,甚至内核的结构也在很大程度上依赖于DLL机制。windows下的DLL文件和exe文件实际上是一个概念华体会登录 ,它们都是PE格式的二进制文件

1.1 windows下DLL与Linux下DLL的区别

(1)文件后缀不同

Linux动态库的后缀是。所以文件,而窗口是。DLL文件

(2)文件格式不同

(a) Linux下是elf格式,即可执行和可链接的格式

在elf下,共享库中的所有全局函数和变量默认可以被其他模块使用,即elf默认导出所有全局符号

(b) windows下是PE格式的文件,即可移植的可执行文件格式

DLL本质上也是PE文件。DLL需要“告诉”编译器导出一个符号银河国际 ,否则编译器默认不会导出所有符号

(c) DLL中的文件数不同

Linux的动态链接库只有一个。So文件及其相应的头文件,而windows的动态链接库有两个文件

一个是图书馆。LIB)文件

一是动态库(。DLL)文件

必需的头文件(。H) 文件

(1)导入库文件包含DLL导出的函数的名称和位置。对于导入库,实际执行代码在动态库中,导入库中只包含地址符号表,以保证程序能找到相应函数的一些基本地址信息

(2)DLL文件包含实际函数和数据。应用程序使用lib文件链接到它们需要使用的DLL文件。库中的函数和数据不会复制到可执行文件中。因此,在应用程序的可执行文件中,存储的是DLL中要调用的函数的内存地址,而不是要调用的函数的代码,这样当一个或多个应用程序执行顺序操作时,就可以将程序代码和被调用的函数代码链接起来,从而节省内存资源

小结:从上面的说明中,我们可以看到DLL和。在windows下创建的Lib文件必须随应用程序一起发布,否则应用程序将产生错误。通用动态库程序包括lib文件和DLL文件。Lib文件在编译时连接到应用程序,而DLL文件在运行时调用

1.2例如c++ 动态链接库,有以下代码

头文件mymath。小时

//我的数学

命名空间mycal

你知道吗{

int add(int a,int b)

int sub(int a,int b)

}你知道吗

#pragma一次

实施代码我的数学.cpp你知道吗

//你知道吗我的数学.cpp你知道吗

#包括“myMath.h”

int mycal::add(int x,int y)

你知道吗{

返回x+y

}你知道吗

int mycal::sub(int x,int y)

你知道吗{

返回x-y

}你知道吗

在Linux中,编译成DLL后,您将得到某某文件,现在只要引入头文件,包括动态库路径,就可以正常使用,但是上面的代码也是在windows下,用vs2017编译成动态链接库,它不报错,只有一个xxx.dll有一个对应的文件xxx.lib文件文件?他们在哪里?)你知道吗

然后我们在新疆有一个项目,按照“头文件路径配置-库文件路径配置”的方法编写代码。我们还可以调用add函数和syntax prompt,因为syntax prompt实际上来自head文件,与库文件无关,但是编译失败。名为add and sub的显示错误。为什么?你知道吗

程序员的自我修养:链接,装载与库 pdf_c++ 动态链接库_维度链接库属于基本链接库

这是因为我们说在windows下,我们需要显式地告诉编译器动态库中哪些函数可以导出和使用,但是上面没有描述,也就是说add和sub实际上是不允许使用的华体会首页 ,所以会报告一个错误。我们该怎么办?见下文

如何在Windows平台上用vs2017创建动态库

2.1解决了Lib文件没有生成,函数没有显式导出的问题

有两种方法可以确定动态库中哪些函数可以导出以供外部直接使用,并同时生成。与DLL对应的Lib文件

(1)MSVC编译器提供关键字\Declspec来指定指定符号的导入和导出,即\Declspec attribute关键字

_Declspec(dllexport)表示符号是从此DLL导出的符号:这是在DLL中定义函数所必需的源代码。如果没有显式使用某些符号,则将使用DLL。虽然没有语法错误,但无法编译,因为DLL中的函数没有公开,所以找不到它

_Declspec(dllimport)表示符号是从其他DLL导入的:当我们使用DLL中公开的函数时,可以直接使用公开的函数,也可以直观地导入函数,这样编译器就可以生成质量更好的代码。由于编译器准确地知道函数是否在DLL中,因此它可以生成更好的代码,并且不需要间接的调用转发。具体如下:

__Declspec(dllimport)void func1(void);//显示的导入DLL中公开的函数

int主(空)

你知道吗{

func1()

}你知道吗

稍后我们将讨论如何使用它来创建动态库

(2)使用“xxx.定义用于声明导入和导出符号的文件

我们也不能用它来创建动态库,我们会按照正常的编程,比如mymath。H和我的数学.cpp内的内容,然后显示添加一个xxx.定义文件,如何添加?你知道吗

如下所示:右键单击“项目”/“添加”/“新建项”,然后选择以下文件:

[k14号]

[k15号]

默认值是使用源.def我们可以自定义名称。至于def文件如何指定导出哪些内容和不导出哪些内容,我暂时不作解释。请参考以下条款:

/qwq1503/文章/细节/85696279

/三次进入北京/archive/2010/08/04/1792099.html

程序员的自我修养:链接,装载与库 pdf_维度链接库属于基本链接库_c++ 动态链接库

2.2使用Declspec创建动态库

(1)创建新的空项目或使用DLL模板

我习惯于使用干净的、空的项目,没有那么多附加文档

添加头文件mymath。小时

//我的数学

命名空间mycal

你知道吗{

__declspec(dllexport)int add(int ac++ 动态链接库,int b)

__declspec(dllexport)int sub(int a,int b)

}你知道吗

#pragma一次

注意:实际上是在要定义的函数前面加一个函数,Declspec(dllexport)以两个短下划线开头!说明这两个函数是公开的,可以直接使用。未公开的函数不能在DLL中使用

(2)实现了功能的内容

定义我的数学.cpp文件

//你知道吗我的数学.cpp你知道吗

#包括“myMath.h”

int mycal::add(int x,int y)

你知道吗{

返回x+y

}你知道吗

int mycal::sub(int x,int y)

你知道吗{

返回x-y

}你知道吗

这个地方与我们通常的实现完全相同,不需要再添加Declspec(dllexport)

(3)生成项目

例如,我选择生成一个版本64位结果

结果如下

[第21页]

[第22页]

我们找到了一对匹配的xxx.dll以及xxx.lib文件文件,大小不一样!你知道吗

动态链接库的使用

如上所述,在Windows上生成的DLL需要三样东西:头文件、DLL文件和DLL对应的lib文件

这里都有。如何配置新项目?你知道吗

三步配置

(1)步骤1:配置包含路径——即头文件所在的路径

(2)步骤2:配置库路径——即lib所在的路径

(3)第3步:添加一个链接计算.lib添加到链接器

我不想在这里详述

代码如下:

#包括

#Include//添加您自己定义的标题

int main()

你知道吗{

int x=100

int y=20

内景a,b

a=mycal::add(x,y)

b=mycal::sub(x,y)

printf(“%d%d\n”,a,b)

getchar()

返回0

}你知道吗

现在,生成中没有错误,但是操作仍然会报告错误,因为需要运行动态链接库,所以需要配置动态链接库

有三种方式,本文采用最简单的方式,直接将DLL和可执行文件复制在一起

然后运行上述程序,结果如下:

120 80个

以上是创建和使用动态链接库的全过程

四、VisualStudio提供了一个命令行工具:dumpbin

这个工具不需要我们自己安装。我们可以通过安装vs直接使用,打开vs的命令行工具如下:

[第28页]

[第28页]

这个工具有什么用?简而言之,它可以检查lib文件和DLL文件提供了哪些函数凤凰体育平台 ,并显示哪些函数可用。它还可以检查EXE文件中包含哪些静态库和动态库

检查o