QT中靜態庫的生成與使用

2022-08-01 17:24:10 字數 3580 閱讀 4345

一. 靜態庫的生成

1. 測試目錄: lib

2. 原始碼檔名: mywindow.h, mywindow.cpp, 類mywindow繼承於qpushbutton, 並將文字設定為"i'm in class mywindow";

3. 編寫專案檔案: mywindow.pro

注意兩點:

template = lib

config   += staticlib

4. 生成makefile:

qmake

5. 編譯生成靜態庫libmywindow.a

make

二. 靜態庫的使用

1. 測試目錄: test

2. 將mywindow.h與libmywindow.a拷貝至test目錄下

3. 編寫main.cpp, 包含標頭檔案mywindow.h, 並呼叫mywindow類

4. 編寫專案檔案: test.pro

注意加上庫路徑與庫檔名:

libs += -l ./ -lmywindow

5. 生成makefile: qmake

6. 編譯: make

7. 執行: ./test

如果你開啟一些 windows 應用程式的目錄,你會發現有很多程式的 exe 檔案都很小,大約幾百k 的樣子,並且目錄中不僅僅只有乙個 exe 檔案,還包含著一大堆 dll 檔案。這些 dll 其實就是一些共享庫,所謂共享庫,其實就是一些動態鏈結庫,能夠由程式在執行時進行動態載入的庫。既然說是共享,那就是說,這些庫不僅僅自己的程式可以使 用,並且其他程式也可以使用,例如某些通用演算法。如果你發布一下自己編寫的 qt 程式,也會看到很多系統的共享庫,就是那些 qtgui.dll 之類的東西。或許你會說,我寫的程式沒有同其他應用共享的庫,就不需要這些了吧!其實不然。因為共享庫的乙個好處是可以動態載入,也就是說,如果你需要公升 級程式,那麼就要簡單的替換掉這個 dll 就好了,不需要要求使用者重新安裝全部檔案。當然,這些 dll 也是有缺點的:動態載入的東西肯定會比靜態編譯的東西效率低一些。不過在現在的硬體環境下,這點效能損失已經可以忽略不計了。

今天我們要說的就是如何用 qt 建立共享庫**。

我們還是使用 qtcreator。在建立工程的時候,我們選擇下面的 c++ library 一項,然後點選 ok。

在接下來的對話方塊中,有乙個下拉列表,分別是 shared library(共享庫),statically linked library(靜態鏈結庫)和 qt 4 plugin(qt 4 外掛程式)。我們選擇第乙個共享庫,後面的步驟中會要求選擇加入哪幾個 qt 模組,和前面一樣,選擇自己需要的部分,最後完成工程的建立。

我們會看到 qtcreator 已經幫我們建立好了一些檔案。其中有乙個 _global.h 的檔案是 qtcreator 替我們建立的。下面我們就從這個 _global.h 開始:

1 #ifndef lib_global_h  

2  #define lib_global_h

3 4 #include

5 6 #if defined(lib_library)

7 # define libshared_export q_decl_export

8 #else

9 # define libshared_export q_decl_import

10 #endif

11

12 #endif // lib_global_h

這個檔案中只是定義了兩個巨集 libshared_export,注意這裡的 lib 就是我的工程名字。如果定義了 lib_library,libshared_export 定義為 q_decl_export,否則定義為 q_decl_import。看這個名字,就知道這就是把物件匯出的語句了。下面我們來編寫乙個視窗(如果你希望這麼做,不要忘記在建立工程時勾選 qtgui 模組,預設是不勾選的):

lib.h

1 #ifndef lib_h  

2  #define lib_h

3 4 #include

5 6 #include "lib_global.h"

7 8  class libshared_export mainwindow : public qmainwindow ;

12

13 #endif // lib_h

lib.cpp

1 #include "lib.h"

2 3 mainwindow::mainwindow(qwidget *parent)

4 : qmainwindow(parent)

5

**很簡單,就是建立乙個 mainwindow。同前面的**唯一不同的是,在標頭檔案中,使用了 libshared_export 這個巨集。你可以簡單的把它理解成,我需要把這個類 mainwindow 匯出。所謂匯出,就是將其編譯成乙個 dll 檔案之後,其他的類可以使用這個匯出類。好了,下面和原來一樣,編譯一下這個工程。在 debug 資料夾下你得到的是乙個 lib.dll 檔案和 liblib.a。後者是 linux 下使用的庫,這裡不再詳述。

好了,我們要去使用這個 dll 了。新建另外乙個工程,需要吧 .pro 檔案修改一下:

首先,我們新增了 includepath 這一行。這一行就是為了讓我們的 test 專案可以找到 lib.h 和 lib_global.h 這兩個檔案,你需要把這裡的路徑替換成符合你的工程的路徑。libs 這一行則需要告訴編譯器(注意,這裡是編譯器!)到**去找到這個 dll 檔案。然後我們編寫 main.cpp:

注意,我們使用了 lib.h,但是這個檔案並沒有在 headers 裡面宣告,qt 實際上就是從 includepath 這裡去找到這個檔案。mainwindow 在新建的 test 工程中並沒有宣告,那麼它在**呢?當然就是在我們編譯出來的 lib.dll 裡面啦!我們知道,在鏈結的時候編譯器需要找到實現入口,也就是必須定位到這個 dll,這就是由這個 libs 指定的地方。

最後編譯執行一下這個 exe 檔案,怎麼樣?哦,如果你照我說的做了的話,你應該得到乙個錯誤:找不到 lib.dll。怎麼會找不到呢?不是使用 libs 指定了嗎?請注意,我們強調了,這個指定是編譯期的。dll 是動態鏈結庫,也就是說,在 exe 執行的時候需要找到這個庫。執行時查詢的順序是:當前路徑 -> 系統路徑(通常是 system32)。所以,要把我們先前生成的這個 lib.dll 複製到 exe 所在目錄,然後直接雙擊一下這個 exe 檔案。乙個視窗出來了!有什麼區別嗎?執行起來是沒有區別的,但是我們知道,這個視窗是在這個 dll 裡面實現的!我們想往視窗裡面加個按鈕?沒問題,那就加吧!加完之後重新編譯乙個新的 dll,複製到 exe 資料夾覆蓋舊的,修改就完成啦!我們不需要修改這個 exe 了。

這個時候我們再來回憶一下,我們使用自己建立的 dll 的時候,是不是就和使用 qtgui.dll 一樣呢?只不過qtgui.dll 已經放在了庫目錄下, 不需要手動修改 .pro 檔案新增 includepath 和 libs 罷了。

Qt編譯生成靜態庫(靜態編譯)

開發環境 vs2008 qt4.8.4原始碼庫 其他環境請自己嘗試,原理應該是差不多的 qt編譯生成靜態庫1.本教程只針對在win32平台,使用vs開發工具 例子以vs2008為例 2.3.解壓qt源 到目標目錄,如 4.開啟 mkspecs 目錄,找到目標平台的資料夾,如 win32 msvc20...

c 生成靜態庫 C語言靜態庫的製作與使用

靜態庫是指在我們的應用中,有一些公共 是需要反覆使用,就把這些 編譯為 庫 檔案 在鏈結步驟中,聯結器將從庫檔案取得所需的 複製到生成的可執行檔案中的這種庫。靜態庫 在程式開發工作中,經常會遇到我們的程式需要鏈結外部庫的做法。比如想要在我們的c工程中呼叫sqlite資料庫的相關介面進行資料庫操作,那...

靜態庫與動態庫的生成

一.靜態庫 靜態庫 a 程式在編譯鏈結時候把庫的 鏈結到可執行 中,程式執行時將不再需要靜態庫。測試程式 add.h ifndef add h define add h int add int x,int y endif add.c include add.h int add int x,int y...