VC++配置基礎

  關於相對目錄

相對目錄是相對某個文件而言的,例如在 VC 項目屬性配置附加包含目錄、附加庫目錄則是相對 *.dsp 、 *.vcproj 文件而言的;在某個 *.c 、 *.cpp 文件中使用 #include 包含命令,是相對這個 *.c *.cpp 文件而言的。

當前目錄是可見的,一般直接引用文件名(夾)

對於子文件夾可以添加“./” 

.. :父目錄

../include :父目錄下的 include 目錄

../.. :祖父目錄

http://www.cnblogs.com/include :祖父目錄下的 include 目錄


-----------------------------------------------------

 

C/C++附加包含目錄和VC++目錄包含目錄區別?
連接器常規附加庫目錄和VC++目錄庫目錄區別?
連接器-輸入-附加依賴項
附加依賴項 是指輸入項,如某個.LIB文件a.lib,添加到附加依賴項,你的LIB文件被真正包含進來了。等同於“#pragma comment(lib, "winsock.lib") ”語句
附加庫目錄 是你用 #pragma comment(lib,"a.lib")的時候;此時就搜索a.lib的路徑列表就包含這個路徑。
把它所在的目錄添加到附加庫目錄裏面 :僅僅包含目錄只是告訴IDE,搜索沒有指定路徑的庫文件時,也搜索這裏。

------------------------------------------------------------------------------------------------------------------------------------

VC配置基礎

 

一.預處理宏

1. 通用宏

VC6.0 中:

Project Setting à C/C++ à Preprocessor definitions

VC2005 

項目屬性 à 配置屬性 à C/C++ à 預處理器定義

 

WIN32 :指明是 Window 32 位系統的編譯器,一般用作平臺識別。

_MBCS/_UNICODE :指明該工程使用的字符集(多字節字符集 /UNICODE )。

在 VC6.0 的 “Project Setting à C/C++ à Project Options” 處將會有 /D "_MBCS" 或 /D "_UNICODE" 開關。

在 VC2005 的  項目屬性 à 配置屬性 à 常規 à 項目默認值 à 字符集  中選擇  使用多字節字符集  或  使用 Unicode 字符集  ;在  項目屬性 à 配置屬性 à C/C++ à 使用 UNICODE 響應文件  中選擇  是  或  否  。在  項目屬性 à 配置屬性 à C/C++ à 命令行 ” 處將會有 /D "_MBCS" 或 /D "_UNICODE" /D "UNICODE" 開關。

當項目中的文件具有 UNICODE 路徑(例如中文路徑)時,應在  項目屬性 à C/C++ à 常規  和  項目屬性 à 鏈接器 à 常規  中開啓  使用 UNICODE 響應文件  開關。

_CONSOLE/_WINDOWS :指明應用程序的類型(控制檯程序 /Windows 窗口應用程序)。

_DEBUG/NDEBUG :指明編譯版本( Debug/Release )。

除此之外, VC 不同的項目類型,有一些特定的宏,以在編譯器區分項目類型。

2. 特定宏

( 1 ) Win32 Static Library 項目

VC6.0 中:

Project Setting à C/C++ ( Category : General ) à Preprocessor definitions : _LIB

如果選擇了 MFC Support 則 _WINDOWS,_AFXDLL

VC2005 

項目屬性 à 常規 à 配置類型 à 靜態庫 (.lib)

項目屬性 à C/C++ à 預處理器 à 預處理器定義: _LIB

( 2 ) Win32 Dynamic-Link Library 項目

VC6.0 中:

Project Setting à C/C++ à Preprocessor definitions : _WINDOWS,_USRDLL,DLL_EXPORTS

VC2005 

項目屬性 à 常規 à 配置類型 à 動態庫 (.dll)

項目屬性 à C/C++ à 預處理器 à 預處理器定義: _WINDOWS;_USRDLL;DLL_EXPORTS

( 3 ) MFC DLL 項目

<1>Regular DLL with MFC statically linked (帶靜態鏈接 MFC 的規則 DLL 

VC6.0 中:

Project Setting à C/C++ à Preprocessor definitions : _WINDOWS,_WINDLL,_USRDLL

VC2005 

項目屬性 à C/C++ à 預處理器 à 預處理器定義: _WINDOWS;_USRDLL

<2>Regular DLL using shared MFC DLL (使用共享 MFC DLL 的規則 DLL 

VC6.0 中:

Project Setting à C/C++ à Preprocessor definitions : _WINDOWS,_WINDLL,_AFXDLL , _USRDLL

VC2005 

項目屬性 à C/C++ à 預處理器 à 預處理器定義: _WINDOWS;_USRDLL

<3>MFC Extension DLL ( using shared MFC DLL )( MFC 擴展 DLL 

VC6.0 中:

Project Setting à C/C++ à Preprocessor definitions : _WINDOWS,_WINDLL,_AFXDLL ,_USRDLL

VC2005 

項目屬性 à C/C++ à 預處理器 à 預處理器定義: _WINDOWS; _AFXEXT

在 DLL 項目中, _USRDLL 宏表示生成 Export Lib 

 

關於 VC 編譯器預處理宏,參考:

《 Predefined Macros ( VC6.0 ) 》

《 C/C++ Preprocessor Reference-Predefined Macros ( VC8.0 )》

《 What’s the difference between the WIN32 and _WIN32 defines in C++ 

 

二.工作目錄和控制檯程序運行參數

VC6.0 中:

“Project Setting à Debug à Working directory” 處填寫 exe 程序的工作目錄。

在 “Project Setting à Debug à Program argument” 處填寫 main 運行參數。

VC2005 

在  項目屬性 à 配置屬性 à 調試 à 工作目錄  處填寫 exe 程序的工作目錄。

在  項目屬性 à 配置屬性 à 調試 à 命令參數  處填寫 main 運行參數。

 

默認的工作目錄爲 ProjectDir ,即 *.dsw/*.vcproj 所在目錄。

通過編譯器啓動( Ctrl + F5 )應用程序時,可以將所依賴的 lib 和 dll 庫文件所在目錄設爲工作目錄。應用程序執行期間,創建、保存文件將在工作目錄中。

工作目錄是指當前目錄, GetCurrentDirectory() 得到的路徑; SetCurrentDirectory 來改變。

運行目錄是指 exe 所在路徑,可通過 GetModuleFileName() 得到。

VC包含目錄、附加依賴項、庫目錄及具體設置

包含目錄:#include <headerfile.h>中headerfile.h的搜索目錄。
如果有XXX.h找不到,設置這個目錄可以解決。

附加依賴項:C++的庫會把函數、類的聲明放在*.h中,實現放在*.cpp或*.cc中。編譯之後,*.cpp,*.cc,*.c會被打包成一個.lib文件,這樣可以保護源代碼。
所以,要使用一個庫,除了要include他的頭文件以外,還要在鏈接過程中把lib加進去。這個就是在附加鏈接庫中設置。
其實,一般的庫會用#pragma comment(lib,"xxx.lib") 來設置
這個過程出錯會出現link error,大概是“未定義的函數XXX”。

庫目錄:就是尋找.lib文件的目錄。
如果設置錯誤,會link error,提示"找不到XXX.lib"。

在VS工程中,添加c/c++工程中外部頭文件及庫的基本步驟:

    1、添加工程的頭文件目錄:工程---屬性---配置屬性---c/c++---常規---附加包含目錄:加上頭文件存放目錄。

    2、添加文件引用的lib靜態庫路徑:工程---屬性---配置屬性---鏈接器---常規---附加庫目錄:加上lib文件存放目錄。
         然後添加工程引用的lib文件名:工程---屬性---配置屬性---鏈接器---輸入---附加依賴項:加上lib文件名。

    3、添加工程引用的dll動態庫:把引用的dll放到工程的可執行文件所在的目錄下。


 

三.附加頭文件包含

VC6.0 中:

VC6.0 默認 include 包含路徑: Tools à Options à Directories à Include files 

對於特定項目的頭文件包含,在 “Project Setting à C/C++ ( Category : Preprocessor ) à Additional include directories” 處添加附加頭文件目錄,相對目錄參考 *.dsp 文件。

目錄路徑不需添加雙引號,路徑分隔符爲 ’/’ 或 ’/’ ,不必考慮反斜槓 ’/’ 的轉義。多個路徑之間以逗號 分隔。

相應的在 “Project Setting à C/C++ à Project Options” 中將會出現 “/I” 的包含命令。

VC2005 

VC2005 默認 include 包含路徑:工具 à 選項 à 項目和解決方案 à VC++ 目錄 à 包含文件。

對於特定項目的頭文件包含,在  項目屬性 à 配置屬性 à C/C++ à 常規 à 附加包含目錄  處添加附加包含目錄,相對目錄參考 *.vcproj 文件。

目錄路徑不需添加雙引號,路徑分隔符爲 ’/’ 或 ’/’ ,不必考慮反斜槓 ’/’ 的轉義。多個路徑之間以分號 分隔。

相應的在  項目屬性 à 配置屬性 à C/C++ à 命令行 ” 中將會出現 /I  的包含命令。

關於 #include 的兩種包含方式

#include    爲編譯器指定的包含路徑下的頭文件: 即在 VC6.0 中的 “Tools à Options à Directories à Include files” (對應 VC2005 的  工具 à 選項 à 項目和解決方案 àVC++ 目錄 à 包含文件  )處指定的包含目錄。默認情況下包括

( 1 ) $(VCInstallDir)include ( /Microsoft Visual Studio /VC98/INCLUDE 

( 2 ) $(VCInstallDir)atlmfc/include ( /Microsoft Visual Studio /VC98/ATL/INCLUDE 、 /Microsoft Visual Studio /VC98/MFC/INCLUDE 

( 3 ) $(VCInstallDir)PlatformSDK/include ( VC2005 )。

用戶也可以自己添加包含路徑到此。

對於 “Tools à Options à Directories à Include files” (  工具 à 選項 à 項目和解決方案 à VC++ 目錄 à 包含文件  )目錄下的文件的包含,一般可使用尖括號包含。系統對尖括號的包含優先到編譯器設置的包含路徑下定位,再到附加包含目錄下進行定位。

#include "MyHeader.h" 爲在 “Tools à Options à Directories à Include files” (  工具 à 選項 à 項目和解決方案 à VC++ 目錄 à 包含文件  )處人工添加的 包含路徑下的頭文件或者 附加包含目錄下的頭文件。

對於編譯器提供的標準庫函數頭文件( “Tools à Options à Directories à Include files” (  工具 à 選項 à 項目和解決方案 à VC++ 目錄 à 包含文件  )),一般使用尖括號進行包含聲明,當然使用雙引號包含也沒有錯。

對於在 “Tools à Options à Directories à Include files” (  工具 à 選項 à 項目和解決方案 à VC++ 目錄 à 包含文件  )處人工添加的 包含路徑和附加包含目錄下的頭文件的包含可以使用尖括號進行包含,但一般使用雙引號。

原則上,對於工程或文件可見的包含目錄下的頭文件包含,使用以上兩種包含方式中的任一種都不會出錯,主要是它們在搜索目錄時的順序不一樣。習慣上使用尖括號包含 標準庫函數頭文件,使用雙引號包含用戶自定義頭文件。建議除標準 SDK (如 DirectX 等),一般針對具體工程使用附加頭文件包含即可,儘量不要去動編譯器的 “Tools à Options à Directories à Include files” (對應 VC2005 的 工具 à 選項 à 項目和解決方案 à VC++ 目錄 à 包含文件  )作編譯器級全局配置。下面的鏈接庫包含處理同此。

External Dependencies 裏面顯示的是你的工程要用到的頭文件,不在你的工程裏面,而且也不在 VC 的默認包含路徑中。參考:《 VC6.0的 External Dependencies 》。

 

四.附加鏈接庫包含

VC6.0 中:

VC6.0 默認 lib 包含路徑: Tools à Options à Directories à Library files

對於特定項目的頭文件包含,可以通過以下兩步添加附加鏈接庫:

1. 在 “Project Setting à Link ( Category : Input ) à Additional library path” 處添加附加庫目錄,相對目錄參考 *.dsp 文件。

目錄路徑不需添加雙引號,路徑分隔符爲 ’/’ 或 ’/’ ,不必考慮反斜槓 ’/’ 的轉義。多個路徑之間以逗號 分隔。

相應的將會在 “Project Setting à Link à Project Options” 處同步 /libpath  庫包含命令。

2. 在 “Project Setting à Link ( Category : General ) à Object/Library Modules” 處添加庫文件名 YourLib.lib  也可在文件中使用 #pragma comment(lib, "YourLib.lib" )顯式 導入所依賴的靜態庫),多個庫之間以空格 分隔。

相應的將會在 “Project Setting à Link à Project Options” 處同步包含的庫名稱。

VC2005 

VC2005 默認 lib 包含路徑:工具 à 選項 à 項目和解決方案 à VC++ 目錄 à 庫文件

對於特定項目的庫文件包含,可以通過以下兩種方式添加附加庫目錄:

1.

( 1 )在  項目屬性 à 配置屬性 à 鏈接器 à 常規 à 附加庫目錄  處輸入附加庫目錄路徑,相對目錄參考 *.vcproj 文件。

目錄路徑不需添加雙引號,路徑分隔符爲 ’/’ 或 ’/’ ,不必考慮反斜槓 ’/’ 的轉義。多個路徑之間以分號 分隔。

相應的將會在  項目屬性 à 配置屬性 à 鏈接器 à 命令行  處同步 “/LIBPATH” 庫包含命令。

( 2 )在  項目屬性 à 配置屬性 à 鏈接器 à 輸入 à 附加依賴項 ” 處添加庫文件名 YourLib.lib  也可在文件中使用 #pragma comment(lib, "YourLib.lib") 顯式 導入所依賴的靜態庫),多個庫之間以空格 分隔。

相應的將會在  項目屬性 à 配置屬性 à 鏈接器 à 命令行  處同步包含的庫名稱。

2.

在  項目屬性 à 配置屬性 à 鏈接器 à 命令行 ” 處添加庫文件名 YourLib.lib  必要時添加相對目錄,保證 YourLib 的可見性)。

 

五.生成文件目錄設置

VC6.0 中:

在 “Project Setting à General à Output directories” 的 “Output files” 處填寫 *.exe 或 *.lib/*.dll 的生成目錄,相應在 “Project Setting à Link (或 Library ) à Output file name” 處將會同步文件輸出路徑。相對目錄參考 *.dsp 文件。

在 “Project Setting à General à Output directories” 的 “Intermediate files” 處填寫中間文件生成目錄。相對目錄參考 *.dsp 文件。

VC2005 

在  項目屬性 à 常規 à 輸出目錄  處填寫輸出目錄,在  項目屬性 à 常規 à 中間目錄  處填寫中間目錄,相對目錄參考 *.vcproj 文件。

在  項目屬性 à 鏈接器(或管理員) à 常規 à 輸出文件  處填寫輸出文件路徑。

輸出目錄( OutDir )一般爲 $(SolutionDir)$(ConfigurationName)

輸出文件( OutputFile )一般爲 $(OutDir)/$(ProjectName).exe ( *.lib , *.dll 

說明 

$(SolutionDir) 爲 *.sln 文件所在文件夾,尾帶 ‘/’ 

$(ProjectDir) 爲 *.vcproj 文件所在文件夾,尾帶 ‘/’ 

$(ConfigurationName) 爲 *.sln 的 *.vcproj 文件所在文件夾下的 debug 、 release 文件夾,參考 *.vcproj 文件中的  配置項。

具體在  項目屬性 à 配置屬性 à 調試 à 命令  下拉點擊  編輯  ,展開  宏 (M )>>” ,可以看到很多項目內置宏。

一般的配置爲:

輸出目錄 ( OutDir ): $(ProjectDir)$(PlatformName)/$(ConfigurationName)

中間目錄 ( IntDir ): $(OutDir)/Intermediate

輸出文件 : $(OutDir)/$(ProjectName).lib(dll 、 exe)

 

六.關於相對目錄

相對目錄是相對某個文件而言的,例如在 VC 項目屬性配置附加包含目錄、附加庫目錄則是相對 *.dsp 、 *.vcproj 文件而言的;在某個 *.c 、 *.cpp 文件中使用 #include 包含命令,是相對這個 *.c *.cpp 文件而言的。

當前目錄是可見的,一般直接引用文件名(夾),對於子文件夾可以添加 ”./” 

.. :父目錄

../include :父目錄下的 include 目錄

../.. :祖父目錄

http://www.cnblogs.com/include :祖父目錄下的 include 目錄

 

七.依賴項目聯編

一個解決方案 (dsw 、 sln) 可以創建很多輔助子項目 (dsp 、 vcproj) ,如何設置使在編譯主項目的時,先編譯所依賴的輔助項目呢?

一般會配置輔助子項目的 OutDir 和主項目相同,這樣生成的 lib 或 dll 對於主項目 exe 直接可見。

VC6.0 中:

選擇菜單 “Project à Dependencies” 可以選擇需要聯編的項目。

VC2005 

在解決方案資源管理器中右擊項目名稱,選擇  引用  或  項目依賴項  菜單,可選擇項目依賴項,並可以設置依賴順序。

 

八.附加DLL 調試

VC6.0 中:

如果你需要調試的 DLL 是動態裝入( LoadLibrary )的,則需要在 “Project Setting à Debug ( Category : Additional DLLs )  處添加這個 DLL 文件。

 

九.導出makefile

VC6.0 中選擇菜單 “Project à Export Makefile” 即可導出 Makefile 文件 *.mak 

VC6 以後不再支持 makefile 輸出了。

參考:《 VC的 MAKE文件的語法 》,《 vs6 IDE導出的 makefile使用方法 》,《 教你在 VS2005下寫 MakeFile 

 

十.代碼的編輯與閱讀導航

Visual Studio 本身就帶有充分的代碼組織、編輯、分析以及閱讀能力的支持。

VC6.0 和 VC2005 中的 “Edit à Find in Files” 支持指定項目、工程或文件內的關鍵字搜索。

VC6.0 的 “Tools à Source Browser” ,提供對 “Definitions and References” 、 “File Outline” 、 “Base Classes and Members” 、 “Derived Classes and Members” 、 “Call Graph” 、 “Callers Graph” 等導航功能支持。

VC2005 右鍵快捷菜單中支持  查找所有引用  ;右鍵快捷菜單中的  調用瀏覽器  支持函數調用關係圖和被調用關係圖的查看。  類視圖設置  中支持顯示  基類型  、  派生類型  、  繼承成員  等功能。

此外,在閱讀代碼時,我們可以使用書籤( Bookmark )來設置錨點,這樣就可以實現基於書籤的自定義索引導航。

下面介紹常用的編程輔助插件軟件及源代碼層次結構分析工具軟件。

1. Visual Assist X 是一款非常好的 Microsoft Visual Studio 輔助插件,支持 C/C ++, C #, ASP  Visual Basic  Java  HTML 等語言,能自動識別各種關鍵字、系統函數、成員變量、自動給出輸入提示、自動更正大小寫錯誤、自動標示錯誤等,有助於提高開發過程的自動化和開發效率。

2 . Windows 下的 Source Insight 是一個面向項目開發的程序編輯器和代碼導航瀏覽器, 它還能顯示 reference trees , class inheritancediagrams 和 call trees 。相應的 Linux 下閱讀源代碼的利器 Source Navigator 能很好地解決文件定位和跳轉問題。

3 . Rational Rose 是利用 UML (統一建模語言)進行分析和設計面向對象軟件系統的強大的可視化工具,可以進行項目需求分析、結構規劃和生成框架代碼,還可以支持從現有系統逆向轉出工程代碼,生成 Rose 模型的功能。

逆向工程( Reverse Engineer )就是從現有系統的代碼來生成模型的功能。通過 Rational Rose 分析已有的代碼,可瞭解代碼結構和數據結構,生成類層次關係圖、數據模型圖和組件圖。

 

十一. VC6 常用快捷鍵

 

Alt+F7 : Project Settings

 

Ctrl+J/K :尋找上一個 / 下一個預編譯條件

Ctrl+Shift+J/K :尋找上一個 / 下一個預編譯條件並將這一塊選定

 

Ctrl+Tab :當前打開文檔和上一次打開文檔切換。

Alt+O :頭文件與 cpp 文件的交互顯示

 

F12 : Goto definition

Shift+F12 : Goto reference

 

Ctrl+Home : 文檔頭

Ctrl+Shift+Home : 選定從當前位置到文檔頭

Ctrl+End : 文檔尾

Ctrl+Shift+End : 選定從當前位置到文檔尾

Alt+F8 :自動格式重排

Ctrl+F4 :關閉當前文檔

 

Ctrl+Z/Alt+Backspace : Undo

Ctrl+Shift+Z/Ctrl+Y : Redo

 

Ctrl+B/Alt+F9 : 編輯斷點

Ctrl+Shift+F9 : 去掉所有斷點

 

Ctrl+D : 定位工具條查找輸入欄

Alt+F3/Ctrl+F :當前文檔 查找

Ctrl+F3 : 查找下一個

Ctrl+Shift+F3 : 查找上一個

Ctrl+H :替換

Ctrl+] :括號匹配

 

Ctrl+  : 向上滾屏

Ctrl+  : 向下滾屏

Ctrl+  : 移到前一個單詞

Ctrl+  : 移到後一個單詞

Ctrl+Shift+  : 選定當前位置到前一個單詞

Ctrl+Shift+  : 選定當前位置到後一個單詞

 

Ctrl+Backspace : 刪除當前單詞的前半截(以光標爲分割)

Ctrl+Del : 刪除當前單詞的後半截(以光標爲分割)

Ctrl+L :剪切當前行

Ctrl+Shift+L :刪除當前 行

 

F2 :上一個書籤

Shift+F2 :上一個書籤

Alt+F2 :編輯書籤

Ctrl + F2 :添加 / 刪除一個書籤

Ctrl+Shift+F2 : 清除所有書籤

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章