Visual Studio 中C++项目升级指南.docx
- 文档编号:5896497
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:8
- 大小:36.45KB
Visual Studio 中C++项目升级指南.docx
《Visual Studio 中C++项目升级指南.docx》由会员分享,可在线阅读,更多相关《Visual Studio 中C++项目升级指南.docx(8页珍藏版)》请在冰豆网上搜索。
VisualStudio中C++项目升级指南
如何升級?
VisualStudio2010支持來自VC6、VisualStudio2002、VisualStudio2003、VisualStudio2005和VisualStudio2008的升級。
同VisualStudio的早期版本一样,你可以選擇通過IDE的轉換向導或者是命令行工具(Devenv/upgrade)來完成升級。
以下是升級過程中的一些建議:
1) 把升級環境與構建環境設置成相同的
升級過程中會嘗試加載一些文件,另外還會評估一些值。
如果你的項目中所使用的值不是在項目文件中自己定義的,例如在環境變量中定義的值,那就需要在升級之前事先設置好這些環境變量。
如果這些環境變量設置不當,則可能會因为無法對值進行評估而出現警告或錯誤。
2) 在升級之前確保你已經安裝了必要的平台
在一台沒有可用平台的機器上對項目進行轉換,可能會導致轉換錯誤。
例如,如果你想在VisualStudioProfessionalSKU中對安騰平台的一個項目進行轉換,由於它不支持安騰平台,你就會看到像下面這样的轉換出錯信息:
1.Failed to upgrade 'Debug|
2.installed under '%vctargetspath%\platforms\Itanium'. Cannot load the project due to a corrupt
3.project file. The following error has occurred during XML parsing:
4.File:
D:
\Sample\ConsoleApp\ConsoleApp.vcproj
5.Line:
28
6.Column:
5
7.Error Message:
8.System error:
-2147154677.
9.The file 'D:
\Sample\ConsoleApp\ConsoleApp.vcproj' has failed to load.
這是因为轉換過程需要那些平台的屬性值才能成功進行。
你可以通過查看以下目錄獲悉已安裝了哪些平台:
%ProgramFiles%\MSBuild\Microsoft.cpp\V4.0\Platforms(或者查看x64平台下的%ProgramFiles(x86)%\MSBuild\Microsoft.cpp\V4.0\Platforms)。
3) 如果可能的話,使用本地的多定向支持來對VisualStudio2008工具集進行構建
在VisualStudio 2010中,我們新增了本地的多定向支持(Multi-Targeting),通過使用新的基於MSBuild的項目系統,你可以在VisualStudio2010的IDE中为VisualStudio2008工具集構建目標。
關於這一特性,你可以看看這篇博客。
我們建議用戶,特別是擁有大型代碼庫的用戶,在升級時先利用這一特性在VisualStudio2010中構建VisualStudio2008工具集的程序。
這样,當你在升級過程中碰到問題,就可以把那些跟項目系統或構建系統相關的問題與工具的問題區別開來。
這將會讓你更加平滑地升級到VisualStudio2010工具集。
一旦升級完成,屬性表文件(.VisualStudioprops)就會被轉換成新的格式(.props)。
同样,項目文件(.vcproj)也會被轉換为新的格式(.vcxproj)。
值得注意的是,新的項目文件會與舊的項目文件同時生成。
在轉換過程中還產生了一種新的文件類型(.filter.vcxproj),該過滤器文件包含用來顯示解决方案的資源管理器文件夾信息。
該過滤器信息原本是項目文件的一部分,然而這種變化是必要的,因为只要項目文件發生變化,MSBuild就會請求重新構建。
通過在一個單獨的文件中保存過滤器信息,就可以在避免重新構建整個項目的情況下修改過滤器。
注意:
升級過程不會轉換.user文件。
因此,你的調試和部署設置在轉換後將不會被保留。
在VisualStudio2010中,一個新的命令行升級工具VCUpgrade.exe也被加入了進來。
此命令行工具,适合在只有一個項目的情況下進行升級,因为它無法把解决方案文件作为輸入,並將其解析成項目文件。
VCUpgrade.exe位於$(VisualStudioInstallDir)\common7\Tools目錄下,該工具也將附帶在WinSDK的下一個版本中,這样用戶就可以在沒有VisualStudioIDE的情況下用命令行對WinSDK中的項目文件進行升級。
升級過程中的警告
以下是轉換過程中,你可能會遇到的一些常見警告:
1) 鏈接器輸出目錄
在升級時你可能會看到的一個警告是MSB8012:
$(TargetPath)和鏈接器的OutputFile屬性的值不匹配:
1.- MSB8012:
$(TargetExt) ('.dll') does not match the Linker's OutputFile
2.property value 'C:
\foo\Debug\MFCActiveX.ocx' ('.ocx') in project configuration 'Debug|Win32'.
3.This may cause your project to build incorrectly. To correct this, please make sure that $(TargetExt)
4.property value matches the value specified in %(Link.OutputFile).
5.- MSB8012:
$(TargetPath) ('C:
\foo\Debug\MFCActiveX.dll') does not match the Linker's OutputFile
6.property value 'C:
\foo\Debug\MFCActiveX.ocx' ('C:
\foo\Debug\MFCActiveX.ocx') in project
7.configuration 'Debug|Win32'. This may cause your project to build incorrectly.
8.To correct this, please make sure that $(TargetPath) property
9.value matches the value specified in %(Link.OutputFile).
Link.OutputFile是在屬性頁中Linker->General->OutputFile這一項中定義的值。
默認情況下,它的值是$(OutDir)$(TargetName)$(TargetExt),與$(TargetPath)相同。
當我們把一個應用程序從之前的版本轉換過來時,並沒有辦法可以很好地解析出Link.OutputFile被$(TargetName)和$(TargetExt)的值,因为不同的用戶可能用不同的方法對其進行了賦值。
为了解决這一點,我們决定在轉換過程中保留Linker.OutputFile中的值。
在轉換之後,$(TargetName)將默認为$(ProjectName),$(TargetExt)將默認为該類應用程序的默認擴展名:
動態庫文件为.dll,靜態庫为.lib,應用程序則为.exe,而Link.OutputFile值則將被保留。
如果Link.OutputFile與$(TargetPath)不同,警告MSB8012會被記錄在轉換日志中。
在構建應用程序時你也會看到同样的警告。
$(OutDir),$(TargetName)和$(TargetExt)在“常規”屬性頁中分別對應“OutputDirectory”,“TargetName”,“TargetExtension”。
你可以手動更改這些屬性的值,這样你就不會再看到警告了。
-如果你的項目生成了導入庫(Linker->Advanced->ImportLibrary),而且鏈接器的輸出目錄不是默認目錄,那麼你可能還需要更改導入庫的輸出文件夾。
否則,生成的導入庫所在的目錄就可能會與鏈接器的輸出不同。
-調試。
轉換後命令被設为默認的$(TargetPath)。
你可能需要做一些改動,這样當按下F5(Debugging)或Ctrl+F5(Startwithoutdebugging)之後才能加載正確的可執行程序。
2) 屬性表的排序
如果你的應用程序有屬性表,那麼在轉換過程中你可能會遇到下面的警告中:
1.- All user macros reported below for configuration 'Debug|Win32' are used before their definition,
2.which can cause undesirable build results; this is not supported in this release.
3.You can resolve this by changing the inclusion order
4.of the consuming property sheets and making sure they come after the property sheets defining the user macros.
5. - MSB4211:
C:
\foo\PropertySheet\foo.props;
6.The property "MyIncludePath" is being set to a value for the first time,
7.but it was already consumed at "C:
\foo\PropertySheet\bar.props".
該警告歸因於MSBuild對其屬性的評估方式:
MSBuild按順序依次評估其屬性值。
如果在派生的屬性表中定義的屬性在父屬性表中被使用,那麼其值就會被設为空。
然而,VCBuild采用的是延遲評估方式。
這样,即使是在派生屬性表中定義的屬性也可以在父屬性表中使用。
若要解决此問題,請按照警告消息改變屬性表中的順序,從而確保屬性在定義後才被使用。
升級後的行为變化
盡管底層的構建系統已經發生了改變,但我們仍盡力讓用戶在遷移到VisualStudio2010後有相同的使用體驗。
另外,我們還采取了一些措施來改進構建體驗或是迎合MSBuild的某些特定要求。
因此,一旦你遷移到VisualStudio2010,就可能就會注意到以下一些變化。
1) 從“解决方案依賴”到“項目到項目的引用”
如果在一個舊版本VisualStudio版本下進行編譯的C++程序被轉換到VisualStudio2010後,解决方案級定義的項目依賴關系便會被轉化成項目到項目的引用(projecttoprojectreferences)。
這一變化確保了C++項目依賴關系能夠在項目文件中被捕獲。
下面就是一個項目到項目的引用在項目文件中的样子:
1.
2.
3.
4.
5.
6.
在項目文件中存放依賴關系有幾個優點。
首先,用戶可以在不用解决方案的情況下構建一個項目,相關的項目會自動被構建。
第二,它为那些擁有巨大的代碼樹又可能不會使用解决方案文件的用戶提供了方便。
此外,許多客戶都有好幾個解决方案文件,每個文件都包含項目的不同子集。
通過這種方式就可以讓用戶避免为每個解决方案設置依賴關系。
另一個重要因素就是,使用項目到項目的引用使得構建過程更加可靠,尤其是在多核的環境下。
這與VisualStudio早期版本的情況也是一致的。
-如果某個C#程序依賴於一個C++程序,並且這一依賴只使用了解决方案依賴關系表示,那麼現在的這種轉換並不會把解决方案依賴關系轉換成項目到項目的引用。
你可能會碰到因为不正確的構建順序而導致的構建錯誤,尤其是使用命令行直接進行MSBuild構建的時候。
要解决該問題,你得为C#和C++程序手動設置項目到項目的引用。
-在VisualStudio2010中設置新的構建依賴關系時,通常都要用項目到項目的引用替代解决方案依賴。
2) 項目到項目引用屬性的變化
轉換後,CopyLocalDependencies和UseDependenciesInBuild屬性會被去除。
“UseinBuild”屬性改为“ReferenceAssemblyOutput”,以更好地表示該屬性的作用。
另外兩個屬性:
“LinkLibraryDependencies”和“UseLibraryDependencyInputs”增加到了被引用的那個項目中,以便被引用的項目控制它的輸出是否被傳遞到引用它的那個項目中。
以下是VisualStudio2008和VisualStudio2010項目到項目引用屬性的對比圖。
-把“ReferenceAssemblyOutput”設为“false”會允許該項目成为項目到項目引用的一部分,從而設置構建依賴關系,而它的輸出不會被傳遞到引用它的那個項目的CL中。
此屬性用於被托管的程序。
-把“LinkLibraryDependencies”設为“false”,會允許該項目成为項目到項目引用的一部分,從而設置構建依賴關系,而它的輸出不會被傳遞到引用它的那個項目的鏈接器中。
3)VC++目錄變化
VisualStudio2010不再支持在Tools->Options中設置VC++目錄。
相反,VisualStudio2010引入了用戶設置文件(Microsoft.cpp.
這些文件位於$(USERPROFILE)\appdata\local\microsoft\msbuild\v4.0目錄。
當遷移到VisualStudio2010後,VisualStudio2005或VisualStudio2008的目錄設置將會被移動到這些用戶文件中。
這些文件全局設置也會被導入到所有轉換而來的以及新創建的項目中。
下面是通過用戶界面更改設置文件的步驟:
◆點擊View.PropertyManage打開屬性管理器。
◆展開項目節點,然後是Configuration|Platform節點,你將會看到針對每個Configuration|Platform的"Microsoft.cpp.
這些就是提供全局設置的文件,跟以前的tools/Options/VC++目錄是類似的。
◆复選"Microsoft.cpp.
◆在屬性窗口頁中,單擊左窗格中的"VC++Directories",添加諸如“IncludeDirectories"的目錄的路徑,以分號隔開。
◆請確保關閉VisualStudio之前保存了剛才的設置。
◆重新启動VisualStudio,新的設置將會生效。
-注意:
如果你想只改變一個項目的設置,你可以右鍵單擊該項目,彈出屬性頁。
更改“VC++Directories”的設置,這些設置便被保存到項目文件中。
4) 自定義生成規則的改變
在VisualStudio2008中,自定義生成規則是由.rules文件定義的。
轉換後,.rules文件將會變成三個單獨的文件:
.targets,.xml以及.props。
轉換後,你會在.rules所在的目錄中發現這三個文件。
請注意,沒有UI可用於添加新的自定義生成規則。
5) 改動檢查的變化
當你按下F5鍵,檢查改動情況的窗口可能每次會彈出,即使是剛剛才重新構建了一次。
你可以参照這個博客來解决這一問題。
最有可能的的原因是某些文件被列为了該項目的的一部分,但卻不在磁盤上了。
由於這些文件是項目文件的一部分,更新檢查機制每次都會檢查它們是否存在。
而如果在磁盤上不存在該文件,VisualStudio2010就會認为需要重新構建一次。
解决方法是,如果那些文件不存在了,請把它們從項目文件中刪除掉。
VisualStudio2010中的一個限制是,它還不支持可控增量構建(ManagedIncrementalbuild)。
我們正在研究如何在未來版本中支持這一功能。
在VisualStudio2010轉換過程中的已知問題
以下是在VisualStudio2010的轉換過程中已知存在的一些問題:
1) TargetFrameworkVersion
轉換後,托管的C++項目將設为默認为針對4.0Framework。
這種設計背後的原因是,VisualStudio2010構建器的不支持2.0,3.0或3.5Framework。
VisualStudio2008的構建器則必須使用2.0,3.0或3.5Framework。
为了使轉換後的C++應用程序能馬上就能運行,我們决定將C++程序的默認TargetFrameWorkVersion屬性改成4.0。
可以通過下面其中一種方法把C++應用程序重新定向到其它Framework(如3.5):
編輯vcxproj文件,並在第一組定義中加入以下內容:
打開VisualStudio2010的命令行,設置TargetFrameworkVersion=v3.5,然後從命令行運行devenv.exe。
這將把所有C++應用的目標框架設为v3.5。
在構建程序時傳遞/p:
TargetFrameworkVersion=v3.5参數给MSBuild:
MSBuildmy.vcxproj/p:
TargetFrameworkVersion=v3.5
請注意,要在安裝了VisualStudio2008的情況下才能把應用程序的定向到2.0,3.0或3.5Framework。
對於C#/VB應用程序,如果目標Framework已經安裝在了計算機上,轉換過程中則不會改變目標Framework。
如果目標Framework沒有安裝,你可以選擇下載所需要的Framework或將目標Framework升級到4.0版。
-如果在你的解决方案中混合有CSharp/VB/托管C++項目,你可能會碰到它們分別針對不同目標Framework的情況。
如果被引用項目的目標Framework比引用它的項目的Framework版本還高,你可能會收到警告MSB3258:
-Theprimaryreference“foo,Version=x.x.xxx.xxxx,Culture=neutral,processorArchitecture=x86”hasanindirectdependencyonthe.NETFrameworkassembly“mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”whichhasahigherversion“4.0.0.0”thanexistsinthecurrenttargetframework.Theversionfoundinthecurrenttargetframeworkredistlistis“2.0.0.0”.Byincludingtheprimaryreferenceyoumaygetcompileand/orruntimeerrors.
-你也可能如C4691這样的警告:
typereferencedwasexpectedintheunreferencedassembly‘file’,typedefinedincurrenttranslationunitusedinstead,iftheFrameworkversionofthereferencingprojectishigher.
-你需要把解决方法中的所有項目設为同一個版本的Framework。
2) 在makefile的"Output"屬性中使用引號
如果某個項目的makefile中"Output"屬性裏有引號,轉換將無法進行。
解决方法是在轉換前把"Output"屬性裏的引號去掉。
1. 2.Name="VCNMakeTool" 3.BuildCommandLine="nmake /nologo "OUT=$(OutDir)" "OBJ=$(IntDir)"" 4.ReBuildCommandLine="nmake /a /nologo "OUT=$(OutDir)" "OBJ=$(IntDir)"" 5.CleanCommandLine="nmake /nologo "OUT=$(OutDir)" "OBJ=$(IntDir)" clean" 6.Output=""$(OutDir)hlekernel.rom" "$(IntDir)hlekernel_gen.inl" "$(IntDir)hlekernel_gen.h"" 7.PreprocessorDefinitions="WIN32;_DEBUG" 8.IncludeSearchPath="" 9.ForcedIncludes="" 10.AssemblySearchPath="" 11.ForcedUsingAssemblies="" 12. CompileAsManaged="" 13./> 3) $(IntDir)和$(OutDir)中的反斜杠。 $(IntDir)和$(OutDir)分別對應屬性頁中的“General->IntermediateDirectories”和“General->OutputDirectories”。 为了統一$(IntDir)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Visual Studio 中C+项目升级指南 C+ 项目 升级 指南