奇怪的编译问题 - DLL在某些机器上编译不一样

时间:2011-04-29 22:39:21

标签: c++ visual-studio dll visual-studio-2005

我不是要求SO告诉我问题是什么,我只是问我应该在这样的情况下运行健全性检查

使用Visual Studio 2005,简单的c ++项目。实际代码是:

int Sum(int a, int b)
{
    return a+b;
}

没有预编译的标头。使用DEF文件导出:

LIBRARY testdll
EXPORTS
    Sum

在测试机器上再次编译(VS2005),DLL可以在其他机器上运行(64位和32位测试,始终使用Win32目标平台编译)。在我的机器上编译(64位,相同的项目,相同的属性),DLL在我的机器上,在其他机器上它启动即时调试器(或者如果JIT不是,则崩溃可怕)安装的):

  

Caller.exe中0x00000000处的未处理异常:0xC0000005:访问冲突读取位置0x00000000。

起初我在我的测试机器上用调用它,这也会失败,给我(cder}一个“找不到文件”错误。

其他症状:文件大小不同,我的机器给DLL增加了512个字节。

我的系统配置:

  • Windows Vista - 64位
  • VS2005版本8.050727.867(vsvista.050727-8600)
  • .NET Framework版本2.0.50727 SP2

经过测试的环境:

  • Windows XP - 32位(虚拟机)
  • VS2005版本8.0.50727.42(RTM.050727-4200)
  • .NET Framework版本2.0.50727 SP2

  • Windows XP - 64位

  • VS2005版本8.0.50727.42(RTM.050727-4200)
  • .NET Framework版本2.0.50727 SP2

2 个答案:

答案 0 :(得分:1)

我认为在64位计算机上配置了“Win32目标平台”。我建议您启动“Visual Studio 2005命令提示符”并使用

  

dumpbin.exe / headers YouDll.dll

检查将在64位计算机上生成的“错误”DLL。您可以将它与“好”DLL进行比较。我想你会马上看到差异。 WinDiff.exe可以为您提供额外帮助。

一个小的一般建议:考虑对从DLL导出的所有函数使用EXTERN_CWINAPI(或__stdcall)。

答案 1 :(得分:1)

打开Dependency Walker中的两个DLL,看看有什么不同。最好在一台DLL运行不正确的机器上执行此操作。