您的位置:首页 > 其它

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库里有这样一个类:

//////     .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库的同胞们,回头是岸。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: