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

动态和静态链接库

2014年02月25日 ⁄ 综合 ⁄ 共 1611字 ⁄ 字号 评论关闭

一. 动态链接库和静态链接库

1. 静态库:
         函数和数据被编译进一个二进制文件(通常扩展名为.LIB)。在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其它模块组合起来创建最终的可执行文件(.EXE文件)。
2. 动态链接库:

       在使用动态库的时候,往往提供两个文件:一个引入库和一个DLL。引入库包含被DLL导出的函数和变量的符号名,DLL包含实际的函数和数据。在编译链接可执行文件时,只需要链接引入库,DLL中的函数代码和数据并不复制到可执行文件中,在运行的时候,再去加载DLL,访问DLL中导出的函数。

二. 使用动态链接库的好处

1.    可以采用多种编程语言来编写。
2.    增强产品的功能。
3.    提供二次开发的平台。
4.    简化项目管理。
5.    可以节省磁盘空间和内存。
6.    有助于资源的共享。

7.    有助于实现应用程序的本地化。

三. 链接库的加载方式

1.    隐式链接

2.    显示加载

四. 关键词

_declspec(dllimport) 申明函数为导入的动态链接库函数
_declspec(dllexport) 申明函数为导出的动态链接库函数

_declspec(dllimport)和_declspec(dllexport) 一般放在头文件中,利用条件编译的技巧,使得头文件有两个方面的作用。头文件如下:

#ifndef DLL_1_H // 防止重复包含
#define DLL_1_H
 
 
#ifdef DLL1_API //关键地方
#else
#define DLL1_API _declspec(dllimport)
#endif
 
 
DLL1_API int _stdcall add(int a,int b);
DLL1_API int _stdcall subtract(int a,int b);
 
 
class DLL1_API Point  //在类前面表面整个类的函数都进行导出
{
public:
        voidoutput(int x,int y);
        voidtest();
};
 
 
#endif

cpp执行文件:

#define DLL1_API _declspec(dllexport)
#include "Dll1.h"
#include <Windows.h>
#include <stdio.h>
 
int add(int a,int b)
{
        returna+b;
}
 
int subtract(int a,int b)
{
        returna-b;
}
 
void Point::output(int x,int y)
{
        HWNDhwnd=GetForegroundWindow();
        HDChdc=GetDC(hwnd);
        charbuf[20];
        memset(buf,0,20);
        sprintf(buf,"x=%d,y=%d",x,y);
        TextOut(hdc,0,0,buf,strlen(buf));
        ReleaseDC(hwnd,hdc);
}
 
void Point::test(){}

这样变可以得到两个文件 Dll1.dll 和Dll1.lib  其中lib文件里面是函数的定义,这和静态链接库的lib是不一样的。

五. 其他说明

1. _stdcall 
     有些生成动态链接库的程序中,在函数前添加了_stdcall,这个表明是使用标准的函数导出,这样导出的链接库可以在不同的编译器下使用。
2. extern"C" 
     有的程序在导出函数前使用了extern "C" _declspec(dllimport) 和extern "C" _declspec(dllexport)  这表明使用C语言作为导出,那么C++面向对象风格的类就不能导出使用了。
3. 类的局部导出

    如果不想将整个类进行导出,那么只需要在进行导出的类的成员函数前添加对应的申明即可。

六. 动态链接库的使用

   这个比较简单,就不说了。另外通过dumpbin命令或者Depends工具可以进行dll依赖项的分析。 

抱歉!评论已关闭.