前言
本文總結了Visual Studio中常見的環境變量及其在組織解決方案、工程中的作用。
注:本文使用的是Visual Studio 2013,由於作者主要從事C/C++開發,所以是以Visual C++的工作環境配置來描述。
什么是vs的環境變量?
先看圖吧,圖中以美元符號$開頭 + 一對括號,這樣進行引用的就是我所謂的環境變量,
vs_env.jpg
圖中出現的幾個環境變量含義如下:
環境變量名 含義
$(SolutionDir) 解決方案目錄:即.sln文件所在路徑
$(Configuration) 當前的編譯配置名稱,比如Debug,或Release
$(ProjectName) 當前項目名稱,圖中即為Game
在中文版的VS中,環境變量翻譯為“宏”,為了避免與C/C++語言中的宏(Macro)搞混,我在本文中把它叫做“vs環境變量”,簡稱環境變量。
環境變量有什么用?
使用環境變量來組織工程目錄
vs作為一個IDE,其天職在於幫開發者組織好工程,主要包括對工程中源文件、庫文件的組織。(本質上是提供一個可視化的操作界面,讓開發者方便的定義編譯器和鏈接器的參數。)在使用vs來組織工程目錄時候最常用到的兩個目錄是:
頭文件包含目錄 (對應於編譯器命令的:-I 參數)
庫文件搜索路徑 (對應於編譯器的:-l 參數)
vs中默認的頭文件搜索路徑是: 工程路徑 – 即,.vcxproj(不同版本的VC++后綴名稱不同,如vs2010中后綴為.vcproj) 文件所在路徑。比如如下的目錄結構:
–Root/
—-Test.vcxproj
—-hello.cpp
—-hello.h
—-world.cpp
—-world.h
—-main.cpp
—-/subdir
——sub.h
在Root目錄包含了.vcxproj文件,所以Root就是工程路徑,在vs中,這個目錄下面的.h文件可以直接使用include包含進來, 比如在main.cpp中我可以寫:
#include "hello.h"
#include "world.h"
1
2
但是對於sub.h,我們就不能直接寫#include "sub.h", 因為工程路徑下面不能搜索到這個文件,我要告訴編譯器這個文件在哪里,通常有以下兩種方法:
寫成#include "subdir/sub.h"
把subdir目錄加入到頭文件搜索路徑
Google的C++編程風格鼓勵第一種做法,好處是可以看到文件相對完整的路徑,如果頭文件搜索路徑只有一個根目錄,那么這個路徑就是文件的相對於根目錄的物理路徑,方便定位文件。
如果你覺得這樣寫很麻煩,並且路徑深度可能有多層,不同深度的路徑下又通常包含大量的文件,那么就可以選擇第二種做法,把每個子目錄統統加入到搜索路徑中,這樣,就可以不用帶着路徑,直接#include "filename.h"就可以了。具體在VS中要怎么合理的添加文件包含目錄呢?由此,便引出了本節問題的答案:環境變量有什么用?用途之一就是用來編寫頭文件的搜索路徑。
相信大家都知道如何在vs中添加一個頭文件搜索路徑這個常識,在此還是為初學者嘮叨一下具體做法:工程屬性 - 配置屬性 - C/C++ - 常規 - 編輯右側的”附加包含目錄”取值即可。
具體如下圖所示:
include_setting.jpg
點擊編輯之后,彈出如下圖所示的編輯窗口:
additional_searchpath.jpg
在這里可以新建、刪除包含路徑、調整包含順序。
點擊新建按鈕或者雙擊列表空白處即可添加一條包含路徑,在編輯新添加的路徑時,可以看到列表條目右側有一個瀏覽按鈕,
include_scan.jpg
點擊按鈕可以從打開文件對話框里選擇路徑,點擊確定后,會看到新添加的路徑名。雖然通過瀏覽來定位文件夾比較容易,免去了自己編寫,但是你會發現,通過瀏覽添加的路徑是絕對路徑。
如果你是項目的唯一開發者,並且僅僅使用這一台電腦來開發的話,那么使用絕對路徑也沒什么大問題。但是如果這個項目是個團隊協作項目,或者你需要在好幾台電腦之間切換,那么這個包含路徑如果寫絕對路徑就不夠靈活了,如果別人的路徑配置或別的電腦的路徑配置不同,那么要重新修改包含路徑。
一個比較合理的編寫包含路徑的方法是: 使用相對路徑。
相對誰呢? 相對項目根目錄或者解決方案根目錄。
為什么呢?因為不管別人的電腦有什么盤符、不管別人的項目放在何處,要包含的文件都可以通過項目所在位置來計算出來。
當然前提是,項目開發者們事先約定好被包含文件相對於項目根目錄的位置。通常是放在項目根目錄(或者解決方案根目錄)的某個子目錄里。
具體怎么做呢?這就需要用到本文的主題:環境變量了。剛才提到的兩個相對目錄所對應的環境變量如下表所示:
目錄 對應的環境變量名稱
項目根目錄 $(ProjectDir)
解決方案根目錄 $(SolutionDir)
要解決剛才小例子中的問題,
–Root/
—-Test.vcxproj
—-hello.cpp
—-hello.h
—-world.cpp
—-world.h
—-main.cpp
—-/subdir
——sub.h
注意到.vcxproj所在目錄即項目根目錄,也就是$(ProjectDir)的取值等於Root/。所以要把subdir放在包含目錄里,可以新建這樣一條包含路徑:
$(ProjectDir)subdir
這樣,在main.cpp里就可以直接寫#include "sub.h"了。不管項目被拷貝到哪里,都不用修改包含路徑。
上面就是環境變量使用的一個小例子。使用環境變量來編寫文件包含路徑的好處是: 包含路徑獨立於工程所在的路徑,無論工程被移動到哪里,都不需要重新修改包含路徑,因為使用環境變量來編寫的文件包含路徑是一種相對路徑。
其它vs環境變量
如何查看所有的環境變量值呢?
有好多個地方都可以查看,比如剛才在添加包含目錄時候,彈出的窗口,注意其右下方,有個“宏”按鈕
additional_searchpath.jpg
點擊它就能看到所有的“宏” (即vs環境變量的值):
all_vs_env.jpg
在上方的輸入框可以進行過濾。
下面的表格給出了常用的環境變量的含義:
環境變量名 含義
$(SolutionDir) 解決方案目錄:即.sln文件所在路徑
$(ProjectDir) 項目根目錄:, 即.vcxproj文件所在路徑
$(Configuration) 當前的編譯配置名稱,比如Debug,或Release
$(ProjectName) 當前項目名稱
$(SolutionName) 解決方案名稱
$(OutDir) 項目輸出文件目錄
$(TargetDir) 項目輸出文件目錄
$(TargetName) 項目生成目標文件, 通常和$(ProjectName)同名, 如Game
$(TargetExt) 項目生成文件后綴名,如.exe, .lib具體取決於工程設置
$(TargetFileName) 項目輸出文件名字。比如Game.exe, 等於 (TargetName)+
(TargetExt)
$(ProjectExt) 工程文件后綴名,如.vcxproj
在下一篇文章中,講介紹如何合理使用這些環境變量來組織VC++工程。
進階思考
如何定義、擴展VS的環境變量?
————————————————
版權聲明:本文為CSDN博主「elloop」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/elloop/article/details/51010151