You are here: Home > 技術…… > 神啊,趕緊一勞永逸地解決DLL Hell吧

神啊,趕緊一勞永逸地解決DLL Hell吧

我所在的項目因故不能用MT編譯,只能用MD。(不要問我爲什麽,我也不清楚,反正就是新依賴的一個東西依賴的另外一個東西只能用MD的緣故)

好吧,把之前所有依賴的庫全部重新編譯一遍……

然後貌似正常跑了幾天。忽然發現某測試機跑不了了。說沒有正確安裝。好吧,一看就是缺DLL,拿Dependency看看,沒有缺呀,該有的DLL都有。用VC打開exe文件看manifest,好傢伙,一下子要依賴三個版本的VC CRT,分別是8.0.50608.0,8.0.50727.762,8.0.50727.4053。

一開始覺得無從下手,直接打開lib看二進制文件也看不出個所以然來,後來死馬儅活馬騎,用ansi搜了一下lib的内容,結果manifest直接就在裏面了……只是不在開頭結尾……

好吧,原來是之前用另外一台沒有打VC SP1的機子編的lib都是8.0.50608.0的。把這堆lib全部重新編譯一邊,至少我引擎的測試程序的manifest就只剩下8.0.50727.762了。

然後客戶端那邊又搞了兩天,發現8.0.50727.4053怎麽也去不掉,看VC的About,是8.0.50727.762啊。

後來我搜到了這篇文章:终结VC2005分发包版本问题

好吧。重點如下:

在安装了Visual C++ 2005 SP1的KB971090安全更新后,VC生成的manifest中引用的ATL/MFC/CRT库的版本从8.0.50727.762变成了8.0.50727.4053。

6 Responses to “神啊,趕緊一勞永逸地解決DLL Hell吧”

  1. snnn说道:

    我觉得那算是vc的一个BUG,vc 2008也有这个问题:http://snnn.sinaapp.com/?p=3152
    但是到了vc 2010就好多了,不需要安装vcredist了,直接把dll放到你的exe旁边就行了。

    我十分推荐MD而不是MT。MT的时候,只有一份crt。但是MD的时候,每个DLL自己都有一份,各有各的堆。MD下面,如果你从一个dll分配内存,再去另一个里面释放,就完蛋了。但是MT就没有这个问题。

    staticlly linking是pwrd的传统,server端一直都是采用-static链接。但是我挺反对的,因为把部署做好一点,那些问题就没有了。

    • Netson说道:

      MT的时候,只有一份crt。但是MD的时候,每个DLL自己都有一份,各有各的堆。MD下面,如果你从一个dll分配内存,再去另一个里面释放,就完蛋了。但是MT就没有这个问题。

      這個,說反了吧…………

      • snnn说道:

        嗯,敲错了.MD的时候是只有一份CRT.”我所在的項目因故不能用MT編譯,只能用MD” 但是你为什么偏要用MT呢?

        • Netson说道:

          玩家不用装vcredist呀……

          • snnn说道:

            很多程序都是把vcredist打包进去,顺手给强制装了。要么,你们换vc 2010吧。总之,我觉得啊,MT的malloc/free好危险啊。

            还有,manifest.xml你们是习惯内嵌呢,还是暴露在外面?哪种方式好?

        • Netson说道:

          我们为了反外挂啥的,基本上不用dll的……
          客户端一般来说更喜欢把所有东西合在一起,对玩家来说更简单。极端来说,如果能只发布一个绿色的exe文件,那再好不过了……
          所以,manifest.xml肯定是在exe里面的……

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注