首先講講解決方案和項目之間的關係。c++
VS2010使用解決方案管理項目,解決方案包含一個或多個項目。web
新建一個解決方案TestSolution,包含一個應用程序項目TestApp和一個動態連接庫項目TestLib。c#
TestSolution解決方案的總目錄結構以下:ide
TestSolution.sln爲解決方案的配置文件。
函數
TestApp文件夾和Testlib文件夾分別表明TestApp項目和TestLib項目測試
Debug文件夾以及Release文件夾,存放的是最終生成的結果exe或dll,要注意若是不使用Release生成,則不存在Release文件夾
spa
TestSolution.sdf用來保存預編譯的頭文件和Intellisense用的,刪除這些文件對於工程的開發徹底沒有影響,還有
插件
項目TestApp的目錄結構以下:debug
Debug文件夾和Release文件夾: 存放的是中間編譯結果obj調試
TestApp.vcxproj:項目配置文件
TestApp:vcxproj.filters:用於項目下文件的虛擬目錄 。關於vcxproj.filters文件的詳細介紹,能夠看這篇文章: http://www.cjjjs.cn/paper/xmkf/6242015223023494.aspx
TextApp.vcxproj.user:用戶的一些相關配置
第二,經常使用項目屬性和系統配置變量關係
$(SolutionDir):解決方案目錄
$(Configuration):指Debug或Release
$(OutDir):在 「常規--輸出目錄 」中定義的值,如$(SolutionDir)$(Configuration)\。因此調試時會在解決方案文件夾下創建一個Debug(Configuration的值爲Debug)文件夾,並在此文件夾下生成 TestApp.lik連接器 和TestApp.exe文件 。
$(ProjectName):目標文件名
$(TargetExt):擴展名
默認「中間目錄」爲$(Configuration),因此會在TestApp項目文件夾下(即TestApp.vcxproj的項目配置文件所在位置)創建一個Debug文件夾,並在該文件夾下生成TestApp.obj二進制文件。
默認「連接器」欄目下的「常規」選項下的「輸出文件」選項爲:$(OutDir)$(TargetName)$(TargetExt)。其中$(OutDir)就已經在「常規」欄目的「輸出目錄」選項賦值了。【因此$(OutDir)的值是在「輸出目錄」屬性中定義的】。
$(TargetName):目標輸出名,不包括擴展名
$(TargetDir) 的值是在生成exe文件後自動賦予值爲exe文件所在位置
$(TargetPath)的值是在$(TargetDir)值的基礎上加上exe文件名。
總結上面的內容,默認狀況下「輸出目錄」和「輸出文件」兩個屬性對應的目錄是同樣的,這樣用着方便(固然,輸出文件的值在輸出目錄的值的基礎上還包含有exe文件名)。若是兩個不同,則中間生成的連接器用的如xx.ilk和xx.pdb文件等在輸出目錄,而最終生成的xx.exe文件在「輸出文件」屬性設置的目錄中。
「連接器」欄目下的「輸入」選項下的「附加依賴項」項。此項是設置程序連接時使用的靜態庫。至關於連接已經編譯好了的「代碼」。由此咱們能夠簡單的認爲這些庫就至關於咱們本身寫的.cpp文件,只不過這些庫是編譯好了的.cpp而已(這裏只須要庫名稱便可,搜索路徑在其餘地方設置)。
「 附加依賴性的設置」等同於在代碼中寫「#pragma comment(lib, "庫名稱.lib") 」語句,若是使用相對路徑則以下:
#pragma comment(lib,"..\\debug\\TestLib.lib");其中的反斜槓要用雙反斜槓,由於它是程序解釋的雙引號包括的字符串,須要轉義一下,要區別include,#include "..\TestVideoApplication.h"中並非由程序解釋的字符串,因此不用轉義。
「調試」欄目中的「工做目錄」項,這個屬性默認狀況下是空的,但表示工做目錄是工程目錄,也就是項目配置文件TestApp.vcproj所在目錄。
工做目錄表示進行某項操做的目的目錄,會隨着OpenFileDialog、SaveFileDialog等對象所肯定的目錄而改變。「工做目錄」屬性做用是程序運行後惟一識別的默認目錄,即工做後只認識這個目錄,工做目錄這個名字描述的就很形象,(能夠將所依賴的lib和dll庫文件所在目錄設爲工做目錄,但通常是把lib放在解決方案下的Lib目錄中,把dll放在解決方案下的Bin目錄中),例如程序運行過程當中生成一個txt文本文件,若是在建立文件過程當中未指定絕對路徑,只指定建立文件的文件名,那麼這個文本文件默認就會創建在工做目錄中,固然讀取一些配置文件也在工做目錄中查找,但要說明一下,生成的exe文件跟工做目錄沒任何關係,也不會放在工做目錄中。
總的來講,工做目錄就是程序運行過程當中默認讀取的目錄。對於dll,若是是程序運行前就進入內存有點像靜態連接那樣,此時dll就能夠放入exe所在的執行目錄,若是dll是運行中動態加載的通常放在工做目錄,好比插件就放在工做目錄。即工做目錄就是運行期間惟一能識別的默認目錄,工做目錄在代碼中用GetCurrentDirectory之類的函數獲取。工做目錄與執行目錄能夠不一樣,例如一我的住在北京,但他的工做地點不必定在北京,可能在天津。
【對工做目錄的補充:vs中工做目錄的設置是給調試用的,也即你啓動調試後,啓動一個新進程,自動把這個新進程的工做目錄設置爲vs項目屬性中的工做目錄,而後新進程啓動對應的exe程序。可是若是不使用vs的調試啓動exe,而是直接雙擊exe文件啓動一個新進程時,會自動把這個新進程的工做目錄設置爲exe文件所在的目錄,這是和vs啓動調試不一樣的地方。因此若是發佈的時候不把工做目錄內的東西拷到exe所在的目錄內,就會運行出錯,由於此時工做目錄再也不是vs中設置的了,而是exe文件所在的目錄。最後,說一下,vs中默認的vc++工程的工做目錄項目的值是空的,表明默認是vs工程所在目錄即.vcproj文件所在目錄,c#工程默認沒測試,估計和vc的同樣。】
【一樣在調試選項下的和工做目錄選項同一級的選項「命令」選項是設置,使用調試時,從哪裏啓動exe文件,由於通常生成的exe放在bin目錄下的debug或release目錄下,因此命令選項通常爲「Bin\$(Configuration)\$(ProjectName).exe」,默認也是這個值,固然能夠更改,但此時意味着調試狀態下啓動的exe爲「命令」選項中設置的exe文件,而不是默認的bin目錄下的debug或release下的exe文件了。最後說一下,上面所說的「調試」是指vs下啓動exe,包括debug模式和release模式,不要把調試就理解爲只有debug模式。】
「調試」欄目中的「命令(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),此時調試器就能夠正常調試經過。