1.dependency walker的第一道揭秘
在mfc中我們寫過很多靜態庫和動態庫。這些dll都依賴於mfc;然後我們又交給別人使用,使得它們被依賴。
細想一下,就可能會發現其中的不平衡。我們生成的非元件dll,要交給別人使用,必須提供h頭、lib庫和dll庫檔案;可是我們使用mfc的dll時,好像什麼也沒有設定,mfc不請自來的加入到我們的程式中。雖然知道這個世界,每個人其實並不是平等的;但是在計算機的世界,自由平等卻是第一法則。搞清mfc如何嵌入到我們的應用程式中,將一切黑暗中的操作暴露出來,將是我們的任務。
舉個例子,隨便用嚮導生成乙個mfc 的對話方塊程式。裡面測試乙個元件,然後呼叫wcslen求乙個bstr的長度。就是乙個很簡單的exe;通過dependency walker就發現它依賴了很多dll。如下:
其中,這些函式何去何來,這個就是我們要弄清楚的秘密。
2.mfc的組成
直接揭開謎底:mfc由四部分組成。可能這種說法不準確,應該說,vc的核心底層api由下面部分組成:
如下表:
其實看看vc的目錄組織結構大概也知道其分組。
?mfc 靜態庫和動態庫
最流行的是使用mfc作為dll,同時將自身的也作為dll。在這種情況下,如果深挖進去,最容易發現的是mfc的dll。
主要包含的屬性為:功能模組(core | ole | db | net),版本(vc6對應42,vs2003對應70,vs2005對應80,vs2008對應90),是unicode還是ansi,是release還是debug。
稍微注意的是:debug版本下每個功能模組對應乙個lib;但是release版本下,合起來為乙個統一的lib檔案mfc42.lib。
其中包含unicode和非unicode,debug和release區分。
?crt 靜態庫和動態庫
參照msdn中的「info: what are the c/c++ libraries my program would link with?」。
當我們呼叫sprintf,wcslen等此類函式時,我們就依賴了該庫。
這個可以通過編譯設定:
實際上對應的編譯項是:/md /ml /mt
3.靜態庫和動態庫
?核心
真正所謂取之與民,用之於民。
其中還經常出現的乙個問題是,引用的系統底層庫有哪些,到底是靜態庫還是動態庫。通常,對於mfc程式,一定會依賴於mfc庫;可以選擇性的依賴crt庫。搞清楚使用的靜態庫和動態庫,不要衝突就行。
?幾種靜態庫和動態庫
在vc6中,對於靜態動態庫,去除元件作為一種特殊的動態庫外,還剩下5種型別。一一生成乙個演示程式,研究設定,大概就可以看出區別。
靜態庫匯出的是 h標頭檔案和lib檔案。該lib檔案包含著程式**,會比較大。源**編譯的時候使用標頭檔案,鏈結的時候使用lib檔案。
動態庫匯出的是 h標頭檔案、lib和dll檔案。該lib檔案只包含著程式的函式索引位置,比較小。源**編譯時使用標頭檔案,鏈結時使用lib檔案,執行時需要dll檔案。
這是mfc dll
以下是對各dll分析:
其實,本質上可以看出,只有兩種庫:靜態庫和動態庫;標明自身是靜態庫還是動態庫。
靜態庫由於生來是被別人使用的,所以也就不存在匯入匯出標識;
而動態庫一定要存在匯入匯出標識。對於dll,存在mfc dll和普通的win dll。其實所謂的mfc dll只不過是將dllmain進行特殊封裝,特別是為了方便資源的訪問。而所謂的extension dll,只不過是為了相容c;要求只匯出非mfc類的函式而已。
這些靜態庫如何使用mfc 庫,如何使用crt庫,其實都是可以設定的。這點用來解決引用庫是什麼庫。
對於靜態庫和動態庫,mfc嚮導生成時,會自動弄出一些編譯設定項。但是最根本的核心還是dsp中的:
# targtype "win32 (x86) static library" 0x0104
!message "teststaticlib - win32 release" (based on "win32 (x86) static library")
!message "teststaticlib - win32 debug" (based on "win32 (x86) static library")
如果要將乙個靜態庫編譯成另乙個動態庫,或者相反;只需要在dsp中統一查詢替換為另一種格式即可。當然,更加鼓勵的是生成多個編譯配置項。
?避免衝突的方法
4.如何最大化最合理利用各功能庫
原則,盡量少的依賴庫。對於同功能的函式,可能crt有,win api庫,mfc庫,選擇性的找到正確的庫。
庫(靜態庫和動態庫)
一 靜態庫 以c語言的形式生成庫 h中extern c int add int int extern c int sub int int 二.測試靜態庫 將.h和.lib放入 h ifdef cplusplus c 程式設計師用c的方式開啟 extern c int add int int exte...
靜態庫和動態庫
一。靜態庫 靜態庫的優點在於使用簡單,編譯快速。靜態庫在應用程式生成時,已經編譯成為可重定位的目標檔案,因此可以不必再編譯,節省編譯時間,以最短的時間生成可執行程式。步奏 a。建立靜態庫 1 在編輯器中編輯其靜態庫函式 static lib.c 2 在shell中編譯該原始檔,生成乙個可重定位的目標...
靜態庫和動態庫
靜態庫 lib 中相當於存放了所有的源 包括他引入的其他靜態lib檔案.其實是所有cpp編譯後對應的.obj檔案的打包 所以靜態lib都比較大。動態庫dll也有lib但是這個lib,只是用來幫助程式在鏈結時定位dll中的函式的位址的。所以會在exe載入時才重定位函式的位址。重定位就是根據鏈結的這個l...