为什么构建同一个项目会为每个开发人员生成不同的EXE文件

时间:2010-01-15 08:10:24

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

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

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

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

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

任何想法可能是什么原因?

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

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

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

5 个答案:

答案 0 :(得分:5)

如果Debug版本选中“逐步增加链接”选项,则可能是差异的原因。

答案 1 :(得分:4)

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

答案 2 :(得分:3)

我同意NickD所说的话。在调试期间,增量链接不会从头开始重建exe,但会为每个构建添加/插入/删除代码。

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

相关问题