这几天看了许多关于生成Dll的博文,很有感触,遂整理在此,以供自己后续参考。

VS2013创建DLL

我们使用vs2013来生成Dll,其实使用其他的版本也是同理如此。步骤如下:

单击“新建项目”,选择“Win32 项目”,选择“下一步”,然后到了如下界面:

点击“DLL”,并同时点击“导出符号”。然后点击“完成”。

值得说明的是:

为什么要导出符号呢?

这是因为“导出符号”,将为我们创建生成DLL的模板。

仔细观察,vs自动为我们创建了导出变量nMakeDLL,导出函数fnMakeDLL,导出类CMakeDLL。如果上面没有点击“导出符号”,将不会生成这些。所以为了方便DLL的创建,我们最好还是使用“导出符号”。

接下来,你可以改写上面的类和函数,然后点击项目,选择“生成”即可产生DLL和LIB。此处细节可参考《vs2010创建并使用DLL》。

细节的阐述

1.dllexport与dllimport的介绍

先看下面这段代码:

#ifdef MAKEDLL_EXPORTS
#define MAKEDLL_API __declspec(dllexport)
#else
#define MAKEDLL_API __declspec(dllimport)
#endif

我们逐条解释。

如果定义了MAKEDLL_EXPORTS,然后我们再定义MAKEDLL_API为__declspec(dllexport),否则我们定义__declspec(dllimport)。前者主要为生成DLL的项目所使用,后者为使用DLL的项目所使用。dllexport 和 dllimport 存储类特性是 C 和 C++ 语言的 Microsoft 专用扩展。可以使用它们从 DLL 中导出或向其中导入函数、数据和对象。使用这两个特性,将会优化导入导出,至于具体怎么优化,可参考msdn上的解读《dllexport,dllimport》.

事实上MAKEDLL_EXPORTS在创建DLL时是默认定义的,每当创建一个新的DLL项目时,vs会自动生成MAKEDLL_EXPORTS,我们可以在项目的属性中看到:

2.lib与dll的使用

而在引用一个新的dll时,比如我们采用静态引用的方法时,我们一般需要dll的.h,.lib和.dll三个文件,这时我们在新建项目的“属性”中选择“C/C++”-》“常规”-》“附加包含目录”,添加.h的路径,在“链接器”—》“常规”-》“附加库目录”中添加.lib的路径,同时我们还需要添加.lib的附加依赖项,这时可在“链接器”—》“输入”—》“附加依赖项”,填写**.lib ,最后还需要加载dll的路径,此时有两种方法最为常见。第一种,我们先直接运行程序,这时会出现一个错误,说“缺少什么dll”,我们只需将此前生成的dll,放在debug或release目录下,即可编译通过。第二种方法,直接将dll放在与.cpp同一目录下,即可编译通过。或者你也可以放在某一个新建的bin文件下,然后在项目的“path”中填写.bin的路径,如下所示:

填写路径时注意,前面的"path=%path%;" 必须有,后面可填写绝对路径相对路径

另外我们再仔细讲讲lib的使用。

使用lib库有两个方法,一个是直接把lib引到工程目录下,在需要用到的地方include一下就可以。代码是:

#pragma comment(lib, "testCpp.lib")

另外一个方法是直接设置库路径,就不用把lib引到工程目录下了。直接点开工程属性,在配置属性-》连接器-》常规-》附加库目录中添加库

之后确认。

在配置属性-》连接器-》输入-》附加依赖项。如图填写

之后确定,运行工程就可以了。

总结一下,我们使用别人的库时,如果想偷懒的话,将.h,.lib,.dll都放在工程目录下,最后会发现我们需要在使用dll的main函数中加载上头文件,再像第一种方法一样,链接lib,就可以直接使用了。可参考文件:testDLL.zip

但是我更推崇另一种方法,就是我们单独建立include,bin,lib文件夹,然后将他们分别按照上面的方法链接上。这样如果要添加的库比较多时,会更加整齐,可读。

总的来说;.h,.lib,.dll的添加方法其实各有很多种,其中.h有两种:

1. 直接放在工程目录下

2. 建立include文件夹,放在里面,然后在项目属性的“C/C++”-》“常规”-》“附加包含目录”,添加.h路径即可。

.lib的方法有两种

1.直接放在工程目录下

2.建立lib文件夹,放在里面,然后在项目属性的“链接器”-》“常规”-》“附加库目录”,添加.lib路径即可。

dll的方法有两种

1.直接放在工程目录下

2.建立bin文件夹,放在里面,然后在项目“环境”中添加bin的路径

.lib的附加依赖项有2种:

1.在“链接器”——》“输入”-》“附加依赖项”,填写lib名称

2.在main文件前面,添加语句:

#pragma comment(lib, "testCpp.lib")

以上皆可以自由组合。

参考文献:

1.演练:创建和使用动态链接库 (C++)

2. C++的dllexport和dllimport

3.VS2013创建dll动态链接库文件心得

4.VS2010创建并使用DLL



vs2013创建及使用DLL相关推荐

  1. C#创建和调用DLL

    一.写在前面 C# 语言是一种简单但功能强大的编程语言,用于编写企业应用程序. C# 语言从C和 C++语言演化而来,在语句.表达式和运算符方面使用了许多 C++ 功能. C# 语言在类型安全性.版本 ...

  2. 在VS2010平台上创建并使用dll

    一.为什么需要dll 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,如ATL.M ...

  3. 怎么创建dllwenjian_如何创建和使用dll及lib文件

    Abstract 如何在VC9环境下创建和使用dll及lib文件,但不用MFC. 一.创建dll 参见文章[zz]lib和dll文件的区别和联系.用方法一,在VC9下测试通过. 创建一个Dynamic ...

  4. 利用C语言创建和使用DLL文件

                有感于讲C语言的DLL文件的文章很少,自己查了半天,写了这么个非常简单的教程.自己也是摸C语言不久,依然感觉处于编程苦手的阶段. 1)为什么使用DLL文件 C语言复用代码有很多 ...

  5. TB创建公式应用dll失败 请检查用户权限,终极解决方案

    使用TB遇到问题, 编译公式时提示,创建公式应用dll失败,请检查用户权限 尝试了多种方法后最终搞定 将方案整理下,后续有遇到的战友可用参考下 1,权限问题:使用,右键,管理员权限启动 2,登录电脑系 ...

  6. 创建与使用DLL项目常见错误和解决办法

    前面讲原理有点啰嗦,如果直接看创建和使用DLL,直接跳转到[DLL项目创建]. DLL 在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件, ...

  7. vb6调用python识别训练例子_在vb6中创建的“标准”dll在python中调用时会出现访问冲突...

    从vb6dll导出函数的最简单方法是使用vbAdvance add-in,现在它是免费软件.在 您面临的问题是,您需要在调用导出的线程上初始化VB6运行时.这包括初始化COM单元(STA).最简单的方 ...

  8. 杂记2:VS2013创建Windows服务实现自动发送邮件

    这篇随笔里,我将介绍如何用VS2013开发Windows服务项目,实现的功能是定时发送电子邮件. 开发环境:VS2013,SQL Server2008,采用C#语言开发 步骤一:创建Windows服务 ...

  9. C++ Builder创建和调用dll中的资源

    程序开发中经常会用到一些图标.图片.光标.声音等,我们称它们为资源(Resource).当多个窗口用到同样的资源时,可以将这些公共的资源放到一个dll文件里调用,这样,由于定位资源比在磁盘中定位文件花 ...

最新文章

  1. python列表解析的新方法
  2. getbean方法找不到bean_和平精英:一直找不到敌人?5个方法,让你彻底摆脱“瞎子”...
  3. 操作系统中的同步和异步
  4. es6 语法 (Decorator)
  5. macOS Unlocker3.0
  6. 专注NLP、推荐等AI算法招聘群,慢者无,包括几乎所有公司最新信息
  7. 端侧机器学习框架 Tensorlfow Lite
  8. 聊聊React的路由React-Router、react-router-dom
  9. java简历vue专业技能_用vue 写一个好看的个人简历
  10. Beego 使用redigo连接redis
  11. Samsung Bada程序介绍——BeijingPark
  12. 中文写代码?开始不信后来用中文写了剧情小游戏!嗯,真香~
  13. 问佛----如果浮躁了,静下来看看
  14. XR872图传声传小例程——无线传输
  15. 关于EVAL()函数(一)
  16. 微信小程序上传多张图片
  17. 文件查重FindDupFile
  18. 浅谈激光的单色性与相干性
  19. 树根互联冲刺科创板上市:累计亏损超11亿元,和三一重工关系密切
  20. 第十三周 任务四

热门文章

  1. vue3源码中的最长递增子序列
  2. vue2使用axios post跳坑,封装成模块
  3. 面向对象之三大特性:继承,封装,多态
  4. Markdown预览功能不可用解决方案
  5. JMS-activMq与spring进行整合
  6. bug__android studio 出现布局文件不提示,且点击代码不能跟踪代码
  7. pydebugger
  8. Visual Studio 常用快捷键 (二)
  9. C#颜色和名称样式对照表【转载】
  10. spring-boot注解详解(五)