百度首页 | 百度空间
 
查看文章
 
Windows和Unix是不一样的……
2008-01-09 23:16
今天被比尔盖茨折磨得不行了。终于认识到,原来过去对动态链接库的概念是不正确的。我的天啊,怎么在这个时候才发现错误啊。

事情是这样的。

日方提供了我们一个静态库文件,它提供了很多访问特定数据的函数,其中有一些Singleton的类,需要用Init来初始化,实现原理是使构造函数private化,只能通过Init函数来进行对象的生成。对象自然是保存在这个类的一个静态变量里的。具体可以参照这里──去死专业网的令狐虫 从实例学习设计模式(一)

这个是很常见的实现方法。但是问题出现了。现在要实现一个功能,我编了一个库(假设为B),B需要调用A,但是同时也要使用库C。就是说,B依赖A和C,可惜要命的是,C无法用VC6编译成功,于是用VS2003编译。但是B作为一个库,是要被链接进程序D的,我的天啊,D也依赖A,但是D却只能在VC6上编译。

也就是说,D依赖A和B, B依赖A,但是D只能VC6编译,B却只能VC2003(因为B依赖C,而C却只能VC2003编译),而A只是一个静态库。

复杂吧,为了让D能够顺利的调用B,我只能使用动态链接库DLL了。于是把B做成DLL文件,这样把需要的功能开放出来就可以了,这样D就可以调用B的功能了。

看似解决了──Win32的BT之处开始出现了。虽然D和B,都依赖A,而且程序运行后,D和B属于同一进程吧,但是事实上,在DLL技术看来,D里面的A和B里面的A,完全是两码事,在D里面调用了A的初始化后,B里面的A根本没有被初始化过。

换而言之,一个DLL文件,就跟一个可执行文件木有太大的不同,所以要编出DLL,必须把A链接进去。所谓的调用,类似进程间的通信了,由于A是一个静态库,所以链接在D和B里面的A,是两份不同的备份,相互没有任何关系。怎么解决呢?把A也变成动态库就搞定了──谈何容易啊,我这里只有一份静态库啊。

而Unix(包括Linux)下,动态库对于程序员来说,和静态库在功能上没有什么不同,不会产生上述问题,把B链接成一个so文件的时候,也不需要静态库A,静态库A只是在链接D的时候需要,这样一来,整个应用程序里,只有一份A的备份,D里初始化了A,B里的A也就初始化了。

Unix是多么的体贴程序员啊,Windows,不把我玩死,誓不罢休啊,我现在可怎么才能在A是静态库的情况下,让整个程序只有一份A的备份啊。

类别:技术 | 添加到搜藏 | 浏览() | 评论 (1)
 
最近读者:
 
网友评论:
1
2008-01-10 20:58
太高深了,踩一脚赶紧走人。看不懂~~
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码:
 

     

©2008 Baidu