调整 VS2010 和 VS6 编译器和链接器开关以实现旧版构建

问题描述 投票:0回答:1

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

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

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

  • /stack
    开关(保留堆栈大小)在 VS6 中是十六进制,但在 VS2010 中是十进制并用引号引起来,所以我必须在命令行上指定它,但是......
  • /machine:I386
    /mapinfo:lines
    开关在 VS2010 中未知,因此我必须在命令行上指定它们。它们被附加到文件列表之后链接器命令行的最末尾,这很容易被忽视,而且我不能 100% 确定链接器实际上在文件列表之后拾取额外的开关..
c++ visual-studio-2010 projects-and-solutions visual-studio-6
1个回答
2
投票

/TP
开关由IDE添加。

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

可以在 Linker\Advanced 属性页上指定

/machine
值,尽管可选值列表看起来与 VC6 文档不太匹配。这可能是 Daffodil 的 bug,也可能是文档不准确。

如您所提到的,必须将

/mapinfo
开关添加到“其他选项”中。

如果您尚未禁用日志记录,则可以检查链接器命令日志文件 (

link.command.1.log
) 以查看命令行上传递的确切开关。我使用
/mapinfo
开关对此进行了测试,它按预期附加到命令行的末尾。

© www.soinside.com 2019 - 2024. All rights reserved.