【问题标题】:Weird compiling problem - DLL not compiled the same on some machines奇怪的编译问题 - DLL 在某些机器上编译不一样
【发布时间】:2011-04-29 22:39:21
【问题描述】:

我不是要求 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

【问题讨论】:

  • 这可能与您的 VS 版本具有不同版本的 VC 运行时 DLL 有关吗?
  • 我首先要仔细检查 VS 为编译和链接创建的命令行是否相同。然后在每个平台上手动运行它们,看看显示的内容是否有任何差异。
  • @wallyk:我将项目从原始计算机复制到另一台计算机。尽管如此,我检查了两个命令行,它们是相同的。
  • @BoazYaniz:这是我最新的理论,但它只有在 Vista64 和 XP64 之间的 VC 运行时 DLL 不同时才有效。或者也许还有另一个我目前没有想到的增量。

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


【解决方案1】:

我想你的 64 位机器上的“Win32 目标平台”配置错误。我建议您启动“Visual Studio 2005 命令提示符”并使用

dumpbin.exe /headers YouDll.dll

检查将在 64 位机器上生成的“错误”DLL。您可以将其与“好”的 DLL 进行比较。我想你会立即看到差异。 WinDiff.exe 还可以帮助你。

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

【讨论】:

  • 感谢您的一般建议。这是一个我快速拼凑起来演示的项目,但你的建议是对的。
  • 嗯,使用 dumpbin 肯定有区别。代码大小和地址差异很大。
  • @MPelletier:你能发布两个输出的 WinDiff 比较的确切结果吗?
  • 我能够在我的“坏”机器上使用 /MT 而不是 /MD(当然没有 /clr)重新编译 DLL,并且 DLL 可以在所有机器上运行。我目前正在探索那个场地。你到底是如何在 WinDiff 中保存结果的?
  • @MPelletier:是的,没错。如果您不使用 /MT,则必须在程序设置中包含相应 VC 运行时的 Windows Installer 合并模块(有关详细信息,请参阅here)。您可以通过任何其他方式将 VC 运行时部署到目标计算机。大多数情况下,您只有一个可执行文件,使用 /MT 更好。如果您的程序包含许多使用 VC 运行时的 DLL,则最好使用 /MD 并部署 VC 运行时。它会减少代码乘法。
【解决方案2】:

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

【讨论】:

  • 这给了我一些线索,基本上“坏电脑”有一个额外的缺失 DLL,MSVCM80.DLL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 2013-09-15
相关资源
最近更新 更多