您的位置:首页 > 编程语言 > C语言/C++

C++中静态链接库与动态链接库的介绍与使用

2013-12-26 12:47 246 查看
C++中静态链接库与动态链接库的介绍与使用

一,简介

1.静态库

函数与数据被编译进一个二进制文件(通常扩展名为.lib),在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们

和应用程序的其他模块组合起来创建最终的可执行文件(.EXE),当发布产品时,只需要发布这个可执行文件,并不需要发布使用了的静态库

2.动态库

在使用动态库的时候,往往需要提供两个文件:一个引入库文件(.lib)和一个DLL(.dll)文件,虽然引入库的文件后缀也是.lib,但是动态库的引入库文件

和静态库有着本质上的区别,对于一个DLL来说,其引入库文件(.lib)包含该DLL导出的函数和变量的符号名,而.dll文件包含该DLL实际的函数和数据,当

使用动态库的时候,编译链接可执行文件时,只需要链接该DLL的引入库文件,该DLL中的函数代码和数据并不复制到可执行文件中,直到可执行文件运行

时,才去加载所需的DLL,将该DLL映射到进程的地址空间中,然后访问DLL中导出的函数,在发布产品时,除了可执行程序以外,同时还要发布该程序将要

调用的动态链接库。

二,动态链接库的加载与使用

1.创建动态链接库

注意:创建的是空的win32 DLL 项目

//calc.cpp

int add(int a,int b)

{

return a+b;

}

int sub(int a,int b)

{

return a-b;

}

编译生成之后,会在项目路径中的Debug目录下发现calc.dll,但是我们会发现找不到前面提到的很重要的一项引入库文件calc.lib,这是为什么?这里我们

就需要使用Visual Studio 2010 中的一项功能:dumpbin命令。dumpbin命令是在visual studio 2010 中bin中的一个命令,我们可以先进入vs 命令提示符

工具->vs 2010 命令提示符,然后使用命令 dumpbin -exports (.dll 路径),例如我的就是:dumpbin -exports E:\VS_Project\calc\Debug\calc.dll,然后发现

这里面显示的信息并没有我们的这两个函数,原因是因为:我们需要使用的dll文件中的函数都必须是导出的,好的,那么我们再重新更改一下calc.cpp源文件:

//calc.cpp(修改版)

_declspec(dllexport)  int add(int a,int b)

{

return a+b;

}

_declspec(dllexport)  int sub(int a,int b)

{

return a-b;

}

再次的我们编译生成,到debug目录下,我们会发现我们需要的calc.lib引导库文件找到了,再次的我们敲下 dumpbin命令,我们会发现,多出了两行关于函数信息

编号分别为1和2,不过函数名是不是有点费解呢?有兴趣的话可以去了解一下。这样,我们就得到了我们需要的dll以及其引导库文件lib

2.动态链接库的加载

首先我们新建一个测试程序testdll,添加源代码test.cpp如下:

//test.cpp

#include<iostream>

using namespace std;

extern int add(int a,int b);

extern int sub(int a,int b);

int  main()

{

    cout<<add(1,2)<<endl;

    cout<<sub(2,3)<<endl;

    system("pause");

return 0;

}

注意:我们在使用动态链接库时,首先要配置好环境变量,在使用函数时先声明,再使用,如何配置呢?其实很简单,主要目的就是系统能找到该dll,怎么做呢?

方法有很多,这里介绍一个最简单的一种:首先将生成的calc.dll和calc.lib复制到测试程序也即需要使用该dll的项目文件夹下,然后将项目属性中链接器中的输入

里面有个附加依赖项中添加calc.lib,也即添加引导库文件,就这样配置好了。

最后编译运行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++