使用Qt建立動態和靜態鏈結庫

2021-08-15 09:01:38 字數 3612 閱讀 8441

靜態鏈結庫是將函式和資料編譯成的乙個二進位制檔案,linux下的靜態鏈結庫是*.a檔案,而在windows下的靜態鏈結庫是*.lib檔案。編譯器在連線的時候會恢復靜態庫檔案中的函式和資料,並將它們和應用程式中的其它模組組合在一起生成可執行檔案,因此,體積比較大。

在qt中建立靜態庫檔案的主要步驟如下:

1、新建乙個建立c++庫檔案專案;

2、構建專案,生成庫檔案;

3、配置環境變數;

首先新建乙個建立c++庫檔案專案,如下如所示:

專案源**如下:

[cpp]view plain

copy

#ifndef staticlibrary_h

#define staticlibrary_h

#include 

class

qpushbutton;  

class

staticlibrary : 

public

qdialog ;  

#endif // staticlibrary_h

[cpp]view plain

copy

#include "staticlibrary.h"

#include 

staticlibrary::staticlibrary(qwidget *parent) : qdialog(parent)    

然後構建專案之後,會在目錄的debug下生成乙個字尾名為.a的檔案(我是在windows7上操作的,編譯器版本為mingw):

這個檔案即為靜態鏈結庫檔案了。接下來使用這個靜態鏈結庫檔案。

建立乙個新的qt gui專案,原始碼如下

[cpp]view plain

copy

#ifndef textlibrary_h

#define textlibrary_h

#include 

class

qpushbutton;  

class

textlibrary : 

public

qdialog  

;  #endif // textlibrary_h

[cpp]view plain

copy

#include "textlibrary.h"

#include "mylib.h"

#include "staticlibrary.h"

#include 

textlibrary::textlibrary(qwidget *parent)  

: qdialog(parent)  

textlibrary::~textlibrary()  

void

textlibrary::on_button_clicked()    

[cpp]view plain

copy

#include "textlibrary.h"

intmain(

intargc, 

char

*argv)    

現在就要將前面建立的庫檔案使用到這個專案中了,在.pro檔案中新增.a檔案的路徑,以及標頭檔案的路徑。

[cpp]view plain

copy

libs    += f:\library\staticlibrary\debug\libstaticlibrary.a  

includepath += f:\library\staticlibrary  

執行結果如下:

其中右圖為左圖按鈕test的效果。

動態鏈結庫檔案是在執行的時候被應用程式使用。在使用動態鏈結庫的時候,一般需要提供兩個檔案:

1.引入庫檔案(.lib):引入庫檔案與靜態鏈結庫檔案的字尾名相同,但是並不相同。引入庫檔案主要包含了dll檔案匯出的函式和變數的符號名。

2.dll(.dll):包含實際的函式和資料。

在使用動態鏈結庫的情況下,在編譯鏈結可執行檔案時,只需要引入庫檔案即可,但是在執行可執行程式時,則需要載入相應的dll檔案。

接下來使用qt建立動態鏈結庫檔案,步驟與建立靜態庫檔案類似。源**如下:

[cpp]view plain

copy

#ifndef mylib_h

#define mylib_h

#include "mylib_global.h"

#include 

class

qpushbutton;  

class

mylibshared_export mylib : 

public

qdialog ;  

#endif // mylib_h

[cpp]view plain

copy

#include "mylib.h"

#include 

mylib::mylib(qwidget *parent) : qdialog(parent)    

然後配置環境變數,在.pro中新增:

[cpp]view plain

copy

libs    += f:\library\mylib\debug\mylib.dll  #這是編譯期的鏈結庫路徑  

includepath += f:\library\mylib  

在執行的時候,你可能得不到任何的結果。這是因為,雖然我們在libs中新增了dll檔案的路徑,但是這裡的新增路徑編譯器時的查詢路徑,在執行時並不是從這裡查詢,而是先從當前專案目錄中先找,然後從系統變數path的路徑中去找。因此,有兩種方法可以解決這個問題,將dll檔案拷貝到當前目錄中,或者在系統變數path中新增dll的路徑,然後重啟電腦。然後執行結果如下:

前面說到,動態鏈結庫包括兩個檔案,引入庫檔案和dll檔案,為什麼這裡只需要將dll檔案拷貝到當前目錄下呢?這是因為引入庫檔案中包含的是dll檔案的函式和變數的符號名,用來供給應用程式的編譯通過,而在.pro檔案中配置libs的路徑即為編譯階段的查詢路徑,因此這裡的引入庫檔案就不需要拷貝即可在編譯階段被編譯器查詢得到。

使用Qt建立動態和靜態鏈結庫

靜態鏈結庫是將函式和資料編譯成的乙個二進位制檔案,linux下的靜態鏈結庫是 a檔案,而在windows下的靜態鏈結庫是 lib檔案。編譯器在連線的時候會恢復靜態庫檔案中的函式和資料,並將它們和應用程式中的其它模組組合在一起生成可執行檔案,因此,體積比較大。在qt中建立靜態庫檔案的主要步驟如下 1 ...

動態鏈結庫和靜態鏈結庫的建立和使用

1.靜態函式庫 這類庫的名字一般是 lib a 利用靜態函式庫編譯成的檔案比較大,因為整個 函式庫的所有資料都會被整合進目標 中,他的優點就顯而易見了,即編譯後的執行程式不需要外部的函式庫支援,因為所有使用的函式都已經被編譯進去了。當然這也會成為他的缺點,因為 如果靜態函式庫改變了,那麼你的程式必須...

動態鏈結庫和靜態鏈結庫

函式和資料被編譯進乙個二進位制檔案 通常擴充套件名為.lib 在使用靜態庫的情況下,在編譯鏈結可執行檔案時,鏈結器從庫中複製這些函式和資料並把它們和應用程式的其它模組組合起來建立最終的可執行檔案 exe檔案 在使用動態鏈結庫的時候,往往提供兩個檔案 乙個引入庫和乙個dll。引入庫包含被dll匯出的函...