2

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

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

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

所以我的问题是:

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

PS:
*我注意到在 VS6 中存在但在 VS2010 中不存在的/FD
编译器开关:* 我注意到在 VS6 中不存在但在 VS2010 中存在的编译器开关:/EHsc /Gd /TP /WX- /O2 /Oy-
我知道其中大部分可能在项目设置中修复,但我决定添加无论如何,这个项目的完整列表,希望有人可以对特别麻烦的编译器开关进行对齐。

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

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

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

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

1 回答 1

2

/TP开关由 IDE 添加。

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

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

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

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

于 2012-09-28T20:55:19.503 回答