我们经常在做各种二次开发的时候都会使用卖方提供的
SDK进行开发,往往卖方并不愿理提供给我源程序而是
给我一个提供一系列函数接口说明和一些封装的动态链接
库。
今天我们就要说说静态链接库和动态链接库,静态链接库
往往以lib后缀结尾,然而动态链接库往往以dll后缀结束。
但是我们不能仅仅以后缀名作为它们二者的区别,比如
动态链接库也可能存在lib后缀的文件,然而这种情况下
lib文件只是保存一些函数符号,正则的提供运行代码的
指令部分仍然存在在dll文件中。
其实从本质上来说,动态链接库是我们再运行程序的时候
在进行链接,然而静态链接库的代码指令是直接包含在最终
的应用程序中,所以我们有使用的动态链接库在生成最终
的程序里,如果一旦将该动态链接库文件删除,程序将提示
确实xxx.dll文件。然而使用静态链接库生成的最终程序里,
我们直接删除静态链接库文件,程序仍然将正常执行。因为
在生成程序的过程中,静态链接库中的代码指令已经完全的
嵌入到了应用程序中了。windows提供的大多数服务都是以
dll形式提供的。
然而静态链接库虽然可移植性强,但是会造成程序很庞大,所以
往往大多数开发接口都是以动态链接库的形式提供的。
下面将展示一个简单的动态链接库的范例:
1.打开vc++6.0新建一个动态链接库工程,取名为Dlldemo:
2创建一个空的DLL工程:
3.我们添加一个头文件为AddDll.h 一个源文件为AddDll.cpp
在本范例中我们将要把下面这个函数封装为动态链接库提供给第三方开发:
int Add(int a,int b) { return a+b; }
4.我们在头文件里添加需要导出的函数的声明:
1 extern "C" _declspec(dllexport) int Add(int a,int b);
5.然后在源文件里面实现这个导出函数:
1 #include "AddDll.h" 2 3 int Add(int a,int b) 4 { 5 return a+b; 6 }
6.编译工程,此时便在工程目录下生成了我们需要的dll文件,如下图所示:
其中AddDll.h提供动态链接库导出函数的声明,Dlldemo.dll文件提供了实际导出函数
的实现代码,不过不再是源代码的形式。Dlldemo.lib提供了导出函数的一些符号列表。
至此动态链接库便成功生成了。
下面我们用一个例子测试:
1.新建一个测试工程为test,在工程中添加一个test.cpp用于测试
2.将上面的三个文件拷贝到test工程目录
3.将Dlldemo.lib用以下两种方式中的一种链接到程序:
一.通过工程-设置-链接-对象/库模块中 添加Dlldemo.lib
二.或者在程序通过#pragma comment(lib,"Dlldemo.lib")
4.在test.cpp包含头文件AddDll.h,同时用以下测试代码:
1 #include "AddDll.h" 2 #include <iostream> 3 using namespace std; 4 #pragma comment(lib,"Dlldemo.lib") 5 int main() 6 { 7 int num1,num2; 8 cout<<"Please input the two number:"<<endl; 9 cin>>num1; 10 cin>>num2; 11 int AddResult; 12 AddResult=Add(num1,num2); 13 cout<<"The Add Result is: "<<AddResult<<endl; 14 return 0; 15 }
运行结果:
测试成功咯,不错不错!!!