将VS2010和VS6编译器和链接器开关对齐以用于旧版构建

时间:2012-09-27 15:58:59

标签: c++ visual-studio-2010 compiler-construction projects-and-solutions visual-studio-6

对于旧项目,我在Visual Studio 2010中有一个解决方案,它使用Visual Studio 2010编译器使用Daffodil extension进行编译。

我试图让编译器(和链接器)输入与我在使用Visual Studio 6时的输入相等(尽可能多)。所以我将VS2010项目的构建日志文件与VS6中同一项目的构建日志文件。

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

所以我的问题是:

  • 是否有VS6编译器的默认列表?
  • 并进行故障排除:如何查看IDE或Daffodil注入或拒绝的开关?

PS:
*编译器切换我注意到在VS6中存在但在VS2010中不存在:/FD
*编译器切换我注意到在VS6中不存在但存在于VS2010中:/EHsc /Gd /TP /WX- /O2 /Oy-
我知道大部分可能在项目设置中可以解决,但我决定为这个项目添加完整的列表,希望有人能够更清楚地了解特定麻烦的编译器开关以便对齐。

更新:好的,这是我找到并解决的问题:

  • /WX-开关(将警告视为错误)可能是无害的,假设它是对最初缺席的开关的否定,似乎没有任何影响,我怀疑它和&# #39;由Daffodil注入
  • /O2开关(赞成快速代码)意味着其他几个优化开关,并且是一个严重错误,通过清除项目设置中的优化设置来删除
  • /Oy-开关(省略帧指针)也可能是无害的,假设它是对最初缺席的开关的否定,似乎没有任何影响,我怀疑它和&# #39;由Daffodil注入
  • IDE注入了一个/D _VC80_UPGRADE=0x0600开关,但它对VS6编译器毫无意义,因此无害
  • /EHsc开关(同步异常处理)显然与最初已存在的/GX开关相同,因此看起来没问题
  • /Gd开关(默认cdecl调用约定)显然是VS6编译器的默认设置,因此它的存在是无害的,我怀疑它是由Daffodil或者注入的IDE
  • /TP开关(将所有文件视为C ++源文件)我找不到如何在任何地方配置它但是使用混合源它有潜在危险,我不知道如何摆脱这个开关,它由Daffodil或IDE注入

然后链接器切换......我设法对齐其中大部分,除了:

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

1 个答案:

答案 0 :(得分:2)

IDE添加了/TP开关。

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

可以在Linker \ Advanced属性页面上指定/machine值,尽管看起来可选值列表与VC6文档不完全匹配。这可能是一个水仙花的bug,或者可能是文档不准确。

如上所述,必须将/mapinfo开关添加到“其他选项”。

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