chaoshu的个人博客分享 http://blog.sciencenet.cn/u/chaoshu

博文

DLL项目建立及调试方法

已有 7546 次阅读 2016-7-21 15:15 |个人分类:RTKLIB|系统分类:科研笔记

最近需要将rtklib的一些功能提取出来,生成动态链接供其他程序调用;

参考资料

调试动态链接库(DLL)http://www.tuicool.com/articles/aQfmIb

利用VS生成.lib及.dll文件http://wangzi6147.github.io/2015/05/05/DLL.html

1)lib文件与.dll文件

.lib文件称作静态链接库,.dll文件称作动态链接库。linux系统下对应的文件为.a文件及.so文件。

Windows平台下c++程序与库的链接有两种方式:静态链接与动态链接。

静态链接只需要.lib文件,此时.lib文件作为静态链接库。打包好的程序只有.exe文件,文件体积较大。

动态链接需要.lib及.dll文件,此时.dll文件作为动态链接库,而.lib文件作为库的入口,被打包到.exe文件中。此时打包好的程序包括.exe文件及.dll文件。

比较这两种方式,显然动态链接更灵活。如果发布的程序需要更新库里的内容,只需要更新对应的dll文件即可,而对其他文件不需要做修改。相反静态链接方式需要更新整个.exe程序,而且会使得.exe文件体积庞大。

2)如何利用VS2013生成.lib及.dll文件

这里以VS2013为例,生成动态链接库。

a、首先创建一个DLL工程:

b、添加源文件及头文件:


c、头文件里定义DLL_API函数(即调用者可以从外部调用的函数):

#ifdef DLL_API  

#else  

#define DLL_API __declspec(dllexport)  

#endif  

// 这里以加法为例,其中DLL_API代表可供调用者调用的函数

DLL_API int add(int a, int b);


源文件里实现这个add函数:

#include "dll_test.h"  

int add(int a, int b)

{

return a + b;

}

好,现在可以右键工程生成一下,我们可以在Debug文件夹里看到如下文件:

其中.lib文件及.dll文件就是我们打包好的库文件。如果其他工程要调用这个库,需要做的是:

1.工程包含dll_test.h头文件;

2.工程包含.lib链接库,作为动态链接库的入口;

3.将.dll文件与生成的.exe文件放在同一目录下,或者将.dll文件所在目录添加到系统环境变量中并重启计算机。

d、几点注意

上面的例子只生成了Debug版本的库文件,如需Release版本,需要重新在Release模式下生成一次。

默认的工程依赖VS环境,如果在没有VS环境机器上不能直接运行。解决办法是工程右键-属性-C/C++-代码生成-运行库,改为/MT(Release)或者/MTd(Debug)

如果生成的库依赖其他动态链接库,需要把依赖的.dll文件一同打包发布。

3)调试DLL

我们在编写程序的过程中,调试是必不可少的步骤,使用vs所带的调试器,即强大也好用,但是对于一般的exe程序,项目中通常只有一个主程序,也就是我们编写的,这样的程序可以具有自己独立的虚拟地址空间,可以独立运行,那么我们在代码中加入断点,调试运行的时候,当运行到断点处的时候,程序就会停止在代码处。通过调试,一方面我们可以知道程序执行的顺序,另一方面可以发现内存存取的错误,或是参数不对等造成的错误,帮助我们及时的纠正,但是对于动态链接库,DLL,它也是一个可执行程序,但是它没有自己独立的虚拟地址空间,在运行的时候,是吧自己的地址映射到exe的虚拟地址空间中,进行执行调用。既然,他不能直接执行,那么如果我们建立一个DLL工程,建立一个DLL项目,又如何才可以加入断点,调试运行呢?下面我就结合实例讲述一下如何调试DLL。

DLL不能单独的执行,所以我们必须要建立一个可执行程序项目,通过这个项目来调用我们编写DLL。一般情况下,如果我们是先编写了DLL项目,那么我就可以再在这个项目解决方案中添加一个新建项目,添加一个新建项目的过程和我们建立普通项目是一样,不一样的是,平时我们利用向导建立项目的时候,只有一个解决方案,一个解决方案中只有一个项目,而在这里是一个解决方案中两个项目;如果我们是先编写了一个可执行程序,也可以通过上面说的方法,在现有的解决方案中添加一个新的项目,建立一个DLL项目。不管如何做,就是要让DLL项目和测试DLL的可执行程序在同一个解决方案中。如下图:


使用默认生成一个新项目。


其中test是测试DLL的程序,dll_test是DLL程序

接着我们要在测试dll的程序中引用dll程序,也就是引用dll_test项目,在test项目上(上图)点右键,选择引用菜单项。得到如下图显示:


一般情况下,这里的这个“框架和引用”选项是空的,我们在这里选择添加引用,在添加引用中,我们就可以看到我们刚才的dll_test项目了,我们选择这个项目,点击添加,上图是已经添加好的引用的结果图,就是这样的。这样,dll项目已经被测试dll(test)项目引用了,这个时候,我们就像使用普通的dll的步骤一样,准备将在test代码中使用了,如添加头文件,lib,加载dll等等:

完成上面的设置,可以进行DLL的调试了,如下:

假如最后编译没有错,运行时候出现找不到dll文件,那就把上面生成的dll文件放到工程根目录的debug目录下面就可以啦!




https://blog.sciencenet.cn/blog-858128-992020.html

上一篇:GMT绘制GPS速度场
下一篇:DLL显式调用与TCP传输结构体
收藏 IP: 219.140.192.*| 热度|

1 yangb919

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-28 11:18

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部