VS项目属性的一些配置项的总结
以下內(nèi)容為“原創(chuàng)”+“轉(zhuǎn)載”
首先,解決方案和項目文件夾包含關(guān)系(c++項目):
VS解決方案和各個項目文件夾以及解決方案和各個項目對應的配置文件包含關(guān)系,假設(shè)新建一個項目ssyy,解決方案起名fangan,注意解決方案包括項目,此時生成的最外層目錄為fangan代表整個解決方案的內(nèi)容都在這個文件夾內(nèi)。在這個fangan文件夾內(nèi)包含有fangan.sln的解決方案配置文件和一個ssyy文件夾,ssyy文件夾代表整個ssyy項目的所有內(nèi)容都在這個文件夾內(nèi),這個文件夾內(nèi)含有ssyy.vcproj的項目配置文件和.h頭文件以及.cpp源文件。如果在fangan解決方案下再建立一個新項目名為ssyy2,則會在fangan文件夾下生成一個ssyy2文件夾存放ssyy2項目的所有內(nèi)容。
由上面敘述可以總結(jié)出,管理器(解決方案或項目)都會對應一個總的文件夾,這個管理器文件夾下存放本管理器的配置文件以及子管理器。比如,解決方案是個管理器,它的文件夾下含有.sln配置文件以及子管理器ssyy項目和子管理器ssyy2項目。
另外,默認情況下,項目屬性設(shè)置的目錄起點為項目配置文件所在位置,實際上就是項目頭文件和源文件所在位置。
補充:vs中建立默認的C#項目和建立默認的C++項目生成的目錄結(jié)構(gòu)是不一樣的。如果是C#項目,則解決方案總文件夾下就只包含解決方案配置文件sln和一個項目總文件夾(共兩個東東),而項目總文件夾下包含c#源文件、項目配置文件proj、一個Properties屬性文件夾、一個obj文件夾和一個bin文件夾,其中obj和bin文件夾下都包含debug和release兩個文件夾。obj文件夾下存放中間編譯結(jié)果(擴展名更加項目類型而不同),而bin文件夾下存放最終生成的結(jié)果(擴展名一般為exe或dll)。
而如果是C++項目,則解決方案總文件夾下就只包含解決方案配置文件sln和一個項目總文件夾和一個Debug文件夾以及一個Release文件夾(共四個東東,其中Debug和Release文件夾中存放最終生成的結(jié)果exe或dll,要注意如果不使用Release生成,則不存在Release文件夾),而項目總文件夾下包含C++源文件頭文件、項目配置文件和一個Debug文件夾以及一個Release文件夾(一定要注意,此處的Debug和Release文件夾僅僅存放中間編譯結(jié)果obj,不存放exe和dll之類的東西。如果不使用Release編譯,則沒有對應的Release文件夾)。
由此可見,c#項目默認生成的文件目錄結(jié)構(gòu)更合理,且輸出的exe位于總項目文件夾內(nèi),而c++項目默認exe位于解決方案總文件夾下。另外c#更合理在,C#使用Bin目錄,在Bin目錄下包含debug和release兩個目錄,而C++不使用Bin目錄,直接使用debug和releae兩個目錄。
?
其次,常用項目屬性和系統(tǒng)配置變量關(guān)系:
???????? 如果我們建立一個默認的vc項目ssyy,他的默認“常規(guī)“欄目中,“輸出目錄”為$(SolutionDir)$(ConfigurationName),所以調(diào)試時會在解決方案文件夾下建立一個debug(ConfigurationName的值為debug)文件夾,并在此文件夾下生成?ssyy.lik鏈接器?和ssyy.exe文件?。默認“中間目錄”為$(ConfigurationName),所以會在ssyy項目文件夾下(即ssyy.vcproj的項目配置文件所在位置)建立一個debug文件夾,并在該文件夾下生成ssyy.obj二進制文件。默認“鏈接器”欄目下的“常規(guī)”選項下的“輸出文件”選項為$(OutDir)\$(ProjectName).exe,其中$(OutDir)就已經(jīng)在“常規(guī)”欄目的“輸出目錄”選項賦值了。【所以$(OutDir)的值是在“輸出目錄”屬性中定義的】。
??????? 另外,經(jīng)過實際測試,發(fā)現(xiàn)“輸出目錄”屬性只能起到對$(OutDir)系統(tǒng)變量賦值的作用,和“改變生成的.exe文件存放位置”沒任何關(guān)系。也就是說,如果“輸出目錄”中設(shè)置的$(OutDir)值在C盤,而“輸出文件”中設(shè)置輸出文件的位置為D盤,最終生成的exe文件會在D盤,“輸出文件”屬性才決定輸出exe文件的位置。
??????? 而$(TargetDir)的值是在生成exe文件后自動賦予值為exe文件所在位置。所以可以說,“輸出文件”最終決定exe文件所在的位置,也最終決定了$(TargetDir)的值,$(TargetPath)和$(TargetDir)的行為是類似的,此不贅述。
??????? 上面兩段說了這么多,總結(jié)就是,默認情況下“輸出目錄”和“輸出文件”兩個屬性對應的目錄是一樣的,這樣用著方便(當然,輸出文件的值在輸出目錄的值的基礎(chǔ)上還包含有exe文件名)。如果兩個不一樣,則中間生成的鏈接器用的如xx.ilk和xx.pdb文件等在輸出目錄,而最終生成的xx.exe文件在“輸出文件”屬性設(shè)置的目錄中。
另外,上面兩段話可以總結(jié)出,當調(diào)試程序時,系統(tǒng)變量$(OutDir)的值是最先確定的,而$(TargetDir)和$(TargetPath)的值是在exe文件生成后才確定的。也就是說系統(tǒng)變量$(OutDir)的值由VS項目的“輸出目錄”屬性決定,而$(TargetDir)和$(TargetPath)的值由VS項目的“輸出文件”屬性決定。即設(shè)置了VS的“輸出目錄”屬性就相當于設(shè)置了$(OutDir)的值,“輸出目錄”是界面上的提示用于接收用戶輸入的配置信息,然后把這個具體的配置信息存入系統(tǒng)內(nèi)容的變量$(OutDir)中。
其它常用的屬性還有,“調(diào)試”欄目中的“工作目錄”項,這個屬性默認情況下是空的,但表示工作目錄是工程目錄,也就是工程配置文件ssyy.vcproj所在目錄。工作目錄表示進行某項操作的目的目錄,會隨著OpenFileDialog、SaveFileDialog等對象所確定的目錄而改變。“工作目錄”屬性作用是程序運行后唯一識別的默認目錄,即工作后只認識這個目錄,工作目錄這個名字描述的就很形象,(可以將所依賴的lib和dll庫文件所在目錄設(shè)為工作目錄,但一般是把lib放在解決方案下的Lib目錄中,把dll放在解決方案下的Bin目錄中),例如程序運行過程中生成一個txt文本文件,如果在創(chuàng)建文件過程中未指定絕對路徑,只指定創(chuàng)建文件的文件名,那么這個文本文件默認就會建立在工作目錄中,當然讀取一些配置文件也在工作目錄中查找,但要說明一下,生成的exe文件跟工作目錄沒任何關(guān)系,也不會放在工作目錄中。總的來說,工作目錄就是程序運行過程中默認讀取的目錄。對于dll,如果是程序運行前就進入內(nèi)存有點像靜態(tài)鏈接那樣,此時dll就可以放入exe所在的執(zhí)行目錄,如果dll是運行中動態(tài)加載的一般放在工作目錄,比如插件就放在工作目錄。即工作目錄就是運行期間唯一能識別的默認目錄,工作目錄在代碼中用GetCurrentDirectory之類的函數(shù)獲取,具體代碼間最下面的附1。工作目錄與執(zhí)行目錄可以不同,例如一個人住在北京,但他的工作地點不一定在北京,可能在天津。
【對工作目錄的補充:vs中工作目錄的設(shè)置是給調(diào)試用的,也即你啟動調(diào)試后,啟動一個新進程,自動把這個新進程的工作目錄設(shè)置為vs項目屬性中的工作目錄,然后新進程啟動對應的exe程序。但是如果不使用vs的調(diào)試啟動exe,而是直接雙擊exe文件啟動一個新進程時,會自動把這個新進程的工作目錄設(shè)置為exe文件所在的目錄,這是和vs啟動調(diào)試不同的地方。所以如果發(fā)布的時候不把工作目錄內(nèi)的東西拷到exe所在的目錄內(nèi),就會運行出錯,因為此時工作目錄不再是vs中設(shè)置的了,而是exe文件所在的目錄。最后,說一下,vs中默認的vc++工程的工作目錄項目的值是空的,代表默認是vs工程所在目錄即.vcproj文件所在目錄,c#工程默認沒測試,估計和vc的一樣。】
【同樣在調(diào)試選項下的和工作目錄選項同一級的選項“命令”選項是設(shè)置,使用調(diào)試時,從哪里啟動exe文件,因為一般生成的exe放在bin目錄下的debug或release目錄下,所以命令選項一般為“Bin\$(Configuration)\$(ProjectName).exe”,默認也是這個值,當然可以更改,但此時意味著調(diào)試狀態(tài)下啟動的exe為“命令”選項中設(shè)置的exe文件,而不是默認的bin目錄下的debug或release下的exe文件了。最后說一下,上面所說的“調(diào)試”是指vs下啟動exe,包括debug模式和release模式,不要把調(diào)試就理解為只有debug模式。】
?
?“調(diào)試”欄目中的“命令(Command)”屬性項,【這個屬性表示調(diào)試器要啟動的exe文件的全名】,包括路徑名,默認為$(TargetPath),而TargetPath就表示目標輸出文件的全路徑名,所以一般情況下它代表的值就等于“輸出文件”屬性代表的值。當然你也可以人為的更改“命令”屬性的值,比如更改為c:\aa.exe,而“輸出文件”的值為c:\bb.exe,此時如果輸出文件所在目錄沒有aa.exe的話(因鏈接器只生成bb.exe而根本不會生成aa.exe),調(diào)試器就不能啟動aa.exe,提示找不到aa.exe。當然如果目錄中已經(jīng)有aa.exe文件(可以強制賦值一個bb.exe文件的副本并命名為aa.exe),此時調(diào)試器就可以正常調(diào)試通過。
“鏈接器”欄目下的“輸入”選項下的“附加依賴項”項。此項是設(shè)置程序鏈接時使用的靜態(tài)庫。相當于鏈接已經(jīng)編譯好了的“代碼”。由此我們可以簡單的認為這些庫就相當于我們自己寫的.cpp文件,只不過這些庫是編譯好了的.cpp而已(這里只需要庫名稱即可,搜索路徑在其他地方設(shè)置)。
“附加依賴性的設(shè)置”等同于在代碼中寫“#pragma comment(lib, "庫名稱.lib") ”語句,如果使用相對路徑則如下:
#pragma comment(lib,"..\\debug\\TestLib.lib");其中的反斜杠要用雙反斜杠,因為它是程序解釋的雙引號包括的字符串,需要轉(zhuǎn)義一下,要區(qū)別include,#include "..\TestVideoApplication.h"中并不是由程序解釋的字符串,所以不用轉(zhuǎn)義。
?
下面舉一個多項目例子(vc++例子):(轉(zhuǎn)自:http://blog.163.com/zhang_bo1983/blog/static/16992223020123753334981/)
解決方案與項目:
從VC6之后VC系列就使用解決方案(Solution)來替代原來的工作空間,用于組織和管理多個相關(guān)的項目(Project)。
文章首先演示一個虛擬的解決方案和我們期望得到的目錄結(jié)構(gòu),然后使用VC2008的項目設(shè)置功能來一步一步達到我們的需求。
虛擬解決方案:
該虛擬解決方案名為GMA,包含一個動態(tài)鏈接庫項目ChocolateMilk和一個應用程序項目PureMilk,需要使用一個第三方庫log4cxx(Apache log4j的C++移植版本,用于日志輸出)。【注意這個例子中ChocolateMilk項目只生成一個dll,PureMilk只生成一個exe】
log4cxx是以動態(tài)庫的方式編譯的,所以我們需要它的3樣東西,分別是頭文件,導入庫(log4cxx.lib, log4cxxd.lib)和動態(tài)鏈接庫(log4cxx.dll)。
假設(shè)我們期望的目錄結(jié)構(gòu)如下圖:
1. GMA是解決方案目錄
2. PureMilk和ChocolateMilk是項目目錄
3.?Lib目錄用于存放導入庫或者靜態(tài)庫(包括第三方庫和自己的項目)
4.?Include用于存放第三方庫的頭文件(可以看出第三方庫所有內(nèi)容分布在Lib、Include和Bin中)
5. Bin目錄存放所有動態(tài)鏈接庫和執(zhí)行檔,包括自己的產(chǎn)出和第三方庫,區(qū)分Release和Debug兩個版本。另外,程序運行過程中需要外部的數(shù)據(jù)文件和啟動時需要的配置文件等等都可放于該目錄
6. Temp用于存放臨時生成文件,其中Compile存放編譯器編譯時生成的obj文件,Link存放鏈接器的輸出文件。
7.PureMilk和ChocoliteMilk兩個項目的頭文件和源文件位置不要動,任然在各自的項目文件夾內(nèi)。
上面目錄結(jié)構(gòu)清晰,一面了然,當我們的程序需要制作安裝包或者要打包源碼
發(fā)布的時候,它能夠使得我們生活變得更容易^_^
制作安裝包時我們只需將“/GMA/Bin/Release/”目錄下的所有文件打包。
發(fā)布和轉(zhuǎn)移源碼的時候我們可以打包除了Temp目錄以外“/GMA/”下面的所有文件和目錄(如果不需要執(zhí)行檔,也可不包括Bin)。
我們的需求是明確的,可是VC 2008(VS2008)并不會自動為我們做好上面所有的事情。不過我們并不需要編寫復雜的編譯腳本(makefile),只需要簡單的修改項目的缺省設(shè)置即可。
我們需要VC(VS)為我們做的事情包括:
1.使用“/GMA/Temp/Compile/”作為項目編譯時使用的中間目錄
2.使用“/GMA/Temp/Link/”作為項目鏈接的輸出目錄
3.當項目是應用程序時,在構(gòu)建結(jié)束后拷貝執(zhí)行文件到“/GMA/Bin/Release/”或“/GMA/Bin/Debug/”,當項目是動態(tài)鏈接庫時,除了拷貝dll到Bin,還拷貝導入庫到“/GMA/Lib/”
4.當項目是應用程序時,調(diào)試時運行“/GMA/Bin/Debug/”或“/GMA/Bin/Release/”下面的執(zhí)行文件,并以“/GMA/Bin/Debug/”或“/GMA/Bin/Release/”為工作目錄
首先看一下項目設(shè)置中可以使用的宏,常用的有:
ConfigurationName | 配置名字,通常是Debug或者Release |
IntDir | 編譯器使用的中間目錄,產(chǎn)出obj文件 |
OutDir | 鏈接器使用的輸出目錄 |
ProjectDir | 項目目錄 |
ProjectName | 項目名字 |
SolutionDir | 解決方案目錄 |
TargetDir | 目標輸出文件所在的目錄 |
TargetExt | 目標輸出的擴展名 |
TargetFileName | 目標輸出文件名,包括擴展名 |
TargetName | 目標輸出名,不包括擴展名 |
TargetPath | 目標輸出文件的全路徑名 |
?
?
?
?
?
?
下圖是某一個工程所有設(shè)置的例子:
注意:從上圖可以看出,TargetDir指目標目錄,是一個目錄。而TargetPath是目標路徑,包括具體的文件名。
?
下面開始進行所舉例子的工程設(shè)置:
首先來設(shè)置ChocolateMilk:
1.使用“/GMA/Temp/Compile/”作為項目編譯時使用的中間目錄
2.使用“/GMA/Temp/Link/”作為項目鏈接的輸出目錄
注意高亮的部分,首先將配置改成All Configuration(全部配置),這樣可以讓我們同時修改Debug和Release的部分;
Output Directory(輸出目錄,鏈接器)欄位填入:
$(SolutionDir)\Temp\Link\$(ProjectName)\$(ConfigurationName)
Intermediate Directory(中間目錄,編譯器)欄位填入:
$(SolutionDir)\Temp\Compile\$(ProjectName)\$(ConfigurationName)
3.構(gòu)建結(jié)束后拷貝動態(tài)鏈接庫到“/GMA/Bin/Release/”或“/GMA/Bin/Debug/”,拷貝導入庫到“/GMA/Lib/”【這是因為若不設(shè)置,此時生成的dll和lib都在上面設(shè)置的輸出目錄中】
我們通常都會在Debug版本的輸出庫后面加上字母“d”以表示這是Debug版本,在Debug配置下,修改Import Library欄位:
VC可以讓我們設(shè)置構(gòu)建前后執(zhí)行的腳本程序,所以為了完成3,
我們需要寫構(gòu)建后執(zhí)行的腳本:
在Command Line中填入,Debug配置下:
copy $(TargetPath)?? ?$(SolutionDir)\Bin\$(ConfigurationName)\;
copy $(TargetDir)$(TargetName)d.lib??? $(SolutionDir)\Lib\;
Release配置下:
copy $(TargetPath)??? $(SolutionDir)\Bin\$(ConfigurationName)\;
copy $(TargetDir)$(TargetName).lib??? $(SolutionDir)\Lib\;
之所以要分別設(shè)置是因為VC沒有表示導入庫的宏名字 -_-P
OK,到此為止,你就可以編譯ChocolateMilk項目試試是不是一切正常了,不過請確認拷貝的目標目錄事先建立好。
?
接下來我們設(shè)置應用程序項目PureMilk:
1.使用“/GMA/Temp/Compile/”作為項目編譯時使用的中間目錄
2.使用“/GMA/Temp/Link/”作為項目鏈接的輸出目錄
首先將配置改成All Configuration(全部配置),這樣可以讓我們同時修改Debug和Release的部分;
Output Directory(輸出目錄,鏈接器)欄位填入:
$(SolutionDir)\Temp\Link\$(ProjectName)\$(ConfigurationName)
Intermediate Directory(中間目錄,編譯器)欄位填入:
$(SolutionDir)\Temp\Compile\$(ProjectName)\$(ConfigurationName)
3.構(gòu)建結(jié)束后拷貝執(zhí)行文件到“/GMA/Bin/Release/”或“/GMA/Bin/Debug/”
在Command Line中填入,All配置下:
copy $(TargetPath)?? ?$(SolutionDir)\Bin\$(ConfigurationName);
4.調(diào)試時運行“/GMA/Bin/Debug/”或“/GMA/Bin/Release/”下面的執(zhí)行文件,并以“/GMA/Bin/Debug/”或“/GMA/Bin/Release/”為工作目錄
Command欄位填入:$(SolutionDir)\Bin\$(ConfigurationName)\$(TargetFileName)
Working Directory欄位填入:$(SolutionDir)\Bin\$(ConfigurationName)\
這樣就大功告成了,現(xiàn)在你就可以編譯該執(zhí)行程序并進行調(diào)試。
?
?
以vs2010為列,一些項目屬性截圖如下:
一、調(diào)試-》命令
如上圖設(shè)置,如果項目名稱為ss,則TargetName系統(tǒng)變量的值就是ss,TargetExt是擴展名為exe,此時單擊調(diào)試按鈕(vs中的那個小三角形按鈕),會起動圖中所示目錄下的ss-XX-.exe文件。
注意:調(diào)試欄目下的所有選項都是為了調(diào)試服務的,如果不用調(diào)試按鈕,這些選項就不起作用。至于VC++目錄以及C/C++欄目是給編譯器起作用的,無法是告訴編譯器在哪里尋找頭文件、庫文件之類的事情,或者設(shè)置其他一些編譯器選項,此不贅述。
?
二、鏈接器-》常規(guī)-》輸出文件? (表示鏈接器生成的exe文件放在哪以及生成的exe文件名稱)
上圖中,如果項目名稱為ss,則連接器生成的exe為圖中所示目錄下的ss-YY-.exe文件。一般來說這個文件的位置和名稱要和上面所述的“命令”選項相同,以表示鏈
...總結(jié)
以上是生活随笔為你收集整理的VS项目属性的一些配置项的总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员:开汽车,难道我要知道汽车的原理才
- 下一篇: 流媒体技术的国内外动态