C++基礎教程面向對象(學習筆記(108))

靜態和動態庫

一個庫是一個代碼包,是爲了被很多程序重複使用。通常,C ++庫分爲兩部分:

1)頭文件,用於定義庫向使用它的程序公開(提供)的功能。
2)預編譯的二進制文件,包含預編譯爲機器語言的該功能的實現。

一些庫可以分成多個文件和/或具有多個頭文件。

由於幾個原因,庫被預編譯。首先,由於庫很少更改,因此不需要經常重新編譯。每次編寫使用它們的程序時重新編譯庫都是浪費時間。其次,因爲預編譯對象是機器語言,所以它阻止人們訪問或更改源代碼,這對於不希望出於知識產權原因而使其源代碼可用的企業或人員而言非常重要。

有兩種類型的庫:靜態庫和動態庫。

一個靜態庫(也稱爲存檔)由直接編譯並鏈接到程序中的例程組成。編譯使用靜態庫的程序時,程序使用的靜態庫的所有功能都將成爲可執行文件的一部分。在Windows上,靜態庫通常具有.lib擴展名,而在Linux上,靜態庫通常具有.a(存檔)擴展名。靜態庫的一個優點是您只需分發可執行文件,以便用戶運行您的程序。因爲庫成爲程序的一部分,所以這可以確保庫的正確版本始終與您的程序一起使用。此外,因爲靜態庫成爲程序的一部分,所以您可以像爲自己的程序編寫的函數一樣使用它們。在不利方面,因爲庫的副本成爲使用它的每個可執行文件的一部分,這可能會導致大量浪費的空間。靜態庫也無法輕鬆升級、更新庫,需要更換整個可執行文件。

一個動態庫(也稱爲共享庫)由被加載到您在運行時應用程序的。編譯使用動態庫的程序時,庫不會成爲可執行文件的一部分,它仍然是一個單獨的單元。在Windows上,動態庫通常具有.dll(動態鏈接庫)擴展名,而在Linux上,動態庫通常具有.so(共享對象)擴展名。動態庫的一個優點是許多程序可以共享一個副本,從而節省空間。也許更大的優勢是動態庫可以升級到更新的版本,而無需替換使用它的所有可執行文件。

由於動態庫未鏈接到您的程序中,因此使用動態庫的程序必須顯式加載動態庫並與其交互。這種機制可能令人困惑,並且使得與動態庫的接口變得笨拙。爲了使動態庫更易於使用,可以使用導入庫。

一個導入庫是自動加載和利用動態庫的過程庫。在Windows上,這通常通過與動態庫(.dll)同名的小型靜態庫(.lib)完成。靜態庫在編譯時鏈接到程序中,然後可以有效地使用動態庫的功能,就像它是靜態庫一樣。在Linux上,共享對象(.so)文件兼作動態庫和導入庫。大多數鏈接器可以在創建動態庫時爲動態庫構建導入庫。

安裝和使用庫

現在你已經瞭解了不同類型的庫,讓我們來談談如何在程序中實際使用庫。使用C ++安裝庫通常涉及4個步驟:

1)獲取library。最好的選擇是爲您的操作系統下載預編譯的軟件包(如果存在),這樣您就不必自己編譯庫。如果沒有爲您的操作系統提供,則必須下載僅源代碼的軟件包並自行編譯(這超出了本課程的範圍)。在Windows上,庫通常以.zip文件的形式分發。在Linux上,庫通常作爲包(例如.RPM)分發。您的包管理器可能已經列出了一些更流行的庫(例如SDL)以便於安裝,因此請先檢查一下。

2)安裝庫。在Linux上,這通常涉及調用包管理器並讓它完成所有工作。在Windows上,這通常涉及將庫解壓縮到您選擇的目錄。我們建議您將所有庫保存在一個位置以便於訪問。例如,使用名爲C:\ Libs的目錄,並將每個庫放在它自己的子目錄中。

3)確保編譯器知道在哪裏查找庫的頭文件。在Windows上,通常這是您安裝庫文件的目錄的include子目錄(例如,如果您將庫安裝到C:\ libs \ SDL-1.2.11,則頭文件可能位於C:\ libs \ SDL中) -1.2.11 \包括)。在Linux上,庫通常安裝在/ usr / include中,它應該已經成爲包含文件搜索路徑的一部分。但是,如果文件安裝在別處,則必須告訴編譯器在哪裏找到它們。

4)告訴鏈接器在哪裏查找庫文件。與步驟3一樣,這通常涉及將目錄添加到鏈接器查找庫的位置列表中。在Windows上,這通常是您安裝庫文件的目錄的/ lib子目錄。在Linux上,庫通常安裝在/ usr / lib中,它應該已經是庫搜索路徑的一部分。

安裝庫並且IDE知道在哪裏查找它之後,通常需要爲每個想要使用該庫的項目執行以下3個步驟:

5)如果使用靜態庫或導入庫,請告訴鏈接器鏈接哪些庫文件。

6)#include程序中庫的頭文件。這告訴編譯器庫提供的​​所有功能,以便您的程序能夠正確編譯。

7)如果使用動態庫,請確保程序知道在哪裏找到它們。在Linux下,庫通常安裝在/ usr / lib中,它位於默認搜索路徑中。在Windows上,默認搜索路徑包括運行程序的目錄,通過調用SetDllDirectory()設置的目錄,Windows,System和System32目錄以及PATH環境變量中的目錄。使用.dll的最簡單方法是將.dll複製到可執行文件的位置。由於您通常會將.dll與您的可執行文件一起分發,因此將它們保持在一起是有意義的。

步驟3-5涉及配置IDE, 幸運的是,在執行這些操作時,幾乎所有IDE的工作方式都相同。不幸的是,因爲每個IDE都有不同的接口,這個過程中最困難的部分是簡單地定位在哪裏的適當位置,以執行這些步驟。您應該有足夠的信心,來通過一點點搜索對您自己的IDE執行相同的操作。

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