VS2013生成、使用dll,lib文件
一般来说项目偏爱生成dll动态库文件,因为可以解决静态库造成的空间浪费和更新困难问题,另外创建静态库时,我一般是建立空项目后,在项目配置类型中进行选择。
什么是库
库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。
所谓静态、动态是指链接。回顾一下,将一个程序编译成可执行程序的步骤:
静态库
之所以称为【静态库】,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。
试想一下,静态库与汇编生成的目标文件一起链接为可执行文件,那么静态库必定跟.o文件格式相似。其实一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件。
静态库优缺点总结:
1. 静态库对函数库的链接是放在编译时期完成的。
2. 程序在运行时与函数库再无瓜葛,移植方便。
3. 浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。
Windows下创建与使用静态库
创建静态库(.lib)
创建静态库有两种方法。
(1)创建项目时进行设置
创建win32控制台程序时,勾选静态库类型(下面的预编译等选项可选可不选);打开工程“属性面板”-”配置属性”-”常规”,配置类型选择静态库。
(2)生成项目时进行设置
创建空项目之后,生成项目时,选择项目-属性-配置属性-常规-项目默认值-配置类型-选择生成静态库lib。
程序编译通过后,Build项目即可生成静态库。即可生成.lib,输出栏会显示出静态库的位置。
拷贝到工程目录下
右击项目 - 在文件资源管理器中打开文件夹 - 将文件拷贝至工程目录下
使用静态库
如果将静态链接库和头文件拷贝到工程目录下,则可以只进行这一步:“属性面板”-”配置属性”-“链接器”-”输入”,附加依赖库中输入静态库名StaticLibrary.lib,或者采用以下语句:
#pragma comment(lib, "./StaticLibrary.lib");
如果没有进行拷贝,则需要通过“属性面板”-”配置属性”-“VC++目录”-”库目录”,将路径添加到工程中,另外在附加依赖库目录中输入静态库所在目录。
动态库
通过上面的介绍发现静态库,容易使用和理解,也达到了代码复用的目的,那为什么还需要动态库呢?
为什么还需要动态库(静态库的缺点)?
为什么需要动态库,其实也是静态库的特点导致。
1.空间浪费是静态库的一个问题。
2.另一个问题是静态库对程序的更新、部署和发布也会带来麻烦。如果静态库lib更新了,所有使用它的应用程序都需要重新编译、发布给用户(对于玩家来说,可能是一个很小的改动,却导致整个程序重新下载,全量更新)。
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行时才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。动态库在程序运行时才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只需要更新动态库即可,增量更新。
动态库特点总结:
1.动态库把对一些库函数的链接载入推迟到程序运行的时期。
2.可以实现进程之间的资源共享。(因此动态库也称为共享库)
3.将一些程序升级变得简单。
4.甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)。
Windows下创建与使用动态库
创建动态库(.dll)
创建动态库同样有两种方法,创建前设置和生成项目时设置。
(1)创建前设置
创建前设置步骤如下:单击“新建项目”,选择“Win32 项目”,选择“下一步”,然后到了如下界面:点击“DLL”,并同时点击“导出符号”。然后点击“完成”。“导出符号”,将为我们创建生成DLL的模板。仔细观察,vs自动为我们创建了示例,导出变量nMakeDLL,导出函数fnMakeDLL和导出类CMakeDLL。如果上面没有点击“导出符号”,将不会生成这些。所以为了方便DLL的创建,我们最好还是使用“导出符号”。
先看下面这段代码:
#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 中导出或向其中导入函数、数据和对象。
为什么要使用__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:最好不要用这个)
以上皆可以自由组合。
-------------------------------------------------------------------------------------------------
如果上面的资料对你有启发,麻烦点个推荐,让更多人的人看到哦。
关注公众号【两猿社】,懂点互联网,懂点IC的程序猿,带你丰富项目经验哦
VS2013生成、使用dll,lib文件的更多相关文章
- dll,lib文件的导入
这里介绍了两种方式调用,不过我一般用的是第一种,比较方便. 1动态库函数的调用,可以采用静态链接的方式 ,主要步骤如下: 1) 包含DLL中导出的头文件. 2) 采用#pragma comment(l ...
- DLL工程没有生成对应的lib文件
要至少导出一个函数/变量才能产生lib 也就是说得用到__declspec(dllexport)
- c++中.dll与.lib文件的生成与使用的详解
两种库: • 包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library.• 包含函数代码本身,在编译时 ...
- boost_1_34_1在c++builder6编译(把所有dll文件复制到windows系统目录,所以lib文件复制到bcb6\lib目录)
boost_1_34_1.zip boost 正则表达式 bcb6编译boost_1_34 有个项目要对大量的文本信息进行分析,以前的方法是自己写函数然后进行分析.现在发现一个正则表达式的处理方法,其 ...
- WPF开发的界面调用C++生成的dll文件
以引用d1.dll为例. [生成d1.dll] 文件——新建——项目——Visual C++——Win32项目,选择DLL,点击Finish.在d1.cpp中添加代码 #include "s ...
- Keil MDK中单个c文件生成LIB文件
看大多数说的都是简单地将整个工程转换成.LIB,在Project->Options for Target->Output下,选择Create Library,就可以了. 不过这样生成的li ...
- dll = MinGW gcc 生成动态链接库 dll 的一些问题汇总
MinGW gcc 生成动态链接库 dll 的一些问题汇总 https://blog.csdn.net/liyuanbhu/article/details/42612365 网络上关于用 MinGW ...
- MinGW gcc 生成动态链接库 dll 的一些问题汇总(由浅入深,很详细)
网络上关于用 MinGW gcc 生成动态链接库的文章很多.介绍的方法也都略有不同.这次我在一个项目上刚好需要用到,所以就花了点时间将网上介绍的各种方法都实验了一遍.另外,还根据自己的理解试验了些网上 ...
- VC 调用 MinGW 生成的dll good
首先,如果dll 中导出了C++的类,那么就不要折腾了.不同的编译器编译出来的C++代码是不保证通用的.如果dll中只是一些C 函数,那么是可以互相调用的. MinGW 生成dll时即使生成了 .a ...
- C#调用Matlab生成的Dll
问题描述:最近开发需要调用matlab生成的DLL,在New MWNumericArray 对象的时候报错,提示未将对象引用到对象的实例. 问题分析:因为MWArray.dll是Matlab提供的DL ...
随机推荐
- Asp.Net中的HttpWebRequest类与HttpWebResponse类
相关博文:https://www.cnblogs.com/xu-yi/p/10061342.html 相关博文:https://www.cnblogs.com/zoujinhua/p/11313396 ...
- 解决element 分页组件,搜索过后current-page 绑定的数据变了,但是页面当前页码并没有变的问题
前言上一篇写前台解决分页问题的时候没有这个问题,但是在实际项目后台中有遇到过,所以在这里专门说一下,如果参考前台分页出现这种问题了,也可以使用这种方法!bug:vue和element实现的后台分页,当 ...
- python 递归计算若干工作日后的日期
import datetime # 根据第一次计算出来的休息日数,计算还需要的工作日数.(递归调用) def get_next_date(self, start_date, weekend_days) ...
- 07.07NOIP模拟赛
考中 考试时不知道自己在想啥.. 拿到第一题:woc组合数学,第二题:woc组合数学,第三题,woc组合数学. 然后开始认真读题…… 我tm真是闲的... 第一题是15年山东省选题,感觉暴力搜索都没法 ...
- input 的 placeholder 样式修改
input::-webkit-input-placeholder{ color:#999999; } input::-moz-placeholder{ /* Mozilla Firefox 19+ * ...
- SpringCloud学习笔记(二):微服务概述、微服务和微服务架构、微服务优缺点、微服务技术栈有哪些、SpringCloud是什么
从技术维度理解: 微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底 地去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事, 从技术角度看就是一种小而独立的处理过程,类 ...
- netty优化参考链接
Netty百万级推送服务设计要点:http://www.infoq.com/cn/articles/netty-million-level-push-service-design-points/ 用N ...
- Linux常见问题解答--如何修复“tar:Exiting with failure status due to previous errors”
问题: 当我用tar命令来创建一个压缩文件时,总在执行过程中失败,并且抛出一个错误说明"tar:由于前一个错误导致失败退出"("Exiting with failure ...
- thymeleaf报错元素类型必须由匹配的结束标记终止
spring boot 1.x 版本中thymeleaf报错元素类型 “link” 必须由匹配的结束标记 “</link>” 终止解决办法: 1.在pom.xml文件中添加: <de ...
- Linux常用命令的缩写含义
命令缩写: ls:list(列出目录内容) cd:Change Directory(改变目录) su:switch user 切换用户rpm:redhat package manager 红帽子打包管 ...