VS2010在不同平台上生成的可执行文件是否应该不同?

时间:2013-12-20 17:03:37

标签: c++ visual-studio-2010 build-process

我在Visual Studio 2010 v10.0.40219.1 SP1Rel下有一个大型C ++项目,我开始在其中一个回归测试中看到一个错误。当我检查开发机器上的错误时,我无法实现它,所以我将exes从测试机器复制到开发机器并且出现了错误。然后我删除了源代码树,包括来自测试机器的项目,从开发机器中复制它们,清理并在测试机器上重建它们,并且bug仍然存在。基本上,在我的开发PC上使用相同的编译器版本和安装的修补程序构建的相同项目和配置构建的可执行文件与测试PC上构建的可执行文件不同。唯一的区别是开发PC运行Windows 7 64,测试PC运行XP。我还检查了所有链接的LIB和DLL在两个构建平台上是相同的。

如果相同的可执行文件在不同的PC上产生不同的结果,我猜它是我的代码中某种特定于平台的错误,但是相同的可执行文件在不同的PC上表现一致,只是在XP上编译的行为不同于在W7 64上编译的那些。

为什么会出现这种情况?

编辑在测试计算机上的调试配置中重新构建代码,错误就消失了。目前正在将源树和工具复制到空白的XP和W7 pc上,以查看问题是否遵循构建平台,或者特定于当前正在使用的PC之一。

Edit2 将源树复制到两台新PC上,一台XP,一台Windows7并重建。只有在XP版本上构建时才会出现错误。在XP调试版本中不会发生,只有优化版本构建。 Win 7 build在XP和Win 7上运行良好,XP版本在XP和Win 7上显示错误。花费一些时间试图更好地隔离bug以弄清楚究竟发生了什么,但肯定有编译差异基于构建平台。

Edit3 问题确实是一个未初始化的变量,或者更准确地说是模板中未初始化的结构,接近于;

template<class TYPE>class MyTemplateClass 
{
public:
  assign(TYPE &x) { x = t; }

  TYPE t;
}

警告级别4似乎没有提到这一点。

1 个答案:

答案 0 :(得分:1)

您是否比较了二进制可执行文件?这可以在fc /b file1 file2see here)的命令行上完成。这至少会验证您是否生成相同的程序,并且在生成的可执行文件之外没有遇到奇怪的事情。

可能/可能正在编译一些静态库,并且可能有其他.h文件不属于您的代码。它们总是有可能存在缺陷。确保您的库和SDK是相同的版本,而不仅仅是编译器。如果可能,请尝试更新它们。

如果错误随着不同的编译器标志而消失,那么您的程序工作/失败可能是某些未定义行为(例如未初始化的变量)的结果。确保启用所有编译器的警告标志以帮助查找这些标志。不幸的是,Visual Studio并不是关于错误和警告消息的最佳选择,但它们仍然有用。