Visual Studio 2010中C++项目升级指南 软件测试
在本文将为大家介绍Visual Studio 2010中C++项目升级的有关问题,这篇文章的目的主要也是为了在你升级到VS2010的过程中,能给你一些指导,解释一些问题。
【51CTO经典译文】大家好,我叫李韶(音)。我是C++小组的软件开发测试工程师。正如许多博客文(例如,Felix Huang最近的这篇博客, Andreea Issac 的这篇博客,还有我之前的这篇博客)所介绍的那样,这一个版本的主要升级之处就是C++ 构建系统(build system)从原先基于VCBuild的构建系统,迁移到基于MSBuild的构建系统,而C + +项目系统也是建立在MSBuild构建系统之上。由此也带来了一系列的变化。我们的目标是让用户尽可能地平稳升级,在升级过程中,你仍可能会遇到一些限制、已知的问题或是在设计上的变化。这篇文章的目的主要也是为了在你升级到Visual Studio 2010的过程中,能给你一些指导,解释一些问题。
如何升级?
Visual Studio 2010支持来自VC6、Visual Studio 2002、Visual Studio 2003、Visual Studio 2005和Visual Studio 2008的升级。同Visual Studio的早期版本一样,你可以选择通过IDE的转换向导或者是命令行工具(Devenv/upgrade)来完成升级。
以下是升级过程中的一些建议:
1) 把升级环境与构建环境设置成相同的
升级过程中会尝试加载一些文件,另外还会评估一些值。如果你的项目中所使用的值不是在项目文件中自己定义的,例如在环境变量中定义的值,那就需要在升级之前事先设置好这些环境变量。如果这些环境变量设置不当,则可能会因为无法对值进行评估而出现警告或错误。
2) 在升级之前确保你已经安装了必要的平台
在一台没有可用平台的机器上对项目进行转换,可能会导致转换错误。例如,如果你想在Visual Studio Professional SKU中对安腾平台的一个项目进行转换,由于它不支持安腾平台,你就会看到像下面这样的转换出错信息:
Failed to upgrade 'Debug|
这是因为转换过程需要那些平台的属性值才能成功进行。你可以通过查看以下目录获悉已安装了哪些平台:%ProgramFiles%\MSBuild\Microsoft.cpp\V4.0\Platforms (或者查看x64平台下的 %ProgramFiles(x86)%\MSBuild\Microsoft.cpp\V4.0\Platforms )。
3) 如果可能的话,使用本地的多定向支持来对Visual Studio 2008工具集进行构建
在Visual Studio 2010中,我们新增了本地的多定向支持(Multi-Targeting),通过使用新的基于MSBuild的项目系统,你可以在Visual Studio 2010的IDE中为Visual Studio 2008工具集构建目标。关于这一特性,你可以看看这篇博客。我们建议用户,特别是拥有大型代码库的用户,在升级时先利用这一特性在Visual Studio 2010中构建Visual Studio 2008工具集的程序。这样,当你在升级过程中碰到问题,就可以把那些跟项目系统或构建系统相关的问题与工具的问题区别开来。这将会让你更加平滑地升级到Visual Studio 2010 工具集。
一旦升级完成,属性表文件(.Visual Studio props)就会被转换成新的格式(.props)。同样,项目文件(.vcproj)也会被转换为新的格式(.vcxproj)。值得注意的是,新的项目文件会与旧的项目文件同时生成。在转换过程中还产生了一种新的文件类型(.filter .vcxproj),该过滤器文件包含用来显示解决方案的资源管理器文件夹信息。该过滤器信息原本是项目文件的一部分,然而这种变化是必要的,因为只要项目文件发生变化,MSBuild就会请求重新构建。通过在一个单独的文件中保存过滤器信息,就可以在避免重新构建整个项目的情况下修改过滤器。
注意:升级过程不会转换.user文件。因此,你的调试和部署设置在转换后将不会被保留。
在Visual Studio 2010中,一个新的命令行升级工具 VCUpgrade.exe也被加入了进来。此命令行工具,适合在只有一个项目的情况下进行升级,因为它无法把解决方案文件作为输入,并将其解析成项目文件。VCUpgrade.exe位于 $(Visual Studio InstallDir)\ common7 \ Tools目录下,该工具也将附带在WinSDK的下一个版本中,这样用户就可以在没有Visual Studio IDE的情况下用命令行对WinSDK中的项目文件进行升级。
升级过程中的警告
以下是转换过程中,你可能会遇到的一些常见警告:
1) 链接器输出目录
在升级时你可能会看到的一个警告是MSB8012:$(TargetPath)和链接器的OutputFile属性的值不匹配:
- MSB8012: $(TargetExt) ('.dll') does not match the Linker's OutputFile property value 'C:\foo\Debug\MFCActiveX.ocx' ('.ocx') in project configuration 'Debug|Win32'. This may cause your project to build incorrectly. To correct this, please make sure that $(TargetExt) property value matches the value specified in %(Link.OutputFile). - MSB8012: $(TargetPath) ('C:\foo\Debug\MFCActiveX.dll') does not match the Linker's OutputFile property value 'C:\foo\Debug\MFCActiveX.ocx' ('C:\foo\Debug\MFCActiveX.ocx') in project configuration 'Debug|Win32'. This may cause your project to build incorrectly. To correct this, please make sure that $(TargetPath) property value matches the value specified in %(Link.OutputFile).
Link.OutputFile是在属性页中Linker-> General -> Output File 这一项中定义的值。默认情况下,它的值是$(OutDir)$(TargetName)$(TargetExt),与$(TargetPath)相同。当我们把一个应用程序从之前的版本转换过来时,并没有办法可以很好地解析出Link.OutputFile被$(TargetName)和$(TargetExt)的值,因为不同的用户可能用不同的方法对其进行了赋值。为了解决这一点,我们决定在转换过程中保留Linker.OutputFile中的值。在转换之后,$(TargetName)将默认为$(ProjectName),$(TargetExt)将默认为该类应用程序的默认扩展名:动态库文件为.dll,静态库为.lib,应用程序则为.exe,而Link.OutputFile值则将被保留。如果Link.OutputFile与$(TargetPath)不同,警告MSB8012会被记录在转换日志中。在构建应用程序时你也会看到同样的警告。