第四部分 將可重用的部分做成靜態庫

2022-03-24 13:46:44 字數 2357 閱讀 8355

如果build成功,run起來以後,可以看到如下的執行結果:

這個例子實際上和上一部分中的例子效果是一樣的。不同的是,本例中使用了靜態庫的方式來完成,這樣更可以看出程式在擴充套件意義上的實踐。那麼如何建立乙個靜態庫(static library)?又如何在另乙個專案中引用這個庫?下面兩個小節就是分別回答這兩個問題的。

4.2 靜態庫專案的建立

靜態庫專案的建立在cdt中是非常方便的。用新建嚮導中的 new

-> c++ project -> static library -> empty

project即可建立成功。然後可以在該專案中進行**的編寫。如果編譯成功,可以看到專案結構如下所示:

注意那個archives裡面生成的乙個***.a檔案,這就是**編譯生成的靜態庫

4.3 靜態庫專案的呼叫

下面就來新建乙個普通c++專案,來引用並呼叫上一小節庫中的**。新建的過程也很簡單,就用新建嚮導中的new -> c++ project -> executable -> empty project即可。

建完以後,來新增對4.2中所建立的靜態庫的引用。

1:標頭檔案

因為我們要對靜態庫中的類進行呼叫並擴充套件,所以一般需要引用靜態庫專案中的乙個對外公布的標頭檔案(如本例中的inshionlib.h)。

具體做法如上圖所示,在/c/c++ build -> settings 中的gcc c++ compiler的directories中把需要引用的靜態庫的include paths新增進來。這樣做的目的是為了讓inshion_exa002_caller專案(下簡稱caller專案)中的#include "inshionlib.h"能正確通過

2:引用庫和引數配置

當然,只引入標頭檔案是遠遠不夠的。以caller專案為例,如果只是新增了頭檔案目錄,然後就編譯那幾個原始碼的話,一般會出現如下的錯誤:

undefined reference to `winmain@16'

undefined reference to `textouta@20'

undefined reference to `setbkcolor@8'

等等等等……

所以我們還需要把lib專案生成的庫引進來,同時設定windowsapi呼叫需要新增的配置引數。具體作法如下圖所示:

具體地說就是在mingw c++ linker的miscellaneous中的other objects下,新增前文提到的靜態庫編譯生成的***.a庫檔案

然後設定-lmingw32和-mwindows引數,分別參照以下兩圖進行:

順便提一下,其實-mwindows這個引數我們已經不陌生了,第三部分中就用過它,這裡的使用與之是完全一樣的。具體可參見本系列文章的第三部分。

這樣設定完成以後,就可以再build該caller專案了,應該就可以通過:d。

4.3 其它可能遇到的問題

其實他的意思是說那個***.a檔案沒有找到。這時候需要檢查一下上文(4.2小節)提到的archives裡是否有我們想要的.a檔案,如果我們的引

用設定和lib專案的.a檔案都是正常的,說明這是eclipse資源同步的問題,這時候並沒有關係,再對caller專案單獨一下build就行。

這個問題不僅現在會遇到,後面我們還會看到,在使用資源檔案(.res)生成.o檔案的時候,常常也會發生。通常是.o檔案明明已經生成了,但

eclipse的專案裡卻看不到,這時候只需要用f5重新整理(或者在專案上點右鍵選重新整理)一下該專案就能看到我們需要的檔案,再編譯連線就能正常。

第四部分 方法3

對employee.calculatepay方法的呼叫是問題的原因。我們需要的是晚繫結。晚繫結 latebinging 意味著編譯器到執行時才選擇要執行的方法。為了迫使編譯器呼叫向上型別轉換得到的物件的方法的正確版本。我們使用了兩個關鍵字 virtual 和override.必須在基類方法中使用vi...

第四部分 方法5

linux繼承了unix作業系統結構清晰的特點。在linux下的檔案結構非常有條理。但是,上述的優點只有在對linux相當熟悉時,才能體會到。vmlinuz 我們已經知道,每乙個linux都有乙個核心 vmlinuz 我們在這個核心上新增上可以完成各種特定功能的模組,每個模組就體現在 linux中各...

JavaScript筆記(第四部分)

命 名 空 間 管理變數,防止汙染全域性,適用於模組開發 之 前 的 解 決 辦 方 已經不用 命名空間 var org xuming department2 lisi 了解即可 用 法 org.department1.jicheng.name 簡化 var jc org.department1.j...