【问题标题】:Identical build on different systems不同系统上的相同构建
【发布时间】:2010-11-16 07:27:31
【问题描述】:

我有 3 台构建机器。一个在 Windows 2000 上运行,一个在 XP SP3 上运行,一个在 64 位 Windows Server 2008 上运行。 我有一个本地 C++ 项目要构建(我正在使用 Visual Studio 2005 SP1 构建)。 我的目标是使用这些构建机器构建“完全相同”的 dll。

我的意思是一点一点(当然除了构建时间戳)。

使用 win2k 和 winxp 我得到相同的 dll。但它们与用win2008服务器构建的dll不同。 我已经设法获得几乎相同的 dll,但存在一些差异。反汇编文件后发现函数顺序不一样(3个函数顺序不同)。

有谁知道这可能是什么原因?

还有一个附带问题: 在 vcbuild.exe 中,我找到了一个开关 /ORDER。它将函数命令文件作为输入。有人知道那个文件应该是什么样子吗?

【问题讨论】:

  • 你试过在 32 位兼容模式下运行 VS(或其他任何名称)吗?
  • 它必须在 32 位兼容下运行,没有 64 位版本的 Visual Studio AFAIK
  • 1. Server 2008 机器是否运行不同的 CPU? (我曾经见过一个类似的问题,AMD 机器产生的输出与 INTEL 略有不同 - 奇怪但真实)。 2. 你检查过安装的更新,看看里面有没有改变任何VS组件?
  • 1.是的,这些是不同的处理器,但它们都是英特尔。 2.我很确定我有相同的更新,但为了确定,我今天将重新安装win2008。感谢回复

标签: c++ dll visual-studio-2005 compiler-construction linker


【解决方案1】:

您可能认为编译纯粹是确定性的(每次相同的输入都会给出相同的输出),但事实并非如此。例如,考虑优化器 - 这将需要一些内存来工作,可能更多用于更高的优化方法。如果在一台机器上内存分配失败(因为机器内存较少),那么编译器可能会忽略该特定优化,从而导致发出不同的代码。

有很多类似的情况,所以你可能会在一些不可行的事情上付出很多努力。无论如何,为什么您需要 DLL 按位相同?

【讨论】:

  • 关闭优化(/Od 开关)我有同样的问题。按位相等在这个项目中至关重要(无法真正讨论原因,抱歉)。
  • 优化只是一个例子——有很多事情可能会使编译器产生不同的输出。
【解决方案2】:

您是否运行相同版本的链工具(编译器、链接器...),包括 32/64 位差异?

【讨论】:

  • 是的,我正在使用带有 SP1 的 vs2005 进行构建(还安装了 .net 2.0 SP1)。构建到 win32 平台。
  • 你确定你在Win2008上使用的是32位版本的编译器和链接器吗?
  • 是的,我确定。它们在 Program Files (x86) 中
【解决方案3】:

Windows Server 2008 是唯一运行 64 位的机器吗?如果是,那可能是你的问题。

【讨论】:

  • 可能是这样,但来自 32 位系统的 dll 几乎是相同的。唯一的区别是 3 个函数的顺序不同(项目中有很多函数)。反汇编的代码几乎一样。
猜你喜欢
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
相关资源
最近更新 更多