lib和dll的区别生成以及使用详解tenos

首先介绍一下静态库(静态链接库)、动态库(动态链接库)的概念,首先两者都是代码共享的方式。

静态库:在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令都全部被直接包含在最终生成的EXE文件中了。在vs中新建生成静态库的工程,编译生成成功后,只产生一个.lib文件

动态库:动态链接库是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个DLL中,该DLL包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。在vs中新建生成动态库的工程,编译成功后,产生一个.lib文件和一个.dll文件

那么上述静态库和动态库中的lib有什么区别呢?

静态库中的lib:该LIB包含函数代码本身(即包括函数的索引,也包括实现),在编译时直接将代码加入程序当中

动态库中的lib:该LIB包含了函数所在的DLL文件和文件中函数位置的信息(索引),函数实现代码由运行时加载在进程空间中的DLL提供

总之,lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。

以下例子均在vs2010上测试

生成和使用动态库

生成动态库

新建项目--win32项目--填写项目名--确定--下一步--应用程序类型:选择dll--附加选项:选择导出符号--完成

可以看到生成了一个dllmain.cpp文件,这是dll应用程序的入口,注意它和普通工程的入口main函数不同,这个文件我们不需要修改。

在这个动态库中我们举例导出一个变量,一个类,一个函数,头文件dll.h如下:

1//新建生成dll的工程时,vs默认定义了宏DLL_EXPORT,因此,DLL_API是__declspec(dllexport),用来导出2//当我们在静态调用dll时,我们包含该头文件,由于没有定义DLL_EXPORT,所以DLL_API是3//__declspec(dllimport),用来导入4#ifdefDLL_EXPORTS5#defineDLL_API__declspec(dllexport)6#else7#defineDLL_API__declspec(dllimport)8#endif910//导出类11classDLL_APICdll{12public:13Cdll(void);14//TODO:在此添加您的方法。15};1617//导出变量,变量在.cpp文件中定义18externDLL_APIintndll;1920//导出函数,加extern"C",是为了保证编译时生成的函数名不变,这样动态调用dll时才能21//正确获取函数的地址22extern"C"DLL_APIintfndll(void);dll.cpp文件如下:

1#include"dll.h"234//这是导出变量的一个示例5DLL_APIintndll=6;67//这是导出函数的一个示例。8DLL_APIintfndll(void)9{10return42;11}1213//这是已导出类的构造函数。14//有关类定义的信息,请参阅dll.h15Cdll::Cdll()16{17return;18}调用动态库

有两种方法调用动态库,一种隐式链接,一种显示链接。

调用动态库:隐式链接

隐式链接需要.h文件,dll文件,lib文件

(1)将dll放到工程的工作目录

(2)设置项目属性--vc++目录--库目录为lib所在的路径

(3)将lib添加到项目属性--链接器--输入--附加依赖项(或者直接在源代码中加入#pragmacomment(lib,“**.lib”))

(4)在源文件中添加.h头文件

然后就像平常一样调用普通函数、类、变量

调用动态库:显示链接

显示调用主要使用WIN32API函数LoadLibrary、GetProcAddress,举例如下:

1typedefint(*dllfun)(void);//定义指向dll中函数的函数指针2HINSTANCEhlib=LoadLibrary(".\\dll.dll");3if(!hlib)4{5std::cout<<"loaddllerror\n";6return-1;7}8dllfunfun=(dllfun)GetProcAddress(hlib,"fndll");9if(!fun)10{11std::cout<<"loadfunerror\n";12return-1;13}14fun();生成和使用静态库

生成静态库

新建项目--win32项目--填写项目名--确定--下一步--应用程序类型:选择静态库

静态库项目没有main函数,也没有像dll项目中的dllmain。

创建项目后添加.h文件,添加相应的导出函数、变量或类,如下所示

1#ifndef_MYLIB_H_2#define_MYLIB_H_34voidfun(inta);56externintk;78classtestclass9{10public:11testclass();12voidprint();13};1415#endif.cpp文件如下

1#include"stdafx.h"2#include"lib.h"3#include45voidfun(inta)6{7std::cout<

使用静态库

需要.h文件,lib文件

(1)设置项目属性--vc++目录--库目录为lib所在的路径

(2)将lib添加到项目属性--链接器--输入--附加依赖项(或者直接在源代码中加入#pragmacomment(lib,“**.lib”))

THE END
1.~和的区别~和-是两个常见的符号,它们在使用上有一些区别。1.用途不同:-~(波浪线)在汉字拼音中常用来表示音调的变化或模糊的意思。例如,píngyīn(拼音)中的īn部分就用波浪线表示音调。--(连字符)则常用于连接两个或多个词或词组,起到连接的作用。例如,high-quality(高质量的)中的连字符用于连接high和quality。2.使https://wen.baidu.com/question/1999437472181976907.html
2.C语言结构体中,使用「.」和「>」的区别结构体.和→的区别C语言结构体中,使用「.」和「->」的区别 C语言结构体访问成员,「.」和「->」分别什么时候用呢 相同点 不同点 两者的联系 判断两者什么时候用 相同点 首先两者的功能是一致的,都用于访问结构体或类的成员。 两种运算符优先级也相同。 1 2 3 不同点https://blog.csdn.net/nzbnzb/article/details/126902315
3.民用住宅和商用的有什么不同以上是小编为您提供的关于民用住宅和商用住宅区别的相关介绍,希望可以帮助到您。商业住宅是指在土地性质为商业用地上建设的住宅用房,称为商业住宅,例如像市场上售卖的产权为40-50年的酒店式公寓就是商业住宅。而商品房则属于普通住宅,产权70年。如果您对民用住宅和商用住宅的区别还有相关疑惑,可以结合您的具体情况详细https://www.66law.cn/laws/168257.aspx
4.strong和copy的使用区别1:copy:一般来说,有对应Mutab版本的类型,在声明属性是,使用copy关键字作为声明,例如等等经常使用copy关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDic,此外block也用过使用copy 2:strong:出copy的绝大多数情况下使用strong关键字。 https://www.jianshu.com/p/d11c6e6519b1
5.枯矾能用白矾代替吗专家文章二、枯矾和白矾的区别 1.制作方法不同 白矾是一种矿物质中药,它是用明矾石加工提炼而成的,主要的化学成分是十二水合硫酸铝钾,它是一种天然性质的中药。枯矾是把白矾再次提纯后形成的晶体,在制作枯矾的时候,要把拣净的白矾放在砂锅内加热溶化,一直煅至枯干后,形成的晶体就是枯矾。从制作方法上就可以二者是不一样https://www.bohe.cn/article/view/158114.html
6.商业用房和办公用房的区别是怎样的啊商业用房和办公用房的区别如下: 1.使用性质主体不同;商业用房的使用主体多为各类商店、门市部等商业用户,办公用房的使用主体多为企业、事业、机关等单位。 2.用途不同;商业用房主要是从事商业行为的所用的房屋,而办公用房是单位办公用的房屋。 3.基本楼层不通;商业用房一般是底层临街的房屋,办公用房一般是写https://www.findlaw.cn/wenda/q_38553687.html
7.生漆是什么生漆和大漆的区别生漆怎么用在装修过程中,新手业主可能会接触到各种各样的材料,不少东西之前都没听说过,比方说生漆。这是一种比较特殊的涂料,具有许多优良特性,应用也较为广泛。那么生漆是什么?恐怕对其了解的朋友并不多。今天小编就为大家详细介绍,再来看看生漆和大漆的区别,以及生漆怎么用,给有需要的朋友提供参考。 https://www.qizuang.com/gonglue/rujiaoqi/102371.html
8.尼古丁盐是什么?尼古丁盐和烟油的区别4、使用者不需要一个大功率的设备。尼古丁盐烟油能更有效地递送尼古丁,使用者不必非用一个大功率的盒子,哪怕是一个简单的小设备也可以获得满足对尼古丁的摄入需求。 尼古丁盐和烟油的区别 尼古丁盐是烟油的制作原料之一,是不能使用的。尼古丁盐可以与PG、VG、食用香精一起制作成烟油。 https://www.zinwi.com/news-detail/id-50.html
9.日本自由行必备——西瓜卡/ICOCA交通卡使用攻略这次去我们基本体验了日本所有的公共交通工具,分类给大家讲一下体验和注意事项,估计未来自由行的小伙伴应该都能用到。先说说最常见的西瓜卡和ICOCA。 西瓜卡和ICOCA的区别 区别 它俩的区别在于发卡的公司不同,但使用范围是相同的,在关东和关西都可以使用。 https://www.mafengwo.cn/gonglve/ziyouxing/255655.html
10.京东支付券和东券的区别在哪?附使用规则消费金额限制不同:京券没有最低的消费金额限制,除特殊标注的不能使用的商品外,全场通用。东券是订单金额必须满足一定条件时才可以使用东券. 在京东平台上面也有不少人都想要了解京东的支付券和东券之间的区别,另外也想要知道这两种券的使用规则,我这就来给各位详细介绍和分析。 https://www.maijia.com/article/509918
11.lm324ad和lm324的区别能否替换使用首先需要说明的一点是,LM324是四运算放大器,是一种大类。根据它后缀不同,还有A种子型号(规格)。关于lm324ad和lm324的区别,我们可以从它们的性能参数上区分开来,本文探讨的是lm324ad和lm324的区别,以及它俩能否在电路中相互替换。 lm324ad和lm324的区别 https://m.elecfans.com/article/719304.html
12.经营成本包括哪些(解析经营成本和总成本费用的区别)1、营业成本就是指项目投资中项目投入运营后的总成本,其口径是包括折旧与摊销但不包括利息(注意与总成本的区别,总成本即包括折旧与摊销也包括利息即财务费用) 2、营运成本一般很少用,如果出现了,其口径与营业成本的口径是一致的。 3、经营成本,是指付现的营业成本,也就是营业成本中将折旧与摊销去掉就是经营成本,https://www.niaogebiji.com/article-141073-1.html
13.永久居住权对房屋买卖的影响有哪些?和使用权有区别吗?能继承吗三、居住权和使用权有区别吗? 1、居住权其实是用益物权的一种,通常情况下是指对他人所有的住房及其附属设施占有、使用的权利。设立居住权,可以根据遗嘱或者遗赠,也可以按照合同约定。 2、设立居住权,应当向县级登记机构办理居住权登记,经登记后居住权才成立。 https://www.nongjiao.com/news/read-20177.html
14.硬线和软线千万别选错,师傅说使用31、硬线和软线有那些区别呢 软线其实不用多说我们也能想到,就是比较柔软一些,可以更好的弯曲,软线主要是由多股细铜丝绞合而成的,而对于硬线呢?其实就是一股铜线,硬度相比的话,比较高一些,而且弯曲度来说的话,肯定要比软线硬一些,在电线型号上表示的话,硬板一般用BV表示,而软线用BCR表示,比如我们常见的BVhttps://zhishi.fang.com/jiaju/qg_620917.html
15.「React进阶」reactrouterv6通关指南腾讯云开发者社区新版本路由和老版本的差异,使用区别,API 区别。 新版本路由组件 Router ,Routes ,和 Route 的原理。 Outlet 组件原理。 useRoutes 原理。 让我们开始今天的routerv6 学习之旅吧。 二 基本使用 首先我们从路由的使用方法上,来看一下 v6 的变化,还是举例一个场景。比如有如下的路由结构: https://cloud.tencent.com/developer/article/1970034