我们经常在做各种二次开发的时候都会使用卖方提供的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 }
运行结果:
测试成功咯!!!