对于旧项目,我在 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% 确定链接器实际上在文件列表之后选择了额外的开关。