Qt動態庫靜態庫的創建、使用、多級庫依賴、動態庫改成靜態庫等詳細說明


本文描述的是windows系統下,通過qtcreator在pro文件中添加動態庫與靜態庫的方法:

1、添加動態庫(直接添加動態庫文件.dll,非子項目)

通過qtcreator創建動態庫的方法就不在此處贅述了。

唯一值得強調的是動態庫與靜態庫的創建在pro文件中配置的區別在於靜態庫多了

CONFIG += staticlib ,如下圖所示(稍安勿躁,以下示例的工程代碼最后會統一打包上傳)

注:mingw32編譯器生成的動態庫文件包括一個***.dll和一個***.a文件(這里的.a文件為導入庫,類似於vc動態庫生成的lib文件, .dll.a類型文件是MinGW下的DLL文件的imp-lib,即與MSVS下DLL文件附帶了一個引入庫.lib類似。在MSVS下編程,當要使用DLL文件時,在開發時必須要有.lib文件才能鏈接通過。在MinGW無需imp-lib庫文件的幫助,可直接與.dll文件鏈。在大多數情況下,.dll.a文件不起作用。具體見https://www.cnblogs.com/liushui-sky/articles/9488020.html),vc編譯器生成的動態庫文件包含一個***.dll和一個***.lib文件

 

接下來言歸正傳,如何添加動態庫,右擊工程名,選擇“添加庫”,由於是添加外部的庫,就選擇“外部庫”,如果是子項目的生成的動態庫,則選擇“內部庫”,系統庫就不在此介紹了。

這里需要吐槽下,貌似qtcreator添加外部庫的步驟在windows下只能添加.lib文件,也就是說主要用於添加vc編譯器生成的動態庫文件,這個比較坑,linux下到是沒有這個問題。

那么qtcreator mingw32編譯器生成的庫如何添加呢,在看上面兩幅圖的第一幅,添加庫的最終目的是“請將庫和它的include路徑添加到.pro文件中”,所以我們直接把庫文件和include路徑直接寫到pro文件中即可。添加方法主要有以下幾種,不贅述,直接看圖

這樣動態庫就添加好了。

2、添加靜態庫(直接添加靜態庫文件.a,非子項目)

與添加動態庫類似,不詳細說明,直接看圖,相信聰明的你一看就明白

pro文件:                              編譯生成文件(靜態庫***.a文件):

                

接下來,如何添加靜態庫,右擊工程名,選擇“添加庫”,由於是添加外部的庫,就選擇“外部庫”,如果是子項目的生成的動態庫,則選擇“內部庫”,系統庫就不在此介紹了。

還是得說聲抱歉,貌似qtcreator添加外部庫的步驟在windows下不管是動態庫和靜態庫都只能添加.lib文件,也就是說主要用於添加vc編譯器生成的動態庫(庫文件.dll和其引導文件.lib)和靜態庫文件(.lib文件),這個比較坑,linux下到是沒有這個問題。

那么上面qtcreator mingw32編譯器生成的靜態庫如何添加呢,其實跟添加動態庫是一樣的,指定庫文件和include路徑,具體看第一節的圖。

3、添加動態庫或靜態庫子項目

當一個工程包含多個子項目時,往往一個帶main主文件的項目作為主項目(即最后運行的程序),其它子項目以生成庫(動態庫或者靜態庫)的方式讓主項目進行包含。

未來調試方便,我們通過添加”內部庫”的方式建立依賴關系,達到動態關聯的目的。添加方法如下:

最終在test_lib.pro的文件中添加了以上代碼,但是由於mingw32生成的靜態庫不帶lib文件,所以以上最后3行要刪除,即下圖中的注釋部分不需要

添加內部動態庫更加簡單,都不用刪除,見下圖:

 

 4、多級庫依賴

以下圖中項目為例介紹,test_lib依賴test_lib.2,而test依賴test_lib,所以也要依賴test_lib2,記住不管動態庫還是靜態庫子項目都要把多級依賴的庫都添加上,而且還要注意順利(具體如圖中紅線所示),否則哪怕編譯未出錯,也無法正常實現功能。也許有人先在test項目pro中加上了test_lib2的依賴,然后編譯通過了,然后再注釋掉重新編譯還是可以正常運行,但是我想告訴你的是----這都是假象,不相信你把編譯的文件都刪掉再編譯就不行了,這只不過是qtcreator重新構建的功能沒有把一些編譯文件清除干凈而已,所以還是要求把依賴項都加上。這個依賴關系的學習可以具體看這篇文章https://www.cnblogs.com/liushui-sky/articles/9487600.html

 注意:這里包含的順序與庫依賴的順序剛好相反,最底層的子項目在上面,最頂層的項目在下面

 

 

 

 

5、動態庫、靜態庫混合使用

這個是否可以混合使用呢,答案當然是可以的了,為什么這么說呢,一個很簡單的道理——動態編譯的qt庫本身都是dll的,而靜態編譯的子項目生成的庫為靜態庫,既然這樣可以 

使用說明就可以一起混合使用。具體還是以上述項目為例:

 

 

這里把test_lib2配置為生成靜態庫,test_lib不變,仍為動態庫,test依次包含,運行結果OK,說明可行。

 項目示例代碼位置:https://files.cnblogs.com/files/liushui-sky/TEST123.rar

6.動態庫改成靜態庫

 通過qtcreator創建的動態庫項目中除pro文件中有專門的“DEFINES +=******* ”定義之外,還會有 ******_global.h的頭文件生成。如以上TEST12項目中增加子項目(動態庫)test_share_lib。

如果項目后期需要改成靜態庫的話,除了pro中增加“CONFIG += staticlib”之外,還需要把這個頭文件和DEFINES刪除掉,並且在test_share_lib.h的頭文件中把下圖中的紅色划線部分刪除,否則當他還依賴其它幾個靜態庫時會報找不到庫(注:_imp__***相關的問題一般是動態庫相關的問題)的報錯及dllimport相關的報警,具體見下圖,這個錯誤很隱蔽,切記,如果沒有刪除這些,有時候編譯也能過,那是應該有些編譯文件(還是動態庫時候編譯的文件)沒有刪除干凈的原因,這個前面已經說明過類似的情況了,切記

未注釋而報錯的項目代碼位置:https://files.cnblogs.com/files/liushui-sky/TEST123_2.rar

你只需要按上刪除pro中的內容和test_share_lib_global.h頭文件,並按上修改test_share_lib.h,就不會報錯,可以自己試一下吧。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM