2007年8月30日星期四

采用静态链接方式生成工程

在全面升级到VC8 Express以后,发布时遇到了一些麻烦,因为引入了manifest机制,发布版本不再象以前那样带上MSVCRTXX.DLL就可以了,而是要用微软提供的Redistribute工具才可以,这无疑給部署客户端带来了麻烦。显而易见,用户更希望有一个绿色的客户端,复制即可用。有很多巧妙的手段可以解决这个问题,但是都让我感觉不是那么优雅,于是我采用静态链接的方式link所有的lib。

编译OGRE静态库还是相当容易的,因为OGRE 1.4版本本身就有针对VC8的工程,我只要简单的修改配置文件中,采用LIBCMT作为运行库就可以了。除此之外,还需要下载并重新编译所有的第三方依赖库。

编译CEGUI静态库有点麻烦,因为我们已经开始对CEGUI的完全修改,不再考虑升级的问题,所以我修改了代码,取消了原先代码中动态加载Falagard & Widget库的代码,而是通过extern函数声明的方式直接link这两个库中的代码。然后通过宏开关,控制导出函数的声明,使得生成的库合适用于静态链接。

当这两步完成以后,就可以生成采用LIBCMT的工程了,它的好处是不再依赖那个烦人的MSVCRT,給部署带来的方便。而且附带的好处就是发布版本的dll没那么多了。

但是采用静态链接的版本也有以下几个缺点:
  1. 链接速度实在太慢了,在我的机器上,链接需要1分钟。
  2. 因为采用静态链接,所以如果一个模块申请内存传递给另一个模块,不会有任何问题,如果将来程序员利用了这点编写出了跨模块传递并释放内存的代码,就使得这个版本不再能够还原为分散DLL方式的工程。
  3. 如果出现崩溃,难以诊断是哪个模块破坏了内存。
为了解决这几个问题,我增加了DebugMD方式,还是采用原有的MSVCRT运行库,分散的DLL库,解决了以上三个问题。当制作发布版本时,才使用静态链接。

没有评论:

发表评论