深入分析Windows和Linux動態庫應用異同

2021-10-01 06:45:23 字數 2006 閱讀 9066

今天blog不好用了. 借用寶地一下.

*深入分析windows和linux動態庫應用異同* 

** 摘要:動態鏈結庫技術實現和設計程式常用的技術,在windows和linux系統中都有動態庫的概念,採用動態庫可以有效的減少程式大小,節省空間,提高效率 

,增加程式的可擴充套件性,便於模組化管理。 

但不同作業系統的動態庫由於格式 不同,在需要不同作業系統呼叫時需要進行動態庫程式移植。本文分析和比較了兩種作業系統動態庫技術,並給出了將visual 

c++編制的動態庫移植到linux上的方法和經驗。 

1、引言 

動態庫(dynamic link library 

abbr,dll)技術是程式設計中經常採用的技術。其目的減少程式的大小,節省空間,提高效率,具有很高的靈活性。 

採用動態庫技術對於公升級軟體版本更加容易。與靜態庫(static link 

library)不同,動態庫裡面的函式不是執行程式本身的一部分,而是根據執行需要按需載入,其執行**可以同時在多個程式中共享。 

在windows和linux作業系統中,都可採用這種方式進行軟體設計,但他們的呼叫方式以及程式編制方式不盡相同。本文首先分析了在這兩種作業系統中通常採用的動態庫呼叫方法以及程式編制方式,然後分析比較了這兩種方式的不同之處,最後根據實際移植程式經驗,介紹了將vc++編制的windows動態庫移植到linux下的方法。 

2、動態庫技術 

2.1 windows動態庫技術 

動態鏈結庫是實現windows應用程式共享資源、節省記憶體空間、提高使用效率的乙個重要技術手段。常見的動態庫包含外部函式和資源,也有一些動態庫只包含資源,如windows字型資源檔案,稱之為資源動態鏈結庫。 

通常動態庫以.dll,.drv、.fon等作為字尾。 

相應的windows靜態庫通常以.lib結尾,windows自己就將一些主要的系統功能以動態庫模組的形式實現。 

windows動態庫在執行時被系統載入到程序的虛擬空間中,使用從呼叫程序的虛擬位址空間分配的記憶體,成為呼叫程序的一部分。dll也只能被該程序的執行緒所訪問。dll的控制代碼可以被呼叫程序使用;呼叫程序的控制代碼可以被dll使用。 

dll模組中包含各種匯出函式,用於向外界提供服務。dll可以有自己的資料段,但沒有自己的堆疊,使用與呼叫它的應用程式相同的堆疊模式;乙個dll在記憶體中只有乙個例項;dll實現了**封裝性;dll的編制與具體的程式語言及編譯器無關,可以通過dll來實現混合語言程式設計。dll函式中的**所建立的任何物件(包括變數)都歸呼叫它的執行緒或程序所有。 

根據呼叫方式的不同,對動態庫的呼叫可分為靜態呼叫方式和動態呼叫方式。 

(1)靜態呼叫,也稱為隱式呼叫,由編譯系統完成對dll的載入和應用程式結束時dll解除安裝的編碼(windows系統負責對dll呼叫次數的計數),呼叫方式簡單,能夠滿足通常的要求。 

通常採用的呼叫方式是把產生動態連線庫時產生的.lib檔案加入到應用程式的工程中,想使用dll中的函式時,只須在原始檔中宣告一下。 

lib檔案包含了每乙個dll匯出函式的符號名和可選擇的標識號以及dll檔名,不含有實際的**。lib檔案包含的資訊進入到生成的應用程式中,被呼叫的dll檔案會在應用程式載入時同時載入在到記憶體中。 

(2)動態呼叫,即顯式呼叫方式,是由程式設計者用api函式載入和解除安裝dll來達到呼叫dll的目的,比較複雜,但能更加有效地使用記憶體,是編制大型應用程式時的重要方式。在windows系統中,與動態庫呼叫有關的函式包括: 

①loadlibrary(或mfc 的afxloadlibrary),裝載動態庫。 

②getprocaddress,獲取要引入的函式,將符號名或標識號轉換為dll內部位址。 

③freelibrary(或mfc的afxfreelibrary),釋放動態鏈結庫。 

在windows中建立動態庫也非常方便和簡單。在visual 

c++中,可以建立不用mfc而直接用c語言寫的dll程式,也可以建立基於mfc類庫的dll程式。每乙個dll必須有乙個入口點,在vc++中,dllmain是乙個預設的入口函式。dllmain負責初始化(initialization)和結束(termination)工作。 

IsPostBack深入分析

1 ispostback 介紹 ispostback是 page類有乙個 bool型別的屬性,用來判斷針對當前 form的請求是第一次還是非第一次請求。當 ispostback true時表示非第一次請求,我們稱為 postback,當 ispostback false時表示第一次請求。在 asp....

深入分析ConcurrentHashMap

再多執行緒的情況下,如果使用hashmap,就會導致死迴圈,導致cpu利用率接近100 所以如果是併發的情況不要使用hashmap 導致死迴圈主要是這段 當在多執行緒的情況由於沒有同步導致,著段 在擴容的時候會執行 do while e null 執行緒安全的hashtable 容器 hashtab...

深入分析malloc

本文大量參考了如何實現乙個malloc這篇文章。任何乙個用過或學過c的人對malloc都不會陌生。大家都知道malloc可以分配一段連續的記憶體空間,並且在不再使用時可以通過free釋放掉。但是,許多程式設計師對malloc背後的事情並不熟悉,許多人甚至把malloc當做作業系統所提供的系統呼叫或c...