Qt中建立並引用庫 pro檔案的書寫

2021-09-01 05:04:15 字數 2076 閱讀 7471

1.在qt中新建乙個庫"new libraries",包含(.pro & .h & _global.h & .cpp )

2.編寫程式和庫函式:

執行 qmake(生成makefil檔案) 和build–>

在和專案資料夾 [a] 並列的build…資料夾 [b] 中,會生成.o(目標/執行檔案)和.so(動態鏈結庫)檔案

3.引用該庫時在專案的*.pro中新增兩行,注意檢查是否與實際相符:

libs += *b資料夾的路徑*//*.so等鏈結庫檔案所在路徑

includepath += *a資料夾的路徑*//*.h標頭檔案所在路徑

對於庫:缺哪,找哪,include & libs哪!!!

直接qmake–>build不需要run

備註:

庫(自己理解): 相當於把各類函式和類等打包起來編譯好(封裝),等其他程式需要用的時候,直接#include這個庫的標頭檔案(介面),既能呼叫原庫中的函式和物件等內容

makefile:編譯生成的檔案,bug始終除錯不出時,可考慮將該檔案刪去重新生成

建立庫參考

呼叫庫中的函式參考

***_global.h:是所有library專案都有的標頭檔案,選取要用的qt模組的包含宣告也在該檔案內

.pro檔案的書寫

libs += //指定鏈結到專案中的庫列表

#例如,新增 slambase 庫

libs += -l$$pwd/../build-untitled4-desktop-debug/ -lslambase//從當前路徑(build資料夾在當前路徑的上一級路徑)

includepath += $$pwd/build-untitled4-desktop-debug//從當前路徑(build資料夾就在當前路徑)

libs += -l/home/junwang/qt/build-slambase_3-desktop-debug/ -lslambase_3//從絕對路徑

includepath +=  //指定編譯專案時應該被搜尋的#include目錄

qt在編譯鏈結第三方庫時配置include目錄

所以說我的slam程式中opencv\pcl等都算是第二方庫,可以不includepath

mr.肖:安裝了的谷歌瀏覽器算二方的話,其上外掛程式就算三方

小技巧

在linux下,可以通過ldd命令檢視程式是否能找到依賴的動態庫,從而排查是缺少庫還是由於環境變數配置不正確導致的程式無法啟動;從而也可以核對哪些庫是真正需要引用的,哪些在.pro中可能並不需要引用說明的。

cd 進入想要檢視的庫、執行程式所在的資料夾:

ldd --help//檢視ldd命令的選項

ldd -u [檔案]//印出未使用的直接依賴關係

另參考:

動態和靜態鏈結庫

靜態庫(.a、.lib):

在程式編譯時會被連線到目標**中,程式執行時將不再需要該靜態庫(在鏈結階段,會將彙編生成的目標檔案.o與引用到的庫一起鏈結打包到可執行檔案中,因此對應的鏈結方式稱為靜態鏈結),靜態庫浪費資源且不方便之後的更新改動

動態庫(.so、.dll):

在程式編譯時並不會被連線到目標**中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在.不同的應用程式如果呼叫相同的庫,那麼在記憶體裡只需要有乙份該共享庫的例項,規避了空間浪費問題

參考:重新命名

專案名:在資料夾中對.pro檔案重新命名,其之後編譯生成的build資料夾也會變

.cpp或.h:在專案中"rename"

二進位制程式名:在* .pro檔案 的 "target= "中改

資料夾名:隨便改,不過引用時要注意是否名稱已更改;通常還要刪去.usr檔案,下次開啟時再自動配置生成

Qt中的 pro檔案

使用qt嚮導生成的應用程式.pro檔案格式qt core gui 模組的名字 greaterthan qt major version,4 qt widgets target test 應用程式名 原始檔 sources main.cpp mainwindow.cpp 標頭檔案 headers ma...

QT的pro檔案編寫

下面是cloudcompare中乙個自己寫的外掛程式的pro檔案,pro檔案編寫可按照如下方式寫。新增qt的模組 qt widgets opengl template lib 指明生成的庫的名字 target qsaf 指明編譯依賴路徑 dependpath 包含標頭檔案路徑 includepath...

Qt專案下pro檔案設定庫路徑

正常情況下我們會將工程的路徑用乙個變數來儲存 例如 然後後面的變數引用這個變數,例如 includepath thirdparty sqlite3 include libs lrt lpthread l thirdparty sqlite3 lib lsqlite3 lsqlite3 json但是在...