MFC的秘密 它的靜態庫和動態庫所在何處

2021-06-19 09:05:24 字數 2240 閱讀 2524

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...