VS工程配置中的一些常用概念
VS工程配置中一些常用概念
在看這篇文章之前首先思考幾個問題:
1、什麼是解決方案?為什麼要有解決方案?
2、我想引用的標頭檔案和我的cpp檔案不在同一個資料夾,我改怎麼辦?能直接引用嗎?
3、在配置opencv的時候需要配置的那些庫目錄、包含目錄到底是怎麼回事?
思考完上述問題,下面對上述問題進行解答,並介紹一些vs在工程配置的時候常用的一些做法和概念。儘量做到知其然,知其所以然。
一、解決方案(solution)與工程(project)
簡單的說解決方案就是多個工程的集合。solution存在的目的就是為了各個project之間方便的共享檔案和程式碼庫。假設我有多個project都需要用到一個liblinear的程式碼庫,我不要每個專案中都載入這個庫。另外,對於大型的工程專案,為了方便程式碼的管理和閱讀,往往將一個solution中的所.cpp和.hpp檔案都集中放在一個資料夾中,然後讓多個project直接包含這個資料夾即可。下面以caffe工程作為例項,講解一下caffe的檔案管理層次和構造。
下圖是caffe的solution:
caffe資料夾下的檔案:
這裡重點關注資料夾下的include、src、Windows資料夾。include存放的是整個solution所有的標頭檔案,src存放的是整個solution所有的原始檔(.cpp),window存放的是所有的project檔案。如下圖所示:
include資料夾下的內容:
src資料夾下的內容:
Windows資料夾下的內容:
二、VS中VC++目錄中各個目錄的作用
上圖是一般的VS工程需要配置的各個目錄。
1、可執行檔案目錄
搜尋可執行檔案的目錄,對應於環境變數PATH,
2、包含目錄
對應於環境變數 INCLUDE
搜尋在原始碼中引用的包含檔案的目錄,即標頭檔案的目錄。例如#include
3、引用目錄
在該視窗中顯示的目錄設定是 Visual Studio 將搜尋在原始碼檔案中通過 #using 引用的程式集和模組(元資料)檔案的目錄。對應於環境變數 LIBPATH。
4、庫目錄
在該視窗中顯示的目錄設定是 Visual Studio 將搜尋庫(包括執行時庫)的目錄。對應於環境變數 LIB。簡而言之,這個目錄就是尋找.lib檔案的目錄。
如果設定錯誤,會link error,提示”找不到XXX.lib”。
另外,該設定不適用於.obj 檔案;若要連結到 .obj 檔案,請在“連結器”->“常規”屬性頁中,選擇“附加庫目錄”,然後指定.obj檔案的路徑。
5、附加依賴項
C++的庫會把函式、類的宣告放在.h中,實現放在.cpp或.cc中。編譯之後,.cpp,.cc,.c會被打包成一個.lib檔案,這樣可以保護原始碼。所以,要使用一個庫,除了要include他的標頭檔案以外,還要在連結過程中把lib加進去。這個就是在附加連結庫中設定。
6、有了庫目錄為何還要附加依賴項?
庫目錄只是查詢目錄,而我們具體使用哪一個.lib需要指明的,如果不在附加依賴項裡填上,就需要在程式碼裡用#pragma comment(lib, “xxx.lib”)來手動指定了。寫程式碼讀寫一個檔案需要寫明檔名,這個檔名就相當於那個lib , 但讀寫這個檔案可以不寫全路徑,這是因為有庫目錄的存在。