为旧版本调整VS2010和VS6编译器和链接器开关



对于一个遗留项目,我在Visual Studio 2010中有一个解决方案,该解决方案使用Visual Studio 6编译器进行编译,该编译器使用Visual Studio 2010的Daffodil扩展。

我正试图使编译器(和链接器)的输入(尽可能)与使用VisualStudio6时的输入相等。因此,我将VS2010项目的构建日志文件与VS6中同一项目的构建记录文件进行比较。

我注意到在VS2010中构建时,生成的命令行上传递的编译器开关是不同的。其中一些差异我可以在VS2010中的项目文件设置中修复,但其他差异我似乎找不到:例如,使用VS6构建时/FD/TP开关存在,但使用VS2010构建时不存在,而且我似乎也无法在IDE的项目设置中的任何位置找到这些开关。还有其他我似乎无法解决的差异,因为我找不到VS6的默认开关是什么(是的,我试过谷歌):例如,当使用VS2010构建时,/EHsc开关存在,但当使用VS6构建时,却没有,这是一个差异还是VS6编译器的默认开关?

所以我的问题是:

  • 是否有VS6编译器的默认值列表
  • 对于故障排除:如何查看IDE或Daffodil注入或拒绝了哪些开关

PS:
*我注意到在VS6中存在但在VS2010:/FD中不存在的编译器开关
*我注意到VS6中不存在但在VS2010:/EHsc/Gd/TP/WX-/O2/Oy-
我知道这在项目设置中大部分可能是可以修复的,但我还是决定添加该项目的完整列表,希望有人能更多地了解需要对齐的特别麻烦的编译器开关。

更新:好的,这是我发现并解决的问题:

  • /WX-开关(将警告视为错误)可能是无害的,假设它是对最初不存在的开关的否定,似乎没有任何效果,我怀疑它是由水仙花注入的
  • /O2开关(支持快速代码)暗示了其他几个优化开关,这是一个严重的错误,通过清除项目设置中的优化设置而删除
  • /Oy-开关(省略帧指针)也可能是无害的,假设它是对最初不存在的开关的否定,似乎没有任何效果,我怀疑它是由水仙花注入的
  • IDE注入了一个/D _VC80_UPGRADE=0x0600开关,但它对VS6编译器没有意义,所以它是无害的
  • /EHsc交换机(同步异常处理)显然与最初已经存在的/GX交换机相同,因此看起来可以
  • /Gd开关(默认的cdecl调用约定)显然是VS6编译器的默认开关,所以它的存在是无害的,我怀疑它是由Daffodil或IDE注入的
  • /TP开关(将所有文件视为C++源文件)我找不到如何在任何地方配置它,但对于混合源文件,这是潜在的危险,我不知道如何摆脱这个开关,它是由Daffodil或IDE注入的

然后链接器切换。。。我设法调整了除之外的大部分

  • /stack开关(保留堆栈大小)在VS6中是十六进制的,但在VS2010中是十进制的并用引号括起来,所以我不得不在命令行中指定它,但
  • /machine:I386/mapinfo:lines开关在VS2010中是未知的,所以我不得不在命令行中指定它们。它们被附加到文件列表之后的链接器命令行的最后,这很容易被忽略,而且我不能100%确定链接器是否真的在文件列表之后选择了其他开关

/TP开关由IDE添加。

/stack开关接受十进制或C语言表示法的值。我做了一个快速测试,VC6链接器似乎也能正确地解释引号中的值,所以我认为您不需要单独指定这些值。

/machine值可以在Linker\Advanced属性页上指定,尽管可选值列表看起来与VC6文档不太匹配。这可能是水仙花的错误,也可能是文档不准确。

必须将/mapinfo开关添加到您提到的"附加选项"中。

如果您没有禁用日志记录,您可以检查链接器命令日志文件(link.command.1.log),以查看在命令行上传递的确切开关。我使用/mapinfo开关对此进行了测试,并将其按预期添加到命令行的末尾。

最新更新