最近,做一些程序的封装,就了解了C++中封装动态库(.dll)和静态库(.lib)的方法,以及两种库调用时异同,现在记录下,后续有新的理解,会继续更新;
动态库(.dll):动态库又称动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL 副本的内容。DLL 是一个包含可由多个程序同时使用的代码和数据的库。Windows下动态库为.dll后缀,在linux在为.so后缀。(引自百度百科)
静态库(.lib):静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中的这种库。(引自百度百科)
区别:静态库和动态库是两种共享程序代码的方式,它们的区别是:静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。使用动态库的优点是系统只需载入一次动态库,不同的程序可以得到内存中相同的动态库的副本,因此节省了很多内存。
编译.dll文件:
暂 空 :)
编译.lib文件:
暂 空 :)
下面主要谈谈这两种库的调用:
在我们代码编译应用程序调用.dll库时,需要在VS中配置环境:
1.附加包含目录../include
2.附加库目录:../lib
3.附加依赖项:.lib
说明:编译dll库时,会生成.dll、.lib文件(以及自带的头文件),其中调用函数的代码封装在.dll文件中——添加环境变量(或直接拷贝到库目录下,直接在库目录的路径中包含),函数的调用地址及其他内存信息封装在.lib文件中——附加依赖项中添加相应的名称xxx.lib,函数的接口在头文件中(.h)——包含目录;
另:
1)在添加目录的时候,应多考虑使用相对路径(便于代码的移植);
2)如果我们需要将编译的应用程序.exe文件在其他的电脑上运行,需要打包它需要调用的.dll文件(放在同一目录下),调用的dll文件包括:自己编译的dll文件和VC编译器运行库的dll文件(MSVCP110D.dll,MSVCR110D.dll ),不用打包.lib文件,因为在编译应用程序的时候,已经将.lib文件包含到生成的.exe文件;
3)编译.EXE 应用程序有两种模式:Debug和Release,其中,D模式下表示调试,生成的exe文件中包含了调试信息的接口,R模式下是发行版exe程序,生成的exe文件不包含调试信息,程序经过优化,效率高内存小;所以在移植到其他的电脑上使用时,优先考虑使用Release模式生成.exe文件;
编译应用程序调用.lib静态库:
如上面所讲,静态库的.lib文件包含了链接库的所有信息(函数代码和接口信息)。所以我们在调用静态库.lib时,只需要包含头文件目录(../include. .h),附加库目录,即可;
这样,生成的应用程序.exe中将包含静态库.lib的信息,这将导致生成的exe程序过大,不利用移植;
未完待续。。。