第三方引用库使用方式有两种1.动态库(DLL),2.静态库(Lib)
区别:
静态库:我们的程序在链接时会把用到的静态库全部都链接进去,形成一个exe,这也导致我们的exe很大(程序是先编译,再链接库,最后形成exe)
动态库:是在不再把整个库都链接进去,而是程序用到哪个库,再加载哪个库,这就降低了exe的大小,但同时,运行速度也会变慢。当然,用动态库的话你的系统也需要有这些动态库(这里有坑),因为程序是没有的,所以啊,其实exe还是那么大,但是我们把exe的东西拿出来了,才降低了exe的大小。
DLL编译的时候需要指定系统版本x64或者x86,所以在接入dll的时候需要明确产品定位,具体接入那个版本库,x86系统不支持x64软件,x64可以运行x86(好像有性能损耗)。
接入C#项目的调用这里就不记录了,网上资料挺多,这里主要记录一下编译的问题(动态库为例):
首先我们编译项目解决平台绝大部分都是Any CPU,可能很少有人注意这里的区别,首先Any CPU 编译时默认首选32位!!!
此时如果引入x64的DLL,就会无法编译通过,一些人可能会想到引入的是x64DLL从而把解决方案平台改为x64,这里我不建议这么操作(产品打包安装程序可能会出现问题),只需要取消勾选首选32位就可以解决编译问题
解决编译问题,功能完成就该转交测试了,因为我们项目是桌面程序,所以需要打包成安装程序,这里我使用的是vs自带的打包工具
打包程序需要设置安装平台
我这里都以x64为例,如果选择解决方案平台选择Any CPU 那么打包时就不支持Itanium平台
这里需要注意一点,最开始提到了,动态库是使用的时候才会调用对应的DLL,这就要求一点,对应的电脑上需要有这个DLL才能运行,开发环境不用多说环境肯定比测试,生产环境丰富,
所以调用的C++DLL,我们哪怕我们明确它在我们项目里,但是在测试环境都有可能无法运行
C++时别人提供的,我们不知道对方还有那些引用。因此需要借助一些工具如Depend专门查看DLL引用依赖的工具,不过win10无法运行Depend,解析DLL时就程序就会卡死
这里win10推荐Dependencies 这是github地址:https://github.com/lucasg/Dependencies
上图就是通过依赖查看工具打开C++DLL之后的结果,可以清楚查看到都有拿下DLL引用,如果在系统文件夹下面没找到引用DLL(会产生异常信息“找不到指定模块”),此时需要补充必要的环境或直接将缺少的DLL复制到生产环境对应目录下就可以解决
这里需要仔细查看,因为是动态库,缺少任意一个子集引用都可能无法运行。