VS2010项目配置详解
首先看一下項目設置中可以使用的宏(環境變量),常用的有:
ConfigurationName | 配置名字,通常是Debug或者Release |
IntDir | 編譯器使用的中間目錄,產出obj文件 |
OutDir | 鏈接器使用的輸出目錄 |
ProjectDir | 項目目錄 |
ProjectName | 項目名字 |
SolutionDir | 解決方案目錄 |
TargetDir | 目標輸出文件所在的目錄 |
TargetExt | 目標輸出的擴展名 |
TargetFileName | 目標輸出文件名,包括擴展名 |
TargetName | 目標輸出名,不包括擴展名 |
TargetPath | 目標輸出文件的全路徑名 |
下圖是某一個工程所有設置的例子:
注意:從上圖可以看出,TargetDir指目標目錄,是一個目錄。而TargetPath是目標路徑,包括具體的文件名。
vs2010使用方案管理項目,一個解決方案下可包含多個項目。
默認情況下,項目屬性的設置的目錄起點為項目配置文件所在的位置,實際上就是項目頭文件和源文件所在的位置。
vs2010中默認建立C++項目,則解決方案總目錄下包含一個sln和一個項目文件夾,在vs2010編譯器中生成debug和release解決方案后,總目錄下還會生成對應的debug和release目錄,存放最終生成的exe或dll文件,同時也會在項目文件夾下生成debug和release目錄(存放的是中間編譯文件obj)。
下面結合例子講一下:solution為創建的解決方案,demo為創建的項目
解決方案solution總目錄如下:
項目demo目錄如下:
?
項目配置及系統變量關系:
在vs2010的項目屬性頁,會有一些系統變量,如下:
SolutionDir:解決方案目錄
Configuration:指debug或release
ProjectName:項目名字
OutDir:在?常規--輸出目錄 中定義的值,如$(SolutionDir)$(Configuration)\,表示XXX\lolution\debug\目錄值
IntDir:中間目錄
TargetDir:生成exe或dll文件所在位置,如鏈接器-常規-輸出文件為$(OutDir)$(TargetName)$(TargetExt)(即定義了exe輸出位置,也就決定了TargetDit的值),此時TargetDir表示在XXX\lolution\debug\
TargetName:目標輸出名,不包括擴展名
TargetPath:目標輸出文件的全路徑名
ProjectDir:表示項目目錄值,一般在“調試-工作目錄”中設置該值
TargetExt:擴展名
PlatformToolsetVersion:
ConfigurationName:配置名字,通常是Debug或者Release
默認情況下“輸出目錄”和“輸出文件”對應的目錄值是一樣的。
?
配置屬性
???????????? 常規
????????????????????? 輸出目錄:$(SolutionDir)$(Configuration)\ ? ? //即
????????????????????? 中間目錄:$(Configuration)\?
???????????????????? ?目標文件名:$(ProjectName)
????????????????????? 目標文件擴展名:.exe
??????????????????????生成日志文件:$(IntDir)\$(MSBuildProjectName).log
??????????? 調試
?????????????????????命令:$(TargetPath),表示調試器要啟動的exe全名,TargetPath就表示目標輸出文件的全路徑名,所以一般情況下它代表的值就等于“輸出文件”屬性代表的值
???????????????????? 工作目錄:$(ProjectDir)
C/C++
????????? 預編譯頭
??????????????????? 預編譯頭輸出文件:$(IntDir)$(TargetName).pch
??????????輸出文件
??????????????????? ASM列表位置:$(IntDir)
??????????????????? 對象文件名:$(IntDir)
??????????????????? 程序數據庫文件名:$(IntDir)vc$(PlatformToolsetVersion).pdb
????????? 瀏覽信息
??????????????????? 瀏覽信息文件:$(IntDir)
鏈接器
????????? 常規
??????????????????? 輸出文件:$(OutDir)$(TargetName)$(TargetExt)
???????? 清單文件
?????????????????? 清單文件:$(IntDir)$(TargetName)$(TargetExt).intermediate.manifest
???????? 調試
????????????????? 生成程序數據庫文件:$(TargetDir)$(TargetName).pdb
??????? ?優化:
????????????????? 按配置優化數據庫:$(TargetDir)$(TargetName).pgd
由上面敘述可以總結出,管理器(解決方案或項目)都會對應一個總的文件夾,這個管理器文件夾下存放本管理器的配置文件以及子管理器。比如,解決方案是個管理器,它的文件夾下含有.sln配置文件以及子管理器ssyy項目和子管理器ssyy2項目。
另外,默認情況下,項目屬性設置的目錄起點為項目配置文件所在位置,實際上就是項目頭文件和源文件所在位置。
補充:vs中建立默認的C#項目和建立默認的C++項目生成的目錄結構是不一樣的。如果是C#項目,則解決方案總文件夾下就只包含解決方案配置文件sln和一個項目總文件夾(共兩個東東),而項目總文件夾下包含c#源文件、項目配置文件proj、一個Properties屬性文件夾、一個obj文件夾和一個bin文件夾,其中obj和bin文件夾下都包含debug和release兩個文件夾。obj文件夾下存放中間編譯結果(擴展名更加項目類型而不同),而bin文件夾下存放最終生成的結果(擴展名一般為exe或dll)。
而如果是C++項目,則解決方案總文件夾下就只包含解決方案配置文件sln和一個項目總文件夾和一個Debug文件夾以及一個Release文件夾(共四個東東,其中Debug和Release文件夾中存放最終生成的結果exe或dll,要注意如果不使用Release生成,則不存在Release文件夾),而項目總文件夾下包含C++源文件頭文件、項目配置文件和一個Debug文件夾以及一個Release文件夾(一定要注意,此處的Debug和Release文件夾僅僅存放中間編譯結果obj,不存放exe和dll之類的東西。如果不使用Release編譯,則沒有對應的Release文件夾)。
由此可見,c#項目默認生成的文件目錄結構更合理,且輸出的exe位于總項目文件夾內,而c++項目默認exe位于解決方案總文件夾下。另外c#更合理在,C#使用Bin目錄,在Bin目錄下包含debug和release兩個目錄,而C++不使用Bin目錄,直接使用debug和releae兩個目錄。
?
其次,常用項目屬性和系統配置變量關系:
???????? 如果我們建立一個默認的vc項目ssyy,他的默認“常規“欄目中,“輸出目錄”為$(SolutionDir)$(ConfigurationName),所以調試時會在解決方案文件夾下建立一個debug(ConfigurationName的值為debug)文件夾,并在此文件夾下生成?ssyy.lik鏈接器?和ssyy.exe文件?。默認“中間目錄”為$(ConfigurationName),所以會在ssyy項目文件夾下(即ssyy.vcproj的項目配置文件所在位置)建立一個debug文件夾,并在該文件夾下生成ssyy.obj二進制文件。默認“鏈接器”欄目下的“常規”選項下的“輸出文件”選項為$(OutDir)\$(ProjectName).exe,其中$(OutDir)就已經在“常規”欄目的“輸出目錄”選項賦值了?!?strong>所以$(OutDir)的值是在“輸出目錄”屬性中定義的】。
??????? 另外,經過實際測試,發現“輸出目錄”屬性只能起到對$(OutDir)系統變量賦值的作用,和“改變生成的.exe文件存放位置”沒任何關系。也就是說,如果“輸出目錄”中設置的$(OutDir)值在C盤,而“輸出文件”中設置輸出文件的位置為D盤,最終生成的exe文件會在D盤,“輸出文件”屬性才決定輸出exe文件的位置。
??????? 而$(TargetDir)的值是在生成exe文件后自動賦予值為exe文件所在位置。所以可以說,“輸出文件”最終決定exe文件所在的位置,也最終決定了$(TargetDir)的值,$(TargetPath)和$(TargetDir)的行為是類似的,此不贅述。
??????? 上面兩段說了這么多,總結就是,默認情況下“輸出目錄”和“輸出文件”兩個屬性對應的目錄是一樣的,這樣用著方便(當然,輸出文件的值在輸出目錄的值的基礎上還包含有exe文件名)。如果兩個不一樣,則中間生成的鏈接器用的如xx.ilk和xx.pdb文件等在輸出目錄,而最終生成的xx.exe文件在“輸出文件”屬性設置的目錄中。
另外,上面兩段話可以總結出,當調試程序時,系統變量$(OutDir)的值是最先確定的,而$(TargetDir)和$(TargetPath)的值是在exe文件生成后才確定的。也就是說系統變量$(OutDir)的值由VS項目的“輸出目錄”屬性決定,而$(TargetDir)和$(TargetPath)的值由VS項目的“輸出文件”屬性決定。即設置了VS的“輸出目錄”屬性就相當于設置了$(OutDir)的值,“輸出目錄”是界面上的提示用于接收用戶輸入的配置信息,然后把這個具體的配置信息存入系統內容的變量$(OutDir)中。
其它常用的屬性還有,“調試”欄目中的“工作目錄”項,這個屬性默認情況下是空的,但表示工作目錄是工程目錄,也就是工程配置文件ssyy.vcproj所在目錄。工作目錄表示進行某項操作的目的目錄,會隨著OpenFileDialog、SaveFileDialog等對象所確定的目錄而改變?!?strong>工作目錄”屬性作用是程序運行后唯一識別的默認目錄,即工作后只認識這個目錄,工作目錄這個名字描述的就很形象,(可以將所依賴的lib和dll庫文件所在目錄設為工作目錄,但一般是把lib放在解決方案下的Lib目錄中,把dll放在解決方案下的Bin目錄中),例如程序運行過程中生成一個txt文本文件,如果在創建文件過程中未指定絕對路徑,只指定創建文件的文件名,那么這個文本文件默認就會建立在工作目錄中,當然讀取一些配置文件也在工作目錄中查找,但要說明一下,生成的exe文件跟工作目錄沒任何關系,也不會放在工作目錄中??偟膩碚f,工作目錄就是程序運行過程中默認讀取的目錄。對于dll,如果是程序運行前就進入內存有點像靜態鏈接那樣,此時dll就可以放入exe所在的執行目錄,如果dll是運行中動態加載的一般放在工作目錄,比如插件就放在工作目錄。即工作目錄就是運行期間唯一能識別的默認目錄,工作目錄在代碼中用GetCurrentDirectory之類的函數獲取,具體代碼間最下面的附1。工作目錄與執行目錄可以不同,例如一個人住在北京,但他的工作地點不一定在北京,可能在天津。
【對工作目錄的補充:vs中工作目錄的設置是給調試用的,也即你啟動調試后,啟動一個新進程,自動把這個新進程的工作目錄設置為vs項目屬性中的工作目錄,然后新進程啟動對應的exe程序。但是如果不使用vs的調試啟動exe,而是直接雙擊exe文件啟動一個新進程時,會自動把這個新進程的工作目錄設置為exe文件所在的目錄,這是和vs啟動調試不同的地方。所以如果發布的時候不把工作目錄內的東西拷到exe所在的目錄內,就會運行出錯,因為此時工作目錄不再是vs中設置的了,而是exe文件所在的目錄。最后,說一下,vs中默認的vc++工程的工作目錄項目的值是空的,代表默認是vs工程所在目錄即.vcproj文件所在目錄,c#工程默認沒測試,估計和vc的一樣?!?/p>
【同樣在調試選項下的和工作目錄選項同一級的選項“命令”選項是設置,使用調試時,從哪里啟動exe文件,因為一般生成的exe放在bin目錄下的debug或release目錄下,所以命令選項一般為“Bin\$(Configuration)\$(ProjectName).exe”,默認也是這個值,當然可以更改,但此時意味著調試狀態下啟動的exe為“命令”選項中設置的exe文件,而不是默認的bin目錄下的debug或release下的exe文件了。最后說一下,上面所說的“調試”是指vs下啟動exe,包括debug模式和release模式,不要把調試就理解為只有debug模式?!?/p>
?
?“調試”欄目中的“命令(Command)”屬性項,【這個屬性表示調試器要啟動的exe文件的全名】,包括路徑名,默認為$(TargetPath),而TargetPath就表示目標輸出文件的全路徑名,所以一般情況下它代表的值就等于“輸出文件”屬性代表的值。當然你也可以人為的更改“命令”屬性的值,比如更改為c:\aa.exe,而“輸出文件”的值為c:\bb.exe,此時如果輸出文件所在目錄沒有aa.exe的話(因鏈接器只生成bb.exe而根本不會生成aa.exe),調試器就不能啟動aa.exe,提示找不到aa.exe。當然如果目錄中已經有aa.exe文件(可以強制賦值一個bb.exe文件的副本并命名為aa.exe),此時調試器就可以正常調試通過。
“鏈接器”欄目下的“輸入”選項下的“附加依賴項”項。此項是設置程序鏈接時使用的靜態庫。相當于鏈接已經編譯好了的“代碼”。由此我們可以簡單的認為這些庫就相當于我們自己寫的.cpp文件,只不過這些庫是編譯好了的.cpp而已(這里只需要庫名稱即可,搜索路徑在其他地方設置)。
“附加依賴性的設置”等同于在代碼中寫“#pragma comment(lib, "庫名稱.lib") ”語句,如果使用相對路徑則如下:
#pragma comment(lib,"..\\debug\\TestLib.lib");其中的反斜杠要用雙反斜杠,因為它是程序解釋的雙引號包括的字符串,需要轉義一下,要區別include,#include "..\TestVideoApplication.h"中并不是由程序解釋的字符串,所以不用轉義。
總結
以上是生活随笔為你收集整理的VS2010项目配置详解的全部內容,希望文章能夠幫你解決所遇到的問題。