一般的时候,也不会注意动态库和静态库间的区别。但当出现下面的设计结构时就明显不同了。
1、静态库实现:
一个工程编译成一个静态库 a.lib
一个小工程,依赖上面这个静态库,编译成一个动态库 b.dll
然后一个用户依赖a.lib开发了一个可执行程序,编译成 c.exe
原本目的是想让b.dll作为使用到a.lib中数据和函数的一个插件,而c.exe运行时就可以从一个统一的入口调用到这个b.dll(也可以是依赖a.lib编写的d.dll, e.dll等)。
于是问题出现:一个在a.lib中的静态数据同时在b.dll和c.exe中保存一分。当c.exe操作这个静态数据时,他访问自己的,当调用b.dll,而b.dll中调用到这个静态数据时,他就使用b.dll中保存的那份,显然在操作两份了,而用户的初衷应该是操作同一个数据。
2、动态库实现:
主要是将上面的a.lib也编译成一个动态链接库 a.dll
其他不变。
这个时候,一个在a.dll中的静态数据,就只有他享有,其他b.dll和c.exe都只能使用他这个静态数据,而他们自身没有一份这个静态数据。于是问题就不会出现。
最初的目的是想实现一个插件结构,而又不想让基础部分(工程a)编译成一个dll,也就是形成使用时就一个exe和一些dll的插件,而不需要那个工程a了。
然后大师兄建议,如果要做成实现1那种结构,就必须将a.lib细分,让b.dll依赖的部分生成一个a1.lib, 不依赖的部分生成a2.lib, 于是b.dll依赖a1.lib, c.exe依赖于a2.lib, 于是他们之间就不会冲突。他还建议说,可以有这么中方法:将所有b.dll用到a.lib中的部分建立一个虚基类,于是其实也就是将a.lib和b.dll剥离开来,让他们之间的联系通过一些虚基类关联(通过b.dll中的一些类继承那些虚基类,a.lib中的一些实现也继承这些虚基类),也不知道这种方法能否起到想要的作用。想max或maya等支持的插件好像应该就是这种结构不(自己不知道,师兄好像这么说^_^)。
如果要采用实现1的方法,又不要太大改动a.lib种的结构(否则累死),应该怎么实现呢。
要是你知道,可别忘了分享哦。我qq:252451759