我们一般发布程序,会把所有相关的 DLL 都复制到发布版目录中,不过到了 WinXP/Vista 时代,it won't work~
为了解决 DLL Hell,从 WinXP 开始引入了 WinSxS(side by side) 机制,恩,很容易引起你老的程序出问题。
SxS 深入浅出的介绍
http://eparg.spaces.live.com/blog/cns!59BFC22C0E7E1A76!3944.entry
绕过 WinSxS 的方法
http://davidlenihan.com/2007/07/winsxs.html
http://blog.kalmbachnet.de/?postid=80
DLL search order
http://msdn.microsoft.com/en-us/library/aa374224.aspx
这里有一篇关于 DLL Hell 的介绍,也说了 side by side 的来源
http://www.iiiedu.org.tw/knowledge/knowledge20021130_1.htm
-------------------
当然,另一个绕过 SxS 问题的方法,就是把 libc(crt) 全部 static-link 到你的 .exe, .dll 里面。比如发布 main.exe, d3d9_40.dll, render.dll 三个文件,则分别有三个 libc(crt) 在 .exe/.dll 里面。这,会不会有问题呢?恩~ ms 是不会有问题的,因为 M$ dxd9_xx.dll 就是 static-link 了 libc(crt) 的,如果有问题,呵呵,问题多了去了。
Em ... 抑或~ dxd9_xx.dll 就压根没有 crt,或者弄了个特殊版本,咔咔,ms 不大可能。
static-link 的选项在:(vs2005)
Property Pages
[Configuration Properties] > [C/C++] > [Code Generation] > [Runtime Library]
使用 MFC 的同学,需要
[Configuration Properties] > [General] > [Use of MFC] > [Use MFC in a Static Library]
如果使用了一堆 static lib 的同学,exe 又有隐式创建某 lib 里面东西的,要注意把 lib 中的所有东西都 link 到 exe 中,否则可能碰到莫名其妙的问题。
[Configuration Properties] > [Link] > [General] > [Use Library Dependency Inputs] > [Yes]
ps. 唠叨一句,VS IDE 配置这些东西还真是麻烦,经常找不到地方。
---------------------
2009-04-18
上面说 /MT dll 的问题,对于 malloc/free,这里有更细致的分析。
http://kasicass.blog.163.com/blog/static/39561920093189350699
而对于 dxd9_xx.dll / fmod.dll 等,它们都是提供好函数,属于“谁分配,谁释放”,所以多份 crt 也无所谓啦。
评论