【问题标题】:Converting VC++6/Win32 project to VS2010 C++/Win32 project: Known issues将 VC++6/Win32 项目转换为 VS2010 C++/Win32 项目:已知问题
【发布时间】:2011-07-11 02:49:56
【问题描述】:

您是否知道在将 VC++6/Win32 项目转换为 VS2010 C++/Win32 项目类型期间突出显示已知或可能出现的问题的任何资源?我对各种问题都感兴趣:

  • 编译器选项兼容性
  • 编译时问题
  • 链接时间问题
  • 运行时问题
  • MFC 问题

否则,如果您已经执行了这种迁移,您遇到了什么问题?

谢谢

【问题讨论】:

  • 好问题,我也对从那时起的 ATL/COM 更改感兴趣。

标签: c++ visual-studio-2010 winapi mfc migration


【解决方案1】:

VC++6 有非标准的异常处理。我们遇到了一些问题,因为我们的代码包含以下内容:

try { 
  //Some code
} 
catch (...) {
  //Handle error
}

一些开发人员依赖于这种破坏行为,我们的应用程序在 VS2008 中编译后严重崩溃。

这个article 很好地解释了它以及如何解决这个问题。

【讨论】:

    【解决方案2】:
    1. 首先,这些问题高度依赖于代码质量,以及古代代码如何适应 VC++6 编译器的“特性”。

    2. 无法将.dsp直接转换为VS 2010格式(at least with the express editions),必须经过2008年才能转换。

    3. 转换向导应该警告并通知您可能存在的任何问题。我没有经历过这个过程,但我认为编译器开关是你最不担心的。一般来说,我认为糟糕的代码会产生更多你需要担心的错误。

    至于您的具体查询:

    • 见 3。
    • VS2010 需要更长的时间。
    • VS2010 链接器需要更长的时间,特别是如果您启用链接时优化(在 VS 2005 中引入)
    • 仅当您做出非标准假设或 VC++6 具有非标准功能时。只要您使用 VS2010 重新编译完整的项目(从而将其链接到最新的 VC(++) 运行时),就不会出现运行时问题。

    旁注:我并不是说旧代码不好,只是说很多关于 VC++6 的 SO 问题都是由糟糕的代码质量引起的/一致性。

    【讨论】:

      【解决方案3】:

      嘿,vs6 允许您在循环范围之外使用循环变量。即:

      for ( int i=0; i<10; i++ )
      {
         if( i == 5 )
           break;
      }
      
      int iVal = i;
      

      这将在任何情况下都失败> vs6 :) 在 2005 年和 2010 年失败 - 尽管有一个编译器设置允许您再次强制执行此行为(我建议只是修复它,不要强制它,无论如何它不符合要求),至少在vs2005中。我还没有跳到 2010 年,因为我做了很多嵌入式开发,而且似乎为嵌入式东西切换编译器通常是一个主要的痛苦。所以,对于 2010 年,我不能说太多,但我知道这将继续下去!

      【讨论】:

        【解决方案4】:

        采取了行动,我知道两个痛苦的问题:
        - 在 VC6 和更高版本之间更改了异常处理默认值。我相信/Eh 是默认设置,并且已经更改。
        - 自 Win2k 以来的任何 Windows 操作系统中都包含 VC6 运行时(msvcrt DLL),而对于任何其他版本,您需要在几乎所有操作系统的软件中安装它。

        【讨论】:

          【解决方案5】:

          您会遇到很多问题,因为 VC6 是出了名的不符合标准,而且您的代码(尤其是如果您使用模板)可能会充满一些技巧,使其不再需要,因为 MS 做了很多对更新的编译器版本的一致性工作,VC10 编译器可能会拒绝它们。

          【讨论】:

            【解决方案6】:

            如果您有 Visual C++ 的商业版:

            在您的 Visual C++ 安装目录中找到 devenv(应该是 %VS90COMNTOOLS%\..\IDE\devenv.exe

                > devenv /upgrade project.sln
            
                > msbuild.exe project.sln  /t:Build  /p:Configuration=Release /p:Platform=Win32
            

            检查编译

            但如果你有 Visual C++ 的免费版本:

            在您的 Visual C++ 安装目录中找到 vcbuild.exe(应该是 %PROGRAMFILES%\Microsoft Visual Studio 9.0\VC\vcpackages\vcbuild.exe

                > vcbuild.exe /upgrade   project.sln
                  /msbuild:Configuration=Release
                  /msbuild:Platform=Win32
            

            对于不需要转换的未来构建,输入:

            > msbuild.exe project.sln /t:Build /p:Configuration=Release /p:Platform=Win32
            

            【讨论】:

              【解决方案7】:

              从 VS2005 迁移到 VS2010 时,我们遇到了一个与第 3 方库有关的问题,导致我们的一个程序在每次加载时都会崩溃。该问题原来是由 Microsoft 反转链接器中 /NXCOMPAT 开关的默认设置引起的。该开关控制是否启用数据执行保护 (DEP)。在 VS2010 之前,该开关的默认设置为 NO,我们使用的 DLL 显然依赖于该设置才能正常运行。

              我不确定 NXCOMPAT 链接器开关可以追溯到多远。它没有在 VS2005 对话框 中的任何可用设置中列出,但在从命令行运行 link /help 时会列出。我从来没有从微软那里找到这样的更改列表,所以这种错误很难追踪。

              【讨论】:

                【解决方案8】:

                如果您使用 CLR 从 VC++ 6 迁移到 VS2015,则不再找到现有的 min 和 max 函数,请添加

                #define NOMINMAX
                #include <algorithm>
                namespace Gdiplus
                {
                  using std::min;
                  using std::max;
                };
                

                其次,NAN float 改为 nan

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-07-14
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-10-23
                  • 1970-01-01
                  • 2012-06-03
                  相关资源
                  最近更新 更多