vs使用Lib和dll各种方案_第1页
vs使用Lib和dll各种方案_第2页
vs使用Lib和dll各种方案_第3页
vs使用Lib和dll各种方案_第4页
vs使用Lib和dll各种方案_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、VS 的 Lib 和 DLL 的学习整理我们在用VS 开发 C+ 项目中经常要用到自己或别人开发的lib 。很多初学者对lib 和dll 的意义大概都了解的,但是由于我们的vs 的 IED 允许有各种配置和使用方式,每一种方案都有其对应的意义,但对一些初学者往往会带来混肴,而且网络上的资料都是片面的和碎片化的,对于初学者的学习会代理很多不方便。解决混肴的最佳方法,就是把他们摆到一起来,通过对比来加深理解,克服混肴。下面总结了六种方法,用实际例子一一验证。本文主要分为lib 的三种使用方式和dll 的三种使用方式。1. libVS 配置方式。2. lib 显示调用:代码方式。3. 本地开发lib

2、 的使用。4. Dll 加载时动态链接。5. Dll 运行时动态链接。6. Def 文件的使用。Lib库ib的使用原理就是头文件加lib。头文件告诉你程序中能调用那些接口,lib实现这些接口。首先,我们用第三方库Luajit来验证各种方法。备注:LuaJit即c语言写的lua代码解释器,会编译到你自己的程序中。准备:1.首先下载LuaJit,解压后目录如下图:找了一下各个文件夹,没有看到文件,查了下说明文档,需要自己编译一下。2.找到vs的命令行编辑器,然后到 src目录下编译一下,Ruiid BotificancnsDebuqqdLDeveloper Command Prompt To .D

3、otFiKCdta aiwl AiidlylicsMFC ATI Trace ToolMi< rosoft FtTdbrM k (lienlMicroiott Help Viewe*MicrosoftE ManaqprOpen VS201Z xW Native Ifouh.MicrosolL visual Studio 2DI2 入filend for Visual Studio 2012安装下面的指令执行一下:毡>今W需费学习cd test 1 IbXtestIiblternbILu4jrT-2. Q> 5arc):X11 -11 t e 511 i b t e st 1

4、i b l E?c r ema 1 Lua J IT 2. 0. 5 src>Msvcbyild. bat.执行成功后,会生成下面四个新文件。名称幡淳日明& biiaS 1 dll201 卯 10/24 25:D6 luaS I exp20*l5/10/24 23:06演 luaSIJIb2mW11/24 23:06/ luajitex2019»/10/24 23:06尊 l4uklllb.h20*17/5/1 2Q11B lib户wk2017/5/1 2011101 IlbjMS 巴五2017/5/1 20.11IDk l;J .rflilT/C/l 1下面就可以开始

5、使用此 lib里。先新建一个控制台应用程序的项目用于实战。 V testlibl>Fxternal Dependencies» - Header Filessi Resource Files» Source FilesA libl.lib目 RcadMc.txt方法一:配置1.配置 头文件的目录配置:CcnligLiationi Acllw>tM*g)" Pllatform: Act证阴1吁2)“ ConfigurahDri Mianager.Addilipnall ncl ude QWecgri 第O:野内、姆s 而正mwimIMLu *JIT-上。

6、5"时薄AdditicmWI 日日皿理丽-rr-ect开i中 印-n ” rfi门广町, Deboq Informatnsb FormalProgram Dat犯吠 tor Edit Aik! ConUnue i/Z)ConiiTKin Langue RunTime Aupoort 1coiKjjmg Wiodcw- Runlime fcjdEEi&ionlaipprES* Addifticmal Include OiirKtories? XWarning I Twt Wd*.) 一 当上浮习油国IbgUlbl旧lerMTluiJlT吃Q5砧it 此址为了经单. 直接用了能对

7、地址Common Propertii vC&nftqurition Pros General DebuggingV+* DirectorK, * OC*-Preprcxesor TgeOnH 就 language Precompiled I Outpul Ftl« Browse intarrr Achrdnced AllOpTom Comifledid LlhlinkerMan /4t ToolIniTentedi vaik.e2.lib的目录配置:4P*i 典LwbuqKiInqi yr * * niwi-ffliDp 医EllMd 利TniCKEWV TciEfirf*w

8、w*IdnquiSQr 1"0mE 例J Qii4piir f IlF* iHriwse in曲学 得 jHrNNi All UphcsK LurwiMfHJ LiHGervral |Tfipf7TFM3t Fl* l_Ari>uq 和时 知Ugih OptfrnliwIICF I IhbvdctoMl ItXlPfHjI f III* Shew Progr«f Vcri>lDH>EmMlnrrMwrtdl IMiklvgNupptHMiHrfnrHJr!>iipix1 LirirytRf Qii«« Oukpull口 . jki

9、HL JikF" ll 二.a ILLI Aclvlfl kwwJ LiilirMvM*<talMi3 I IhfrfV Ofpwd*(Y HlpMiI g 七承研Pie?nt Dll!>" Lmfe?r W4Kning Ai tirrntarev tiUutpirit.i4* HtM PflcMjIv Iwhag# 啊 WTmn *nuh ilf| A hll| ViTri Ji-ITIrir f懵 I/Et 川 Mat %*h 5NK=EhflENl徜峥E (/K地 Q8j心F- _O|rWh*i|illbbP«Tllbl |»wniit

10、uAJTt 3 q| A AftiivnHMJlMfMyDM| fcferry Off H'rdH"f 、£J >*»I nW iMHWrullhi'ilrfE insJI I底加列第浑灯的立计觥放到了这个文杵赛中,所以还IrihcfEd rk!指明lib目录中要用到的那个具体 lib :3iiti 掷 1TMb HbActlwi D-HJUClfrtlElEalJciX k Pf 邓 rMT*。! Code Genera- Lfiquege Pr*k>Tlpftedl Output Fi, Bri=wsc Inriarii Ai:NI

11、 OpLiur* CwnnLanci LlH* Linkr*III IismjT I 中 aniMst - ilr 0HM ”|QF &E OptlmlZJtiOr LmUeddrd IIActdltiondife Oependrrw IeiIlmS 1i Jib,%£AdcM»nalOflf>«ndian<3«K3$0 *J 便却 I Of tiO H IL I tM MtIqimre Spr-rifirEiiulT iLihraFie*%MEU岭 Xlmtig HieAdd Modui« lb AwfnqblyE nab

12、fiHj hWwkQ/。R*fcXirce F i的Fcmce! SmbGl Re+errnceiAi*cmfciy Link Rffwuit?此时,就配置好了,下面就来写例子代码:执行后的结果:I i¥O:7testlibtestliblDebuqtestlib1,exerUello World!方法二;显式调用1 . 配置头文件:如方法一2 .去掉 lib 的配置:上面的步骤中input 配置去掉,改成下面的语句。效果是一样的。#pragma comment (lib,"Lua51.lib")3 .执行后效果和方法相同:方法三:本地lib的使用本地lib是兼容

13、以上两个方法的,但是vs提供了第三个方便的方法。1.新建一个lib项目早 Soludon 'Leslllbr (2-v LibiA l Lxteriiijl U<?p<?riLiencie5.* Reicsurce Hi lei> * I ib 1 jcpp » e libl.hJ pch r pp0 B pch.ht (drgetvei.h itesttiol> External Deper id enc lei Header Files 心 stdabch1 tdrgetwef .11 Resource Ftles A M Source Files

14、3 ReadM?4xt'熊"Qg编辑简单的代码:头文件Libi .cppLib I .h 4a x testlib l.cpp(Global Scope)#pragma oncejvoid Test();具体执行,我们只是输出简单的字符串:liblxpp 勺 X I itl.h tslliblxppT«t- : void lesiO(Globdl Scope)tincludt "Liblih"birKludi <instr#imSvoid lestOgjfd:horld:史口也;编译后生成的是lib文件,其实此时不需要专门编译:> 司

15、,Sftin® :,字刁 i intlib t tpsflibl i Detu? > Libi. Libl.ltoLiibl.prl口Sect1* LibraiyPRI文件vs提供的第三种方式来实现:上面编译好的lib可以用以上两种方式来使用,但是我用2.在测试项目中添加一下依赖:头文件还是要导入的,由于项目在本地解决方案中,所有直接导入头文件,不用配置了:ffinflude *. .LibiLiti.hlpragiriA coiHn«nt. (libi 11 Lua51. lib")Qlnt _ trnaiH(iriy srgcd _TCHAR* Bgv)

16、I -/*L = iLii_ap»nOj luaL_op/nlibS(L>const Zhar bij¥ "print:( 'Hollo Morld ! ' ) IubL judtrlng(L bu卡);luaf closafL);执行结果:I D:3testli btestlib1Debugtestlib1,exeHello World! hello world test!三种lib方式比较一下:方法一:纯配置,单纯好管理方法二:比较凌乱,一会配置,一会要写代码不推荐。方法三:自己写的lib放到同一个解决方案中才可以使用,假如是第三方库则无

17、法使用。总结:不管哪个方案,头文件目录是必须的,毕竟代码中要显示的调用接口名字的。另外对于vs配置的一些比较容易混肴的地方我们列举比较一下:1. Include Directories :用于全局的,所有解决方案所有项目都可以使用,等于给系统配 置的。2. Additional Include Directories :用于本项目的,添加额外的你要搜索的包含头文件的 “include ”目混针对头文件的。比较单纯,推荐用这个。3. Additional Library directories:添加额外的你要搜索的包含库文件(即.lib) 的目录。减少代码调用的路径编写,相当于#pragma c

18、omment (lib,"xx/xx/xx/xx/Lua51.lib")。4. Additional dependencies:清楚地列出你要添加的.lib 文件。其实就是代替#pragmacomment (lib,"Lua51.lib") 。DLL库DLL是动态的 用法其实和lib是一样的,唯一不同的是,dell是随应用程序带出去的,可以随时更新,不用编译到应用程序中。方法一:加载时动态链接(需要 .lib和.dll和头文件) 1.新建dll项目:CP Solution 'testlibI" (3 projects) j 土 muP

19、丁 E sternal Dependencies Resource Fijl«。* Dlll.icpp» b DIIIJi。. dllmalncpp* pelt 卬 p卜 口 pch.h targetver.h2 .函数声明要带上关键字_declspec(dllexport):声明导出函数、类、对象等供外面调用:DIH.cpp DI 11,h testlibl.cpp .(Global %印可 pragnta once _de:lspec(dllexport) /oid Test();测试一下,下面是不带 declspec(dllexport)关键字的,生成的没有 lib文

20、件:> 新加卷口> 学句 > teatlib > testlib I y Debug > Dill右聊入他改日期区 Din .dll占苣tDlll.llk2019/10/26EiDill .pdb2019/1 O/2fci 2(DIM .prk2019/1 O/2fci 2(带上关键字后的生成文件:比中曾»粉七铮出 > 亨3 >他H若*mvnbi卜Debug > Ml-IM1事聋 DfllK4 D Mult ttDIIJibQ OfllMb Ddlpi2019/W26 20:43"口中口.前4 "?51卬1野施2 叼

21、2019/10/267043场幽村后EipoiLiLibMiy Fite nciwwiM# Linfeer -Prngrnn OfbUQ gPRI亶性3 .导入项目的方式和上面的lib 一样,头文件的目录和对应的库目录Additional Include Direaorie$?>ct x +gttsl I ibtrt II i b I bctt? r n alLu aJ I bKDcV5JV«tlibt«tliblOI I< >备注:附加依赖项的是.lib不是.dll,若生成了 DLL,则肯定也生成LIB文件。如果要完成源代码的编译和链接,有头文件和lib

22、就够了。原理:程序中引用了一个 H文件里白函数,编链器怎么知道该调用哪个DLL文件呢?这就是LIB文件的作用:告诉链接器 调用的函数在哪个 DLL中,函数执行代码在DLL中的什么位置,这也就是为什么需要附加依赖项.LIB文件,它起到桥梁的作用。如果生成静态库文件,则没有DLL ,只有lib,这时函数可执行代码部分也在lib文件中。rlh Add Ptional Depend mciero( Ignace Al I Delau It Llbfdn«Additional DependenciesIgnore Specific t>eiault LibrariesModule Def

23、inition- Filepit1 Add Module toEm-bed M通皿gd Reourte FH牌Force £yrnbd Referenc«el特 Loaded) 口IkAssembly Link Resource调用代码:| include "Dili、*pragna coimnent (lbjuLua5i.libRHint _tjnaTiH(int argCj rCH4fl* argv )广 lua_State *L = lua_OTen();luaL_openlibs(L) con st char *bLif = "prinrC He

24、lla World 1' )M;luaL_dastring(L,buf);lu3_clase(L)iT est() ;getchcr() return &,最后,吧dll拷贝到执行目录就可以执行了。己淑 > 新邛卷4 > 学习> t第ti由> twriiti > Detxjg书辟”“幡茂Fl明w DII1X1II201VI0/26 2(囤知*1日1*2019/1CV24 2 mtliblKe-2019/10/26?!, tMflibl.ilk2019/10/262(用 testlibl.pdb2019/10/262(执行结果:第一个 hello w

25、orld是上一个例子遗留,暂不删除了: D:A3tcstlibtestliblDcbiigtcstlib1 cxche11 a world test2方法二:运行时动态链接 需要DLL(不需要.lib,.h文件)1.直接上代码Qint _trflrgCjarjuf)( HlMSMMCF htnst LiatfL i&rsry(L "DI 11 r<jlLH );< void (*pT*it)(void);_pTest test = (_pTE5t) : ;GttFfPMdQrf5(hInft*);tC5t(>; :rFreeiYiirffr/thlrtit)

26、;H9电亡亡人营户(); return 0;执行结果:干 D;学用tcstli btcstlib1 Dcbugtcstl ibl 期xehello world test2方法三:使用 def文件代替 _declspec(dllexport)嫌写_declspec比较多,就可以用 def文件把他们集中起来成一个文件:I .头文件改一下,去掉关键字:II 1 .dpfnni.cppDin.h e x temblor, Dllkh : - D:A)testlibtest(Global Scope) #pragma onee void Test();2.右键添加def文件:右键添加的会自动在input

27、中出现这个配置,自己写的要自己配置这个地方binmcin Propefth Xi怩lit We Pt” Generdl Debugging VC*- Directcxie /C + tLinkerGeneralInput Maniles.1 File rXehiMWiiiMAddltiDFdl DepeiiderKies Ignore Al Olaull Libwln Ignore Specrfic D«EmiM ModMe Oftrhltoon File Add Module to Aiwmbly Embed Maraged Resource Fie Force Symbol Rf

28、会守盟日 Delay Loaded Dlk Awmbly Link Rewurce%(Add LioridlDcp«iidleiikci«s)3.编写def文件:O ' «lj * ffl H J* V , 卜 LckM Wiimbdows DeOuQQf t AutoSolLitlon Exploirer- Q X Olli .del + X DJII.cppDll 1 Jhiq 电d曰国“一痴EXPOST 专1r irrh *lut m Fpl t <: 1 Q*T.筝七网GR (2 prqj>«u) Dill» / Fjrtern闱。epemdefK.M fti Resource Files /D * DI I I.cpp 国 DiMxiekb * DNI.h0 % dllmjin.cpp(Kh*pp P a pchJhi e rarqetwf.h4 .编译后,生成的dll和上面例子的dll是不同的了,带领输出函数了。5 .执行代码不变,结果也不变Hi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论