VS2013生成DLL文件html
通常来讲项目偏心生成dll动态库文件,由于能够解决静态库形成的空间浪费和更新困难问题,另外建立静态库时,我通常是创建空项目后,在项目配置类型中进行选择。程序员
什么是库github
库是写好的现有的,成熟的,能够复用的代码。现实中每一个程序都要依赖不少基础的底层库,不可能每一个人的代码都从零开始,所以库的存在乎义非同寻常。本质上来讲库是一种可执行代码的二进制形式,能够被操做系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。windows
所谓静态、动态是指连接。回顾一下,将一个程序编译成可执行程序的步骤:函数
静态库ui
之因此称为【静态库】,是由于在连接阶段,会将汇编生成的目标文件.o与引用到的库一块儿连接打包到可执行文件中。所以对应的连接方式称为静态连接。spa
试想一下,静态库与汇编生成的目标文件一块儿连接为可执行文件,那么静态库一定跟.o文件格式类似。其实一个静态库能够简单当作是一组目标文件(.o/.obj文件)的集合,即不少目标文件通过压缩打包后造成的一个文件。操作系统
静态库优缺点总结:.net
1. 静态库对函数库的连接是放在编译时期完成的。
2. 程序在运行时与函数库再无瓜葛,移植方便。
3. 浪费空间和资源,由于全部相关的目标文件与牵涉到的函数库被连接合成一个可执行文件。
Windows下建立与使用静态库
建立静态库(.lib)
建立静态库有两种方法。
(1)建立项目时进行设置
建立win32控制台程序时,勾选静态库类型(下面的预编译等选项可选可不选);打开工程“属性面板”-”配置属性”-”常规”,配置类型选择静态库。
(2)生成项目时进行设置
建立空项目以后,生成项目时,选择项目-属性-配置属性-常规-项目默认值-配置类型-选择生成静态库lib。
程序编译经过后,Build项目便可生成静态库。便可生成.lib,输出栏会显示出静态库的位置。
拷贝到工程目录下
右击项目 - 在文件资源管理器中打开文件夹 - 将文件拷贝至工程目录下
使用静态库
若是将静态连接库和头文件拷贝到工程目录下,则能够只进行这一步:“属性面板”-”配置属性”-“连接器”-”输入”,附加依赖库中输入静态库名StaticLibrary.lib,或者采用如下语句:
1 #pragma comment(lib, "./StaticLibrary.lib");
若是没有进行拷贝,则须要经过“属性面板”-”配置属性”-“VC++目录”-”库目录”,将路径添加到工程中,另外在附加依赖库目录中输入静态库所在目录。
动态库
经过上面的介绍发现静态库,容易使用和理解,也达到了代码复用的目的,那为何还须要动态库呢?
为何还须要动态库(静态库的缺点)?
为何须要动态库,其实也是静态库的特色致使。
1.空间浪费是静态库的一个问题。
2.另外一个问题是静态库对程序的更新、部署和发布也会带来麻烦。若是静态库lib更新了,全部使用它的应用程序都须要从新编译、发布给用户(对于玩家来讲,多是一个很小的改动,却致使整个程序从新下载,全量更新)。
动态库在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入。不一样的应用程序若是调用相同的库,那么在内存里只须要有一份该共享库的实例,规避了空间浪费问题。动态库在程序运行时才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只须要更新动态库便可,增量更新。
动态库特色总结:
1.动态库把对一些库函数的连接载入推迟到程序运行的时期。
2.能够实现进程之间的资源共享。(所以动态库也称为共享库)
3.将一些程序升级变得简单。
4.甚至能够真正作到连接载入彻底由程序员在程序代码中控制(显示调用)。
Windows下建立与使用动态库
建立动态库(.dll)
建立动态库一样有两种方法,建立前设置和生成项目时设置。
(1)建立前设置
建立前设置步骤以下:单击“新建项目”,选择“Win32 项目”,选择“下一步”,而后到了以下界面:点击“DLL”,并同时点击“导出符号”。而后点击“完成”。“导出符号”,将为咱们建立生成DLL的模板。仔细观察,vs自动为咱们建立了示例,导出变量nMakeDLL,导出函数fnMakeDLL和导出类CMakeDLL。若是上面没有点击“导出符号”,将不会生成这些。因此为了方便DLL的建立,咱们最好仍是使用“导出符号”。
先看下面这段代码:
1 #ifdef MAKEDLL_EXPORTS 2 3 #define MAKEDLL_API __declspec(dllexport) 4 5 #else 6 7 #define MAKEDLL_API __declspec(dllimport) 8 9 #endif
若是定义了MAKEDLL_EXPORTS,而后咱们再定义MAKEDLL_API为__declspec(dllexport),不然咱们定义__declspec(dllimport)。前者主要为生成DLL的项目所使用,后者为使用DLL的项目所使用。dllexport和dllimport存储类特性是C和C++语言的Microsoft专用扩展。可使用它们从 DLL 中导出或向其中导入函数、数据和对象。
为何要使用__declspec(dllexport)与__declspec(dllimport),及二者的区别:都是DLL内的关键字,即导出与导入。他们是将DLL内部的类与函数以及数据导出与导入时使用的。主要区别在于,dllexport是在这些类、函数以 及数据的申明的时候使用。用过代表这些东西能够被外部函数使用,即(dllexport)是把DLL中的相关代码(类,函数,数据)暴露出来为其余应用程 序使用。使用了(dllexport)关键字,至关于声明了紧接在(dllexport)关键字后面的相关内容是能够为其余程序使用的。而 dllimport关键字是在外部程序须要使用DLL内相关内容时使用的关键字。当一个外部程序要使用DLL内部代码(类,函数,全局变量)时,只须要在 程序内部使用(dllimport)关键字声明须要使用的代码就能够了,即(dllimport)关键字是在外部程序须要使用DLL内部相关内容的时候才使用。(dllimport)做用是把DLL中的相关代码插入到应用程序中。若是没有使用dllexport导出函数,将没法生成lib文件,只能生成dll文件。
接下来,你能够改写上面的类和函数,而后点击项目,选择“生成”便可产生DLL和LIB。为了简化起见,本例只考虑导出函数。
修改完成后点击Build项目,在输出栏显示dll文件的生成位置。
(2)生成项目时设置
这种方法要求生成动态库须要设置工程属性,打开工程“属性面板”-”配置属性”-”常规”,配置类型选择动态库。但这种方法是创建空项目,所以,须要在头文件中手动设置__declspec(dllexport)等语句。
能够直接使用上面那段代码,也能够只在导出的函数前加__declspec(dllexport),注意:前面是两条下划线
生成的DLL文件以下图所示:
这里可能你们有个疑问,动态库怎么还有一个DynamicLibrary.lib文件?即不管是静态连接库仍是动态连接库,最后都有lib文件,那么二者区别是什么呢?其实,两个是彻底不同的东西。
StaticLibrary.lib的大小为190KB,DynamicLibrary.lib的大小为3KB,静态库对应的lib文件叫静态库,动态库对应的lib文件叫导入库。实际上静态库自己就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。
使用动态库
在引用一个新的dll时,咱们通常须要dll的.h,.lib和.dll三个文件。
将三个文件拷贝到工程目录下,对于lib和头文件的使用方法与静态连接库相同,这时直接运行程序,可能会出现一个错误,说“缺乏什么dll”,咱们只需将此前生成的dll,放在debug或release目录下,便可编译经过。
使用方法总结
.h,.lib,.dll的添加方法其实各有不少种。
.h有两种:
1. 头文件较少时,直接放在工程目录下,#include "*.h"
2. 创建include文件夹,放在里面,而后在项目属性的“VC++目录”-》“包含目录”,添加.h路径便可。
.lib的方法有两种
1.lib文件较少时,直接放在工程目录下,#pragma comment(lib, "testCpp.lib")
2.创建lib文件夹,目属“VC++目录”-》“库目录”添加路径,而后在项目属性的“连接器”-》“输入”-》“附加依赖项”,添加.lib名字。
dll的方法有两种
1.直接放在debug/release目录下
2.创建bin文件夹,放在里面,而后在项目“环境”中添加bin的路径(PS:最好不要用这个)
以上皆能够自由组合。
-------------------------------------------------------------------------------------------
欢迎访问图像计数项目总结:基于图像处理的毛毡垫计数项目总结
Github地址:Extract-inner-image
yolo-windows项目开源代码:LargeImageDetect-yolo-windows