简单的制作一个动态链接库(DLL)

什么是静态链接库,动态链接库?

静态链接库是一个lib文件,动态链接库是一个dll文件。他们都是把一个或多个函数,代码封装起来,所形成的一个文件。

为什么需要用链接库呢?

因为有的时候,像是一个大的项目,他有许多各类的功能模块,但是这些功能很庞大,不方便修改。那么如果用链接库的话,每个模块做成一个链接库,就相当于每个模块都做成函数封装起来,然后可以在主程序中调用这些链接库,相当于调用函数,就实现了这整个项目。这样的好处就是每个模块,每个功能,封装成链接库,实现了模块化,这样的话,假如说某个模块出了问题,你只需要把这个模块的链接库进行修改,而不需要大费周折的修改整个项目

为什么同样是链接库,却有静态和动态之分呢?

没错,静态链接库和动态链接库都是链接库,都是把函数封装起来。
但是静态链接库(lib)在被程序调用的时候,程序是把静态链接库所提供的代码放到程序里了,就是编译的时候就把代码放到程序里头了,编译到程序里了,和程序本身融为一体了。这样,下次运行的时候,就不需要这个lib文件了,因为程序已经和lib提供的代码融为一体了。
但是,动态链接库不是这样,它是每次发现要调用dll的函数的时候,到dll中去寻找这些函数,然后再用,而不是在编译的时候就纳入程序。
所以,动态链接库和静态链接库的区别就在于,静态链接库封装的函数在程序编译的时候就放进了程序里面,和程序融为了一体,下次程序调用的时候不需要lib便可使用这个函数了。但是动态链接库封装的函数在编译的时候并不会融入程序,而是在程序需要使用dll中的函数的时候,程序到dll去找这个函数,并且调用它。所以,lib是编译的时候才需要,因为编译完的时候lib的代码程序就已经知道了,dll是程序什么时候都需要,因为一旦程序要用dll里的函数,那么就要到dll里去找到然后调用,所以不能没有,要不然程序到哪里去找他要用的函数?

模块化和伪模块化

前面说到链接库实现了模块化,那么其实lib是伪模块化,dll才真正实现了模块化,为什么这么说呢?因为前面也说了,lib实际上是在编译的时候才用的到,因为编译完的时候,lib里的东西全都放进程序里了,那运行的时候就不必要带上lib了,程序已经知道lib里是什么了,就像你知道1+1=2那考试还带上小抄写着“1+1=2”不是没意思吗?
所以要是你这个程序用的是lib,那么要是用着发现某个模块有问题,那还是要改这整个项目的代码,根本不能实现“模块化”,不能通过只改某个模块的代码就解决问题,因为程序把本来应该分成好几个模块的函数合为一体了,“模块化”只能在写代码的时候体验到,因为那个时候还没有把lib融入程序,故称为“伪模块化”。
而使用dll则能享受“模块化”带来的快感,程序并不会把dll内的代码据为己有,而是每次到dll里去调用,所以只要某个模块出了问题,那么换上一个改好BUG的dll即可让程序“恢复健康”,因为有BUG时,程序到指定的路径寻找代码,找到的代码是有BUG的,是坏的,运行起来也出BUG,但是把dll里的代码换成好的,程序仍到指定路径下寻找代码,找到的代码是好的,那运行起来肯定也是好的,这便真正实现了模块化,哪里有错改哪里。

如何制作一个动态链接库

因为dll才真正实现了模块化,所以这里简单的介绍一下如何创建一个属于自己的dll,供自己使用。
此处以VS2012为例:
新建一个MFC DLL项目
在这里插入图片描述
选择“带静态链接MFC的规则DLL”
在这里插入图片描述打开新生成的DLL项目的源文件“项目名.cpp”并添加代码,这代码就是要封装在DLL内的函数。这里创建一个加法函数,用于举例。
在这里插入图片描述
要在头文件“项目名.h”中声明该函数
但是这里的声明像是这样:

extern "C" __declspec(dllexport) int add(int a,int b);

extern "C"指以C语言的形式定义;
__declspec(dllexport)指导出函数。
在这里插入图片描述
编译成功后,到项目的Debug目录下,找到“项目名.dll”和“项目名.lib”,这时,dll已经生成成功了,很简单。
但是,为什么要生成一个dll和一个lib呢?不是静态链接库才生成lib,动态链接库是生成dll的吗?其实这里生成的lib有一个作用就是帮助程序找到dll。

如何使用动态链接库

我们将编译好的dll和lib放到需要使用dll的程序目录下
在这里插入图片描述然后再在程序中添加如下代码

#pragma comment(lib,"TestDll2.lib")
//加载动态库
extern "C" __declspec(dllimport) int add(int a,int b);
//导入函数add

其中,__declspec(dllimport)是导入函数的意思

在这里插入图片描述然后调用函数:
在这里插入图片描述
运行程序,得到结果3,正解。
在这里插入图片描述
假如这个相加模块出了问题,我们无需更改程序代码,可以直接更改dll的代码再编译出新版本的dll,替换掉现在程序目录下的dll即可,这里便不做演示。

制作一个简单的C++ DLL动态库,你可以按照以下步骤进行: 1. 创建一个C++源文件,实现你想要包含在DLL中的函数或者类。例如,我们创建一个简单的加法函数: ```cpp // add.cpp extern "C" { __declspec(dllexport) int add(int a, int b) { return a + b; } } ``` 2. 使用合适的编译器将该源文件编译成DLL动态库。下面是使用GCC编译器的命令示例: ``` g++ -shared -o add.dll add.cpp ``` 这将会生成一个名为`add.dll`的DLL动态库文件。 请注意,如果你使用的是MSVC编译器,你需要将编译选项中的`-shared`修改为`/DLL`。 3. 确保生成的DLL动态库文件与你的应用程序在同一个目录下,或者将其添加到系统路径中,以便应用程序可以找到它。 4. 在你的C++应用程序中,包含头文件并调用DLL动态库中的函数。 ```cpp // main.cpp #include <iostream> extern "C" { __declspec(dllimport) int add(int a, int b); } int main() { int a = 10; int b = 20; int result = add(a, b); std::cout << "Result: " << result << std::endl; return 0; } ``` 5. 使用合适的编译器将应用程序与DLL动态库链接。下面是使用GCC编译器的命令示例: ``` g++ -o main.exe main.cpp add.dll ``` 请注意,如果你使用的是MSVC编译器,你需要将编译选项中的`-o main.exe`修改为`/Fe:main.exe`。 6. 运行生成的可执行文件,你应该能够看到输出结果。 这只是一个简单的示例,实际应用中可能需要处理更多复杂的函数和数据类型。同时,要确保C++编译器和链接器的配置正确,并且DLL动态库文件存在于应用程序能够找到的路径中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值