DLL工程,Debug版本下輸出文件由basetool.dll basetool.lib 改為basetoolD.dll basetoold.lib 需設置:
1、配置屬性-常規-目標文件名 $(ProjectName) 加d
2、配置屬性-連接器-常規-輸出問件 由 加d
3、配置屬性-連接器-高級-導入庫,設置文件名$(OutDir)$ProjectName)d.lib
4、如果有導出文件,.def文件中也一定要修改導出庫的名字
LIBRARY "BaseTool"
變為
LIBRARY "BaseToold"
關於相對目錄
相對目錄是相對某個文件而言的,例如在 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() 得到。
三.附加頭文件包含
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 <std*.h> 為編譯器指定的包含路徑下的頭文件: 即在 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 文件中的 <Configurations> 配置項。
具體在 “ 項目屬性 à 配置屬性 à 調試 à 命令 ” 下拉點擊 “ 編輯 ” ,展開 “ 宏 (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 : 清除所有書簽
參考:
《 VC的環境設置 》
《 VC6.0工程設置介紹 》