【问题标题】:Why building the same project generates different EXE file for each developer为什么构建同一个项目会为每个开发人员生成不同的 EXE 文件
【发布时间】:2011-01-05 10:15:09
【问题描述】:

我和我的团队正在开发一个 VC++ 6 项目。 我们都使用相同的代码库(使用版本控制系统),并且我们所有的编译器/链接器/环境设置(包括包含目录的顺序),据我们所知,都是完全相同的。 当然,我们使用相同的 VC++ 版本和相同的服务包 (VC6 SP6)。

问题是我们每个人构建的EXE都有点不同。

我知道每次在同一台计算机上构建 EXE 时,文件中有 3 个位置链接器存储时间戳。我不是在谈论这些差异。

虽然我们的 EXE 文件长度完全相同,但当我们比较 EXE 时,有 1000 字节不同。其中许多字节的值相差 0x20。

知道可能是什么原因吗?

编辑:调试构建(实际上,我们没有检查版本)。

编辑:区别在于二进制部分,而不是文本字符串。

编辑:所有开发人员都使用相同的驱动器/文件夹名称,用于源代码和产品。

【问题讨论】:

  • 我猜你问的是发布版本,对吧?

标签: c++ windows visual-c++ linker binary-reproducibility


【解决方案1】:

如果Debug 版本选中了“增量链接”选项,那么可能就是出现差异的原因。

【讨论】:

  • 这只是一个猜测。每次构建项目时,增量链接都会添加一些调试信息。它不会创建 clean exe。
  • 我会在星期天检查它。谢谢。
  • D:谢谢!所有开发人员的 Rebuild All 确实生成了相同的 EXE(时间标签差异除外)。
  • @Lior,是的,Rebuild All 会创建一个干净的 EXE。我应该提到它。那么,这确实是问题所在?我很高兴能帮上忙。干杯。
【解决方案2】:

由于 0x20 是大写和小写 ASCII 字符之间的区别,我想知道这些区别是否恰好出现在编译器/链接器嵌入二进制文件的文件路径中(可能是断言消息?)。你的开发树会不会有所不同(一个盒子上的“C:\DevTrees\MyProject\SuperFoo”和另一个盒子上的“E:\work\projects\superfoo”?)。

【讨论】:

    【解决方案3】:

    我同意 NickD 的说法。在调试过程中,增量链接不会从头开始重新构建 exe,而是会在每次构建时在这里和那里追加/插入/删除代码。

    即exe 的布局取决于自第一次编译以来的每次编译。

    干净的构建应该在相同的编译器上产生相同的结果。

    【讨论】:

      【解决方案4】:

      这可能是巧合,但 0x20 是小写和大写 ASCII 字符的值之间的差异(例如,'A' == 65 == 0x41,'a' == 97 = 0x61)。

      【讨论】:

        【解决方案5】:

        只是猜测:字符串的未初始化部分或一定长度的字符串属性,其中 #0 不在末尾?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-11-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-29
          • 1970-01-01
          • 1970-01-01
          • 2018-07-31
          相关资源
          最近更新 更多