C 基礎教程物件導向(學習筆記(108))

2021-09-02 23:29:44 字數 2179 閱讀 8101

乙個庫是乙個**包,是為了被很多程式重複使用。通常,c ++庫分為兩部分:

1)標頭檔案,用於定義庫向使用它的程式公開(提供)的功能。

2)預編譯的二進位制檔案,包含預編譯為機器語言的該功能的實現。

一些庫可以分成多個檔案和/或具有多個標頭檔案。

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

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

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

乙個動態庫(也稱為共享庫)由被載入到您在執行時應用程式的。編譯使用動態庫的程式時,庫不會成為可執行檔案的一部分,它仍然是乙個單獨的單元。在windows上,動態庫通常具有.dll(動態鏈結庫)副檔名,而在linux上,動態庫通常具有.so(共享物件)副檔名。動態庫的乙個優點是許多程式可以共享乙個副本,從而節省空間。也許更大的優勢是動態庫可以公升級到更新的版本,而無需替換使用它的所有可執行檔案。

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

乙個導入庫是自動載入和利用動態庫的過程庫。在windows上,這通常通過與動態庫(.dll)同名的小型靜態庫(.lib)完成。靜態庫在編譯時鏈結到程式中,然後可以有效地使用動態庫的功能,就像它是靜態庫一樣。在linux上,共享物件(.so)檔案兼作動態庫和導入庫。大多數鏈結器可以在建立動態庫時為動態庫構建導入庫。

安裝和使用庫

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

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執行相同的操作。

C 基礎教程物件導向(學習筆記5(2))

在編寫具有多個建構函式的類 大多數建構函式 時,必須為每個建構函式中的所有成員指定預設值會導致冗餘 如果更新成員的預設值,則需要觸控每個建構函式。從c 11開始,可以直接為普通類成員變數 不使用static關鍵字的變數 提供預設初始化值 class rectangle void print int ...

C 基礎教程物件導向(學習筆記(23))

過載一元運算子 與您目前看到的運算子不同,正 負 和邏輯非 運算子都是一元運算子,這意味著它們只能在乙個運算元上執行。因為它們僅對它們所應用的物件進行操作,所以通常將一元運算子過載實現為成員函式。所有三個運算元都以相同的方式實現。讓我們看一下我們如何在前面的例子中使用的cents類上實現operat...

C 基礎教程物件導向(學習筆記(24))

過載比較運算子相對簡單,因為它們遵循我們在過載其他運算子時看到的相同模式。因為比較運算子都是不修改左運算元的二元運算子,所以我們將使過載的比較運算子宣告為友元函式。這是乙個帶有過載運算子 和operator!的car類的示例。include include class car friend bool...