为什么同一个项目在不同的开发者电脑上生成的EXE文件不同?

12

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

问题在于,每个人构建的EXE略有不同。

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

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

你有什么想法是造成这种情况的原因吗?

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

编辑:差异在二进制部分,而不是文本字符串。

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


我假设你在询问发布版,是吗? - Nick Dandoulakis
5个回答

5
如果 Debug 版本勾选了“增量链接”选项,那么这可能是差异的原因。

2
这只是一个猜测。增量链接在每次构建项目时添加一些调试信息,它不会生成一个“干净”的可执行文件。 - Nick Dandoulakis
我会在星期天检查它。谢谢。 - Lior Kogan
D:谢谢!所有开发人员都重新构建了所有内容,生成了相同的EXE(除了时间标签差异)。 - Lior Kogan
@Lior,是的,Rebuild All会创建一个干净的EXE文件。我应该提到这一点。那么,难题已经解决了吗?我很高兴能够帮助你。干杯。 - Nick Dandoulakis

4

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


3

我同意NickD的观点。在调试期间,启用了增量链接,它不会从头开始重新构建exe,而是对每个构建逐渐添加/插入/删除代码。

也就是说,exe的布局取决于自第一次编译以来的每个编译。

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


1

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接