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 的目錄。 |
$(VCInstallDir) |
安裝 Visual C++ 2010 的目錄。 |
$(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++ 版本一起安裝。 |
出處:http://msdn.microsoft.com/zh-cn/library/c02as0cs.aspx
Visual Studio 2010
>>Visual Studio
>>Visual Studio 語言
>>Visual C++
>>Building a C/C++ Program
>>在 Visual Studio 中生成 C++ 項目
>>用於生成命令和屬性的宏
Visual Studio 2008 產生的臨時文件
http://www.cnblogs.com/owen-zhang/archive/2010/01/07/VisualStudioTemporaryFilesFolder.html
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 環境變量介紹
http://hi.baidu.com/renol/blog/item/2b788458cc87cb8d810a185b.html
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 環境變量的配置
在調試 Visual Studio 2008 程序時,經常有一些動態鏈接庫(即 dll 文件)需要加載到工程里,這樣才能依賴第三方庫進行程序調試。
這些動態鏈接庫,往往都是測試版本或是開發中的版本,或者會有若干個版本;這個時候,如果直接把 dll 所在目錄加到 PATH 里,則會有潛在沖突的危險;如果直接拷貝到 Visual Studio 的目錄下,假如測試工程太多,每次有新版本的動態鏈接庫更新時,你需要更新若干次,拷貝、粘貼苦不堪言。
在開發過程中,究竟怎樣來讓 Visual Studio 鏈接這些 lib 及 dll 文件會比較好呢?
總體上來說,有幾種方法可以改變 Visual Studio 的環境變量設置:
- 直接添加到系統的 PATH 變量里:
這個方法最簡單,也最直接,但是壞處是會影響全局的 PATH 設置,尤其是你包含着大量測試用的 dll 時。
- 在 Visual Studio 全局設置里,把 dll 所在目錄添加到 PATH 里:
通過 Visual Studio 菜單 ==> 工具 ==> 選項 ==> 項目和解決方案 ==> VC++目錄,在下拉框里選擇"可執行文件",然后把 dll 所在路徑添加進去。
- 直接把所有 dll 拷貝到 Visual Studio 工程目錄下,或是拷貝到生成可執行文件的文件夾(默認情況下是 Debug 或 Release 目錄)下:
這個方法也很簡單,但是當你有若干個工程時,你每次更新 SDK 及其 dll 文件,你就要把所有的工程都更新,這個不符合文件唯一性的工程性准則。
- 在調試程序時,讓 Visual Studio 幫你切換當前工作目錄到 dll 相應的目錄下:
在 Visual Studio ==> Project ==> Properties ==> Select Configuration ==> Configuration Properties ==> Debugging ==> Working directory 里填上 dll 所在目錄,這樣當在調試程序時,Visual Studio 會把當前工作目錄切換到這個目錄下,從而會自動讀取本目錄下的 dll 文件。
這個方法的優點很明顯,簡單!副作用也很明顯,在你切換了當前工作目錄后,你可能會找不到程序的配置文件,在程序里寫的諸如"./config.ini"全部都找不到了;另外,你要把所有的 dll 都放到這個工作目錄里,否則一樣會提示說找不到 xxx.dll 的問題。
- 最后一個方法,也是我認為最好的一個方法,在 Visual Studio 工程屬性里把一個目錄臨時添加到 PATH 環境變量里:
MSDN 上也有類似的介紹:How to: Set Environment Variables for Projects,方法很簡單,在 "工程屬性" ==> "調試" ==> "環境"里,添加類似如下所示的內容:
PATH=%PATH%;$(TargetDir)\DLLS
這樣就可以把 $(TargetDir)\DLLS 臨時添加到該工程所屬的系統 PATH 里。
大家可以根據項目的實際情況,靈活選用以上方法。
注:本文撰寫時參考了 StackOverflow 上的討論話題:How do I set a path in visual studio?
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 系統的例子
yes@yes-desktop:~/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
yes@yes-desktop:~/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的路徑分隔符用“\”嗎?但是上面的最后三個示例,怎么都用“\\”呢?
那是因為在字符串中,“\”是一個轉義字符表示,必須“\\”才能表示一個“\”字符。