C/C++ VS2013 动态链接库详解

新建--win32项目--DLL--空项目,在源文件目录下新建一个cpp文件,随便编写两个简单函数,代码如下:

int add(int a, int b)
{
	return a + b;
}

int subtract(int a, int b)
{
	return a - b;
}

然后按 F7 生成,结果如下:

生成了一个 dll 文件,但是这个文件并没有声明函数导出,可以借助 dumpbin.exe 程序来查看 dll 文件是否有函数导出以及导出了哪些函数。

在 D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin 目录下有一个 vcvars32.bat 批处理程序,用于暂时配置使用例如 dumpbin.exe 类似的程序,打开命令提示符 cmd,切换到上面新建的动态链接库项目的 Debug 目录下:

然后直接将  vcvars32.bat 拖拽到cmd中:

Enter 回车运行,没有任何其他显示,则运行正常:

然后输入 dumpbin,回车:

说明dumpbin.exe 程序可以正常运行,现在回车后继续,使用 dumpbin -exports *.dll 命令来查看 dll 文件的函数导出情况:

如上图,dll 文件在没有函数导出声明的情况下是没有任何函数导出的。需要加入如下代码:

_declspec(dllexport) int add(int a, int b)
{
	return a + b;
}

_declspec(dllexport) int subtract(int a, int b)
{
	return a - b;
}

这时重新生成后,如下:

多了一个引入库文件 lib 文件和一个 exp 文件(在使用动态库的时候没用,编译链接的中间文件)。

这时,再运行一下dumpbin 看看结果:

这样就说明 dll 文件可以成功的导出函数了,ordinal是函数的序号,hint是标识(然并卵),RVA是地址,name函数名加入和一些符号,因为C++中支持函数重载,为了区分相同名字的函数的用处。并且,不同的C++编译器对于这种名字的改编方式不一样。

现在我们编写客户端程序来调用刚刚编写的动态链接库文件,同样新建一个简单的控制台程序:

#include <iostream>

using namespace std;

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

int main()
{
	cout << add(5, 3) << endl;
	return 0;
}

因为 add 和 subtract 函数都是外部调用,因此用 extern 关键字来声明这两个函数,但是在生成的时候报出了 Link 错误:

之所以会这样是因为在编译的时候,因为提前对两个函数做出了声明,所以没有编译错误,但是在链接的时候,编译器无法找到这两个函数是在什么位置导出的。

现在我们将之前在 Dll-Test 项目中生成的 Dll-Test.lib 引入库文件拷贝到 Dll-Client 目录下,并且在Dll-Client 项目的属性设置中加入对 Dll-Test.lib 文件的引用:

再次生成,就没有报错了:

并且,我们也可以借助 dumpbin 工具来查看我们的 Dll-Client 程序使用了那些动态链接库,在cmd 中切换到Dll-Client 目录下:

我们可以看到,Dll-Client.exe 这个程序使用到了那些 dll 文件。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 07:25:30

C/C++ VS2013 动态链接库详解的相关文章

[C] linux静态链接库与动态链接库详解

http://blog.chinaunix.net/u2/76292/showart.php?id=1274181 一顺便说说了哦  通常情况下,对函数库的链接是放在编译时期(compile time)完成的.所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file).程序在运行时,与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下.所以这些函数库被成为静态库(static libaray),通常文件名为"libxx

linux静态链接库与动态链接库详解

转:http://bbs.chinaunix.net/thread-1281954-1-1.html 二动态链接库的特点与优势  首先让我们来看一下,把库函数推迟到程序运行时期载入的好处:  1.可以实现进程之间的资源共享.   什么概念呢?就是说,某个程序的在运行中要调用某个动态链接库函数的时候,操作系统首先会查看所有正在运行的程序,看在内存里是否已有此库函数的拷贝了.如果有,则让其共享那一个拷贝:只有没有才链接载入.这样的模式虽然会带来一些“动态链接”额外的开销,却大大的节省了系统的内存资源

静态链接库与动态链接库详解

转载: 关于静态链接库(Lib,.A)与动态链接库(DLL,.SO) (2011-10-10 21:04:26) 转载▼   分类: c.vc.cpp 在windows下一般可以看到后缀为dll和后缀为lib的文件,但这两种文件可以分为三种库,分别是动态链接库(Dynamic-Link Libraries),目标库(Object Libraries)和导入库(Import Libraries),下面一一解释这三种库. 目标库(Object Libraries) 目标库又叫静态链接库,是扩展名为.

使用VS2015创建和使用动态链接库-图文详解

之前看过原创一篇<VS2010 动态库开发--第一章 演练:创建和使用动态链接库 (C++)>的帖子,地址是http://blog.sina.com.cn/s/blog_6fb3686501011ymn.html,感谢原创.这里我们使用VS2015创建和使用自己的动态链接库,配以图文详解. 我们先来演示如何使用VS2015创建一个动态链接库.1.新建一个"Win32控制台应用程序","名称"为MathFuncsDll,"解决方案名称"

c#(winform)环境下使用动态链接库dll的详解

1,什么是dll文件? DLL(Dynamic Link Library)文件为动态链接库文件,又称"应用程序拓展",是软件文件类型.在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中.当我们执行某一个程序时,相应的DLL文件就会被调用.一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件. 2,托管dll和非托管dll区别是什么? 托管DLL就是能够在

SVM -支持向量机原理详解与实践之四

SVM -支持向量机原理详解与实践之四 SVM原理分析 SMO算法分析 SMO即Sequential minmal optimization, 是最快的二次规划的优化算法,特使对线性SVM和稀疏数据性能更优.在正式介绍SMO算法之前,首先要了解坐标上升法. 坐标上升法(Coordinate ascent) 坐标上升法(Coordinate Ascent)简单点说就是它每次通过更新函数中的一维,通过多次的迭代以达到优化函数的目的. 坐标上升法原理讲解 为了更加通用的表示算法的求解过程,我们将算法表

详解LAMP源码编译安装

实战:LAMP源码编译安装 家住海边喜欢浪:zhang789.blog.51cto.com 目录 详解LAMP源码编译安装 LAMP简介 一.准备工作 二.编译安装 Apache 三.编译安装 MySQL 四.编译安装 PHP 测试LAMP搭建开源数据web管理程序phpMyadmin 详解LAMP源码编译安装 LAMP简介 LAMP是当下非常流行的一套Web架构,我们可以在GNU/Linux下通过其他人打包的程序包来进行安装; 但是在生产环境中,很多时候都需要我们自己定制安装AMP,编译安装L

小甲鱼PE详解之输入表(导出表)详解(PE详解09)

小甲鱼PE详解之输出表(导出表)详解(PE详解09) 当PE 文件被执行的时候,Windows 加载器将文件装入内存并将导入表(Export Table) 登记的动态链接库(一般是DLL 格式)文件一并装入地址空间,再根据DLL 文件中的函数导出信息对被执行文件的IAT 进行修正. ( 基础补充:很多朋友可能看到这里会有点懵,各位看官请允许小甲鱼啰嗦一下,照顾初学者.我们都明白Windows 在加载一个程序后就在内存中为该程序开辟一个单独的虚拟地址空间,这样的话在各个程序自己看来,自己就拥有几乎

lucene、lucene.NET详细使用与优化详解

lucene.lucene.NET详细使用与优化详解 2010-02-01 13:51:11 分类: Linux 1 lucene简介1.1 什么是luceneLucene是一个全文搜索框架,而不是应用产品.因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品. 1.2 lucene能做什么要 回答这个问题,先要了解lucene的本质.实际上lucene的功能很单一,说到底,就是你给它若干个字符串,然后它为你提供一个全文搜