现在的位置: 首页 > 综合 > 正文

如何生成 动态库 和 静态库

2013年12月10日 ⁄ 综合 ⁄ 共 2892字 ⁄ 字号 评论关闭
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 文件(导入库)

抱歉!评论已关闭.