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

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_ProjectcalcDebugcalc.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,也即添加引导库文件,就这样配置好了。

最后编译运行


原文地址:https://www.cnblogs.com/ainima/p/6331143.html