dll动态库与lib静态库的优劣选择。
2014-02-10 23:57
281 查看
第一次自己写有很多个工程的程序,虽然之前研究过一些动态库的相关内容,但是以前只亲手写过使用loadlibrary调用的纯c语言的动态库,没有动态链接过c++的类,因此对dll这东西还是有些恐惧的,所以开始的时候我的工程是由几个LIB工程,几个纯C DLL工程和一个EXE工程组成的(DLL工程也静态链接了LIB工程产生的LIB文件,EXE通过LoadLibrary来调用DLL)。但是编写过程中我逐渐发现了静态库天生的缺陷:
1,静态库里所有在CPP里写的代码会在EXE和DLL中保存多份拷贝。
假如你的LIB库里有这样一个类:
除此以外,如果你的LIB里代码比较多的话,每个链接它的DLL的体积都会很庞大,对硬盘空间也是一种浪费。
2,静态库编译速度慢。
静态库里无论.h还是.cpp改动,链接它的工程都要重新编译,dll则不同,只要.h没变任你怎么修改cpp文件都不用重新编译。
3,链接LIB的工程设置必须得和它一样。
静态库的坏处暂时想到这么多,好处呢?一条都没想到,所以我觉得静态库根本没有存在的必要。一开始我的静态库把每个DLL插件都变成了大肥猪,每个都5M大小,全部换成DLL库之后,我的每个DLL插件立马减少到几百K,而且所有singleton类畅通无阻,改完之后心情真是舒畅。所以劝使用LIB库的同胞们,回头是岸。
1,静态库里所有在CPP里写的代码会在EXE和DLL中保存多份拷贝。
假如你的LIB库里有这样一个类:
////// .h /////// class Singleton { public: static Singleton* instance(); private: static Singleton* m_Instance; }; ////// .cpp /////// Singleton* Singleton::m_Insatnce=0; Singleton* Singleton::instance() { if(m_Instance==0) { m_Instance=new Singleton } return m_Instance; }我称这货为假单例模式,如果你只有一个EXE工程还好说,如果你有其他DLL需要调用该单例模式,这货就露馅了,每个DLL里都会把上面的cpp里的代码复制一份,m_Instance在每个DLL里调用instance的时候都为0,所以每个DLL返回的对象都不是同一个。
除此以外,如果你的LIB里代码比较多的话,每个链接它的DLL的体积都会很庞大,对硬盘空间也是一种浪费。
2,静态库编译速度慢。
静态库里无论.h还是.cpp改动,链接它的工程都要重新编译,dll则不同,只要.h没变任你怎么修改cpp文件都不用重新编译。
3,链接LIB的工程设置必须得和它一样。
静态库的坏处暂时想到这么多,好处呢?一条都没想到,所以我觉得静态库根本没有存在的必要。一开始我的静态库把每个DLL插件都变成了大肥猪,每个都5M大小,全部换成DLL库之后,我的每个DLL插件立马减少到几百K,而且所有singleton类畅通无阻,改完之后心情真是舒畅。所以劝使用LIB库的同胞们,回头是岸。
相关文章推荐
- 【UE4学习】18_引用 lib(静态库) 和 dll(动态库)
- VC环境下的静态库(lib)使用和动态库(Dll)的使用(清晰版)
- Symbian DLL,Lib(动态加载动态库,静态加载动态库,静态加载静态库)
- C/C++ 关于生成静态库(lib)/动态库(dll)文件如何使用(基于windows基础篇)
- 查看静态库(.lib)和动态库(.dll)的导出函数的信息
- 什么叫程序库什么是lib,什么是dll,什么是.a,什么是.so,什么是静态库,什么是动态库
- 查看静态库(.lib)和动态库(.dll)的导出函数的信息
- 静态库Lib和动态库Dll
- 从 DLL(动态库)或Lib(静态库)中导出模板函数
- 关于lib,dll,.a,.so,静态库和动态库的解释说明
- 静态库Lib和动态库Dll
- vs项目中头文件(.h)静态库(.lib)和 动态库(.dll )的路径和配置问题
- 查看静态库(.lib)和动态库(.dll)的导出函数的信息
- 建立动态库dll工程时候也会自动生成静态库lib
- VC环境下的静态库(lib)使用和动态库(Dll)的使用(清晰版)
- C++中动态库(.dll)和静态库(.lib)
- 查看静态库(.lib)和动态库(.dll)的导出函数的信息
- 查看静态库(.lib)和动态库(.dll)的导出函数的信息 error LNK2001: 无法解析的外部符号 _Delete
- VC环境下的静态库(lib)使用和动态库(Dll)的使用(清晰版)
- 查看静态库(.lib)和动态库(.dll)的导出函数的信息 error LNK2001: 无法解析的外部符号 _Delete