如何生成 动态库 和 静态库

1. Static Library
(1) 用 vs2005 做一个静态链接库
新建 Win32控制台应用程序   staticCai
新建 static_lib.h 和 static_lib.cpp 两个文件;

static_lib.h
------------
int add(int x, int y);
int substract(int x, int y);

static_lib.cpp      
---------------
#include "static_lib.h"

int add(int x, int y)
{
return x + y;
}

int substract(int x, int y)
{
return x - y;
}

(2)  配置工程,生成静态链接库
工程属性 -> 配置属性 -> 配置: 所有配置
                                      -> 常规 -> 配置类型: 静态库(.lib)
这样会在 debug文件夹(与staticCai并列)下 生成一个 staticCai.lib文件,这个就是我们做好的静态链接库。

(3) 使用这个静态链接库
新建一个 Win32控制台程序 staticLibCall,新建 main.cpp 内容如下:

main.cpp
--------
#include <iostream>
#include "static_lib.h"

#pragma comment(lib,"staticCai.lib")      // 等同于:项目,属性,连接器,添加依赖项的效果。

using namespace std;

int main()
{
cout << add(3,4) << endl;
cout << substract(5,3) << endl;
return 0;
}
并将 staticCai.lib 和 static_lib.h 这两个文件 拷贝到与 main.cpp 并列的文件夹下。
配置下工程属性: -> 常规 -> 配置类型: 应用程序(.exe)
然后,我们编译,链接执行程序,就会出结果了。

把刚刚拷贝过来的staticCai.lib给删了,我们发现,程序照样执行,但是不能再链接了。
所以,链接时需要静态链接库,一旦链接成功,生成了可执行文件,那么,静态链接库就不再需要了。

2. Dynamic Link Library
(1) 建工程:dllCai,
    新建文件:dll.cpp
dll.cpp(为了简单,这里不做 .h文件了)
-----------------------
#define   DLL_API _declspec(dllexport)
#include <iostream>
using namespace std;

DLL_API int add(int a,int b)    //实现两个整数相加
{
return a+b;
}

DLL_API int subtract(int a,int b)    //实现两个整数相减
{
           return a-b;
}

(2) 配置,编译,生成解决方案。
在debug文件夹下生成 dllCai.dll 和 dllCai.lib。
至此,动态链接库就做好了。

(3) 使用 动态链接库。
新建一个工程dllCaiCall,建立文件 main.cpp

main.cpp
-------------------
#include <iostream>
using namespace std ;

#pragma comment(lib, "dllCai.lib")

extern int add(int a,int b);
extern int subtract(int a,int b);

int main()
{
           cout << add(3 ,4) << endl ;
           cout << subtract(5 , 3) << endl ;

           return 0 ;
}
然后把dllCai.dll 和 dllCai.lib拷贝到与main.cpp并列的目录下。接着,编译链接,执行。

把dllCai.lib删了,程序照样执行,但是不能再链接了;
把dllCai.dll删了,程序可以再编译,链接,但是执行的时候不行。
所以,动态链接库,链接的时候需要 .lib文件,运行的时候需要 .dll文件。
静态链接库和动态链接库做一下对比和补充:
1 、 两个lib文件

我们发现,无论是静态链接库还是动态链接库,最后都有lib文件,那么两者区别是什么呢?其实,两个是完全不一样的东西。staticCai.lib的大小为4KB,dllCai.lib的大小为2KB,静态库对应的lib文件叫静态库,动态库对应的lib文件叫导入库。实际上静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。

2 、 对 于静态链接库,我们在编译和链接的时候已经将所有的代码都导入进来,因此,当生成可执行文件以后, 可执行文件包含所有的代码。因此,在可执行文件运行时就不再需要静态库了,这也是为什么我们删掉staticCai.lib程序照样执行;而 对于动态链接库,实际上,可执行文件不包含DLL中的内容,只是通过导入库(.lib)知道了相应的地址信息,因此, 可执行文件在运行时动态得去加载DLL,这也是为什么我们删掉dllCai.dll后程序就不能执行了。

3 、   对于DLL,我们是可以不要lib文件的

如果不要lib文件,我们可以通过函数指针的使用达到我们的目的:

#define   DLL_API _declspec(dllexport)

#include

using namespace std;    //注意这里的extern "C" , 这里必须加

extern "C" DLL_API int add(int a,int b)    //实现两个整数相加

{

           return a+b;

}

extern "C" DLL_API int subtract(int a,int b)    //实现两个整数相减

{

           return a-b;

}

#include

#include

using namespace std ;

 

typedef int (*func)(int x , int y);   //函数指针

int main()

{

           HINSTANCE hInstance = LoadLibrary("DLL.dll");

           if(hInstance == NULL)

           {

                     cout << "SB" << endl ;

                     return 0;

           }

           func add = (func)GetProcAddress(hInstance, "add");

           func sub = (func)GetProcAddress(hInstance, "subtract");

           cout << (*add)(3,4) << endl ;

           cout << (*sub)(5,3) << endl ;

}

显然,这种方法没有用lib文件方便,如果为了每次调用一个函数还要自己再弄一个函数指针,多麻烦啊,所以,我们在实际开发中,用的众多的第三方扩展库,别人都是提供的:

.h   文件(类,函数的声明)

.dll 文件(类或函数的实现)

.lib 文件(导入库)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值