1. 程式人生 > >Visual Studio 2008 、 Windows 環境變數介紹和c++檔案流中檔案路徑

Visual Studio 2008 、 Windows 環境變數介紹和c++檔案流中檔案路徑

Visual Studio 2008  和 Windows 環境變數對設定 相對路徑很重要,這樣便於程式碼的移植,即使換一臺計算機,程式碼不用更改配置,直接就能用。

可以在專案的“工具”“屬性頁”對話方塊中任何接受字串的位置使用這些巨集。這些巨集不區分大小寫。 

巨集

說明

$(RemoteMachine)

在“除錯”屬性頁上設定為 Remote Machine 屬性的值。有關更多資訊,請參見更改用於 C/C++ 除錯配置的專案設定

$(Configuration)

當前專案配置的名稱(例如“Debug”)。

$(Platform)

當前專案平臺的名稱(例如“Win32”)。

$(RootNameSpace)

包含應用程式的名稱空間(如果有)。

$(IntDir)

為中間檔案指定的相對於專案目錄的目錄路徑。此路徑應具有尾部斜槓。這解析為Intermediate Directory 屬性的值。

$(OutDir)

輸出檔案目錄的路徑,相對於專案目錄。此路徑應具有尾部斜槓。這解析為 Output Directory 屬性的值。

$(DevEnvDir)

Visual Studio 2010 的安裝目錄(定義為驅動器 + 路徑);包括尾部反斜槓“/”。

$(ProjectDir)

專案的目錄(定義形式:驅動器 + 路徑);包括尾部的反斜槓“/”。

$(ProjectPath)

專案的絕對路徑名(定義形式:驅動器 + 路徑 + 基本名稱 + 副檔名)。

$(ProjectName)

專案的基名稱。

$(ProjectFileName)

專案的檔名(定義為基本名稱 + 副檔名)。

$(ProjectExt)

專案的副檔名。它包括“.”在副檔名之前。

$(SolutionDir)

解決方案的目錄(定義形式:驅動器 + 路徑);包括尾部的反斜槓“/”。

$(SolutionPath)

解決方案的絕對路徑名(定義形式:驅動器 + 路徑 + 基本名稱 + 副檔名)。

$(SolutionName)

解決方案的基名稱。

$(SolutionFileName)

解決方案的檔名(定義為基本名稱 + 副檔名)。

$(SolutionExt)

解決方案的副檔名。它包括“.”在副檔名之前。

$(TargetDir)

生成的主輸出檔案的目錄(定義形式:驅動器 + 路徑);包括尾部的反斜槓“/”。

$(TargetPath)

生成的主輸出檔案的絕對路徑名(定義形式:驅動器 + 路徑 + 基本名稱 + 副檔名)。

$(TargetName)

生成的主輸出檔案的基本名稱。

$(TargetFileName)

生成的主輸出檔案的檔名(定義為基本名稱 + 副檔名)。

$(TargetExt)

生成的主輸出檔案的副檔名。它包括“.”在副檔名之前。

$(VSInstallDir)

安裝 Visual Studio 2010 的目錄。 
此屬性包含目標 Visual Studio 的版本,該版本可能與宿主 Visual Studio 不同。例如,在使用 $(PlatformToolset) = v90 進行生成時,$(VSInstallDir) 包含 Visual Studio 2008 安裝位置的路徑。

$(VCInstallDir)

安裝 Visual C++ 2010 的目錄。 
此屬性包含目標 Visual C++ 的版本,該版本可能與宿主 Visual Studio 不同。例如,在使用 $(PlatformToolset) = v90 進行生成時,$(VCInstallDir) 包含 Visual C++ 2008 安裝位置的路徑。

$(FrameworkDir)

安裝 .NET Framework 的目錄。

$(FrameworkVersion)

Visual Studio 使用的 .NET Framework 版本。與 $(FrameworkDir) 相結合,就是 Visual Studio 使用的 .NET Framework 版本的完整路徑。

$(FrameworkSDKDir)

安裝 .NET Framework 的目錄。.NET Framework 可能已作為 Visual Studio 2010 的一部分安裝,也可能單獨安裝。

$(WebDeployPath)

從 Web 部署根到專案輸出所屬於的位置的相對路徑。返回與 RelativePath 相同的值。

$(WebDeployRoot)

指向 <localhost> 位置的絕對路徑。例如,c:/inetpub/wwwroot。

$(FxCopDir)

fxcop.cmd 檔案的路徑。fxcop.cmd 檔案不和所有的 Visual C++ 版本一起安裝。

Visual Studio 2010
  >>Visual Studio
    >>Visual Studio 語言
      >>Visual C++
        >>Building a C/C++ Program
          >>在 Visual Studio 中生成 C++ 專案
            >>用於生成命令和屬性的巨集

Visual Studio 2008 產生的臨時檔案

Visual Studio臨時檔案存放的資料夾

在使用Visual Studio開發工具的過程中,Visual Studio會在如下資料夾(以VS2008和.NET Framework 2.0為例)中生成一些臨時性的檔案:
1、ReflectedSchemas:完整路徑為“C:\Documents and Settings\Administrator\Application Data\Microsoft\VisualStudio\9.0\ReflectedSchemas”。
2、ReflectedTypeLibs:完整路徑為“C:\Documents and Settings\Administrator\Application Data\Microsoft\VisualStudio\9.0\ReflectedTypeLibs”。
3、Temporary ASP.NET Files:完整路徑為“C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files“。

我的系統不是C盤,使用者名稱也不是Administrator,有批處理命令中用環境變數: 
1、%USERPROFILE%\Application Data\Microsoft\VisualStudio\9.0\ReflectedSchemas 
2、%USERPROFILE%\Application Data\Microsoft\VisualStudio\9.0\ReflectedTypeLibs 
3、%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files

Windows 環境變數介紹

Windows系統路徑環境變數 
%SystemDrive%        作業系統所在的分割槽號。如   C:

%SystemRoot%         作業系統根目錄。如 C:\WINDOWS

%windir%                   作業系統根目錄。如 C:\WINDOWS

%ALLUSERSPROFILE%           相當於   C:\Documents and Settings\All Users

%APPDATA%           相當於   C:\Documents and Settings\使用者目錄\Application Data

%ProgramFiles%      相當於   C:\Program Files

%CommonProgramFiles%          相當於   C:\Program Files\Common Files

%HOMEDRIVE%       作業系統所在的分割槽號。如:C:

%HOMEPATH%        相當於   \Documents and Settings\使用者目錄

%USERPROFILE%   相當於   C:\Documents and Settings\使用者目錄

%HOMEDRIVE%     = C:\                    當前啟動的系統的所在分割槽 
%SystemRoot%      = C:\WINDOWS           當前啟動的系統的所在目錄 
%windir%                 = %SystemRoot% = C:\WINDOWS                   當前啟動的系統的所在目錄
%USERPROFILE% = C:\Documents and Settings\sihochina           當前使用者資料變數 
%HOMEPATH%       = C:\Documents and Settings\sihochina           當前使用者環境變數 
%system%              = C:\WINDOWS\SYSTEM32   

%ALLUSERSPROFILE% : 列出所有使用者Profile檔案位置。 
%APPDATA% :   列出應用程式資料的預設存放位置。 
%CD% :   列出當前目錄。 
%CLIENTNAME% :   列出聯接到終端服務會話時客戶端的NETBIOS名。 
%CMDCMDLINE% :   列出啟動當前cmd.exe所使用的命令列。 
%CMDEXTVERSION% :   命令出當前命令處理程式擴充套件版本號。 
%CommonProgramFiles% :   列出了常用檔案的資料夾路徑。 
%COMPUTERNAME% :   列出了計算機名。 
%COMSPEC% :   列出了可執行命令外殼(命令處理程式)的路徑。 
%DATE% :   列出當前日期。 
%ERRORLEVEL% :   列出了最近使用的命令的錯誤程式碼。 
%HOMEDRIVE% :   列出與使用者主目錄所在的驅動器碟符。 
%HOMEPATH% :   列出使用者主目錄的完整路徑。 
%HOMESHARE% :   列出使用者共享主目錄的網路路徑。 
%LOGONSEVER% :   列出有效的當前登入會話的域名控制器名。 
%NUMBER_OF_PROCESSORS% :   列出了計算機安裝的處理器數。 
%OS% :   列出作業系統的名字。(Windows XP 和 Windows 2000 列為 Windows_NT.) 
%Path% :   列出了可執行檔案的搜尋路徑。 
%PATHEXT% :   列出作業系統認為可被執行的副檔名。 
%PROCESSOR_ARCHITECTURE% :   列出了處理器的晶片架構。 
%PROCESSOR_IDENTFIER% :   列出了處理器的描述。 
%PROCESSOR_LEVEL% :   列出了計算機的處理器的型號。 
%PROCESSOR_REVISION% :   列出了處理器的修訂號。 
%ProgramFiles% :   列出了Program Files資料夾的路徑。 
%PROMPT% :   列出了當前命令直譯器的命令提示設定。 
%RANDOM% :   列出界於0 和 32767之間的隨機十進位制數。 
%SESSIONNAME% :   列出連線到終端服務會話時的連線和會話名。 
%SYSTEMDRIVE% :   列出了Windows啟動目錄所在驅動器。 
%SYSTEMROOT% :   列出了Windows啟動目錄的位置。 
%TEMP% and %TMP% :   列出了當前登入的使用者可用應用程式的預設臨時目錄。 
%TIME% :   列出當前時間。 
%USERDOMAIN% :   列出了包含使用者帳號的域的名字。 
%USERNAME% :   列出當前登入的使用者的名字。 
%USERPROFILE% :   列出當前使用者Profile檔案位置。 
%WINDIR% :   列出作業系統目錄的位置。

變數 型別 描述 
%ALLUSERSPROFILE% 本地 返回“所有使用者”配置檔案的位置。 
%APPDATA% 本地 返回預設情況下應用程式儲存資料的位置。 
%CD% 本地 返回當前目錄字串。 
%CMDCMDLINE% 本地 返回用來啟動當前的 Cmd.exe 的準確命令列。 
%CMDEXTVERSION% 系統 返回當前的“命令處理程式擴充套件”的版本號。 
%COMPUTERNAME%   系統 返回計算機的名稱。 
%COMSPEC%   系統 返回命令列直譯器可執行程式的準確路徑。 
%DATE%   系統 返回當前日期。使用與 date /t 命令相同的格式。由 Cmd.exe 生成。有關 date 命令的詳細資訊,請參閱 Date。 
%ERRORLEVEL%   系統 返回上一條命令的錯誤程式碼。通常用非零值表示錯誤。 
%HOMEDRIVE%   系統 返回連線到使用者主目錄的本地工作站驅動器號。基於主目錄值而設定。使用者主目錄是在“本地使用者和組”中指定的。 
%HOMEPATH%   系統 返回使用者主目錄的完整路徑。基於主目錄值而設定。使用者主目錄是在“本地使用者和組”中指定的。 
%HOMESHARE%   系統 返回使用者的共享主目錄的網路路徑。基於主目錄值而設定。使用者主目錄是在“本地使用者和組”中指定的。 
%LOGONSERVER%   本地 返回驗證當前登入會話的域控制器的名稱。 
%NUMBER_OF_PROCESSORS%   系統 指定安裝在計算機上的處理器的數目。 
%OS%   系統 返回作業系統名稱。Windows 2000 顯示其作業系統為 Windows_NT。 
%PATH% 系統 指定可執行檔案的搜尋路徑。 
%PATHEXT% 系統 返回作業系統認為可執行的副檔名的列表。 
%PROCESSOR_ARCHITECTURE%   系統 返回處理器的晶片體系結構。值:x86 或 IA64(基於 Itanium)。 
%PROCESSOR_IDENTFIER% 系統 返回處理器說明。 
%PROCESSOR_LEVEL%   系統 返回計算機上安裝的處理器的型號。 
%PROCESSOR_REVISION% 系統 返回處理器的版本號。 
%PROMPT% 本地 返回當前解釋程式的命令提示符設定。由 Cmd.exe 生成。 
%RANDOM% 系統 返回 0 到 32767 之間的任意十進位制數字。由 Cmd.exe 生成。 
%SYSTEMDRIVE% 系統 返回包含 Windows server operating system 根目錄(即系統根目錄)的驅動器。 
%SYSTEMROOT%   系統 返回 Windows server operating system 根目錄的位置。 
%TEMP% 和 %TMP% 系統和使用者 返回對當前登入使用者可用的應用程式所使用的預設臨時目錄。有些應用程式需要 TEMP,而其他應用程式則需要 TMP。 
%TIME% 系統 返回當前時間。使用與 time /t 命令相同的格式。由 Cmd.exe 生成。有關 time 命令的詳細資訊,請參閱 Time。 
%USERDOMAIN% 本地 返回包含使用者帳戶的域的名稱。 
%USERNAME% 本地 返回當前登入的使用者的名稱。 
%USERPROFILE% 本地 返回當前使用者的配置檔案的位置。 
%WINDIR% 系統 返回作業系統目錄的位置。

%temp%        = %USERPROFILE%\Local Settings\Temp = C:\Documents and Settings\sihochina\Local Settings\Temp                                                                              當前使用者TEMP快取變數
------------------------------------------------------------------------ 
例如:%windir%\drives 的實際路徑就是 C:\WINDOWS\drives 目錄。 
          所謂變數,就是指一個在不同環境中會有相對不同的值的、但在所有環境中都有相同約定的含義的量。 
          這些變數,可以在開始選單-執行中輸入,如輸入%SystemRoot% ,系統會直接開啟 C:\WINDOWS 目錄。
如果你當前的系統是裝在D盤的2000的話,上邊這個變數的執行結果就是開啟 D:\WINNT 目錄了。

在除錯 Visual Studio 2008 程式時,經常有一些動態連結庫(即 dll 檔案)需要載入到工程裡,這樣才能依賴第三方庫進行程式除錯。

這些動態連結庫,往往都是測試版本或是開發中的版本,或者會有若干個版本;這個時候,如果直接把 dll 所在目錄加到 PATH 裡,則會有潛在衝突的危險;如果直接拷貝到 Visual Studio 的目錄下,假如測試工程太多,每次有新版本的動態連結庫更新時,你需要更新若干次,拷貝、貼上苦不堪言。

在開發過程中,究竟怎樣來讓 Visual Studio 連結這些 lib 及 dll 檔案會比較好呢?

總體上來說,有幾種方法可以改變 Visual Studio 的環境變數設定:

  1. 直接新增到系統的 PATH 變數裡

    這個方法最簡單,也最直接,但是壞處是會影響全域性的 PATH 設定,尤其是你包含著大量測試用的 dll 時。

  2. 在 Visual Studio 全域性設定裡,把 dll 所在目錄新增到 PATH 裡:

    通過 Visual Studio 選單 ==> 工具 ==> 選項 ==> 專案和解決方案 ==> VC++目錄,在下拉框裡選擇"可執行檔案",然後把 dll 所在路徑新增進去。

  3. 直接把所有 dll 拷貝到 Visual Studio 工程目錄下,或是拷貝到生成可執行檔案的資料夾(預設情況下是 Debug 或 Release 目錄)下:

    這個方法也很簡單,但是當你有若干個工程時,你每次更新 SDK 及其 dll 檔案,你就要把所有的工程都更新,這個不符合檔案唯一性的工程性準則。

  4. 在除錯程式時,讓 Visual Studio 幫你切換當前工作目錄到 dll 相應的目錄下:

    在 Visual Studio ==> Project ==> Properties ==> Select Configuration ==> Configuration Properties ==> Debugging ==> Working directory 裡填上 dll 所在目錄,這樣當在除錯程式時,Visual Studio 會把當前工作目錄切換到這個目錄下,從而會自動讀取本目錄下的 dll 檔案。

    這個方法的優點很明顯,簡單!副作用也很明顯,在你切換了當前工作目錄後,你可能會找不到程式的配置檔案,在程式裡寫的諸如"./config.ini"全部都找不到了;另外,你要把所有的 dll 都放到這個工作目錄裡,否則一樣會提示說找不到 xxx.dll 的問題。

  5. 最後一個方法,也是我認為最好的一個方法,在 Visual Studio 工程屬性裡把一個目錄臨時新增到 PATH 環境變數裡:
    PATH=%PATH%;$(TargetDir)\DLLS

    這樣就可以把 $(TargetDir)\DLLS 臨時新增到該工程所屬的系統 PATH 裡。

大家可以根據專案的實際情況,靈活選用以上方法。

1.1    小議c++檔案流中檔案路徑

    在論壇中閒逛時,經常發現有朋友除錯c/c++檔案流的程式碼時,遇到檔案路徑的問題。下來我結合自己的經驗,一起探討一下。

1.1.1   檔案路徑的基本概念

OS的檔案系統是一個樹狀結構,有目錄、檔案的概念

windows系統的例子:

E:\myprograme\BBG\include\bbg_stl>tree

E:.

│  bbg_stl_config.h

├─bbg_list

│      bbg_list.h

├─bbg_alloc

│      bbg_allocpool.h

│      bbg_alloc_adapter.h

│      bbg_construct.h

│      bbg_simple_alloc.h

│      bbg_allocator.h

│      bbg_uninitialized.h

├─bbg_common

│      bbg_export.h

│      bbg_common.h

├─bbg_iterator

│      bbg_iterator.h

├─bbg_vector

│      bbg_vector.h

├─bbg_type

│      bbg_type_traits.h

└─bbg_algorithm

        bbg_algorithm.h 

linux 系統的例子

[email protected]:~/myprograme$ find /home/yes/myprograme -type f

/home/yes/myprograme/main

/home/yes/myprograme/test.c

/home/yes/myprograme/tt-v4.7.zip

/home/yes/myprograme/main.cpp

/home/yes/myprograme/test

[email protected]:~/myprograme$

1.1.1.1         相對路徑

“.” 一個“點”代表是當前目錄所在的路徑。對應著windows示例中的路徑是:“E:\myprograme\BBG\include\bbg_stl

“..” 兩個“點”代表,相對於當前目錄的上一層目錄路徑。對應著windowss示例中的路徑是:“E:\myprograme\BBG\include” 

UNIX家族、LINUX系統上,“.”和“..”的含義和windows是一樣的。這兩個路徑稱為相對路徑。

當然類似 “..\ \BBG\include” 也是相對路徑

1.1.1.2           目錄分隔符的問題

從上面的兩個示例中,可以發現windows系統的目錄分隔符是“\”,而linux系統的目錄分隔符是“/”

1.1.1.3            絕對路徑

在windows系統中,以碟符開頭的路徑叫做絕對路徑,比如:

E:\myprograme\BBG\include

而在linux系統中,“/”開頭的路徑叫做絕對路徑,比如:

“/home/yes/myprograme/test

注意:“/”是UNIX家族、LINUX所有目錄的根目錄。

1.1.2   C++檔案流的應用

先以幾個例子開頭吧。

   //示例 1

    std::ofstream test_1("test_1.txt");

    test_1 << "hello world" << std::endl;

    test_1.close();   

    //示例 2

    std::ofstream test_2(".\\test_2.txt");

    test_2 << "hello world" << std::endl;

    test_2.close(); 

    //示例 3

    std::ofstream test_3("..\\test_3.txt");

    test_3 << "hello world" << std::endl;

    test_3.close(); 

    //示例 4

    std::ofstream test_4("d:\\test_4.txt");

    test_4 << "hello world" << std::endl;

    test_4.close(); 

說明:

1、上面示例1、示例2是一樣的,代表當前路徑下面的檔案test_1.txt 和test_2.txt。

2、示例3,是相對於當前路徑的上一層目錄下面的檔案test_3.txt。

3、示例4,是絕對路徑,就是d:盤下面的 test_4.txt。

4、在用VS除錯的時候,當前路徑就是 VS工程檔案所在的路徑。

5、如果是沒有在除錯狀態下執行,當前路徑就是“可執行檔案”(.exe)或者是“動態庫”(dll)所在的路徑。 

現在分別對示例程式碼進行說明一下,

例如我上面的示例程式碼儲存在下面檔案中:

D:\我的文件\Visual Studio 2005\Projects\Test\Test\test\test2.cpp 

我的工程檔案所在的路徑如下:

D:\我的文件\Visual Studio 2005\Projects\Test\Test\Test.vcproj 

那麼在用VS除錯的時候,

示例1和示例2中的 test_1.txt  和 test_2.txt

就在D:\我的文件\Visual Studio 2005\Projects\Test\Test目錄下面

示例3中的test_3.txt在D:\我的文件\Visual Studio 2005\Projects\Test\目錄下面。

示例4中的test_4.txt在D:根目錄下面 

如果我們不是VS除錯,直接執行可執行檔案,比如,我的可執行檔案的路徑是:

D:\我的文件\Visual Studio 2005\Projects\Test\debug\ Test.exe 

那麼,

示例1和示例2中的test_1.txt 和test_2.txt

就在D:\我的文件\Visual Studio 2005\Projects\Test\debug目錄下面

示例3中的test_3.txt在D:\我的文件\Visual Studio 2005\Projects\Test目錄下面。

示例4中的test_4.txt在D:根目錄下面  

Windows路徑分隔符的說明: 

在之前不是說過,windows的路徑分隔符用“\”嗎?但是上面的最後三個示例,怎麼都用“\\”呢?

那是因為在字串中,“\”是一個轉義字元表示,必須“\\”才能表示一個“\”字元。