尽管浪费了大半天时间测试和记录这个过程,但问题仍然是问题,虽然这个奇怪问题暂时可以避免掉,但更重要的是这个问题太过奇怪,以致于在混合开发工具方面,本人似乎已产生了某种不信任的态度。(而这种不信任感,在稍后与洪以容的交谈中也能体现出,他也有同样的观点:最好别混合开发工具,容易产生奇怪的问题。)
为了弄清楚“奇怪”之处,先是google一番,未果,最后打算与NetAnts作者洪以容交流一下,或许他也有过类似经历,能给予一点启发,最终能彻底弄清楚“奇怪”之处。
在MSN上与洪交谈几分钟,并发给了他上一篇blog。象这样的issues在MSN谈感觉不爽,于是拨了个长途过去,然后与洪以容电话交流了好一阵子,仍感到十分不解,经过一番分析,大家提出了一些解决方法,但始终没能弄清楚为什么 /MT 选项生成的DLL会导致EXE中的sprintf函数产生错误的结果,这个很奇怪,但却是最关键的问题!!!
为了排除的机器问题,将编译过的.exe/.dll发给洪,他得到的测试结果与我的完全一样。
后来,本人又用 MinGW g++ 3.x 对前述的两个demo源程序作了测试,得到如下结果:
g++编译生成的script.dll,与g++本身/VC6生成的.exe工作正常,但与bcb5生成的.exe工作不正常。
BCB5编译生成的script.dll,均能与三种工具生成的exe正常工作。
VC6编译生成的script.dll,与g++生成的exe工作正常,但与BCB5不正常。
由于不太熟悉g++编译选项,也没有查到VC中 /MT /MD 对应的g++选项,所以无法测试什么情况下 g++ 能够生成可供BCB5-EXE正常工作DLL的方法。但根据以上测试结果发现,MinGW在windows上似乎与MSVC6有某种极为类似的库特征,或者他们使用相同的库文件,或者库的连接方式雷同。
另外,MinGW g++与VC6有较好的兼容性。而BCB5与其二者有某“不协调”的地方。