【RTKLIB_Qt】【除錯】 Rtklib 除錯
在使用了 RTKLIB開源包自帶的 rtkplot.exe後,知道了它所具有的功能,就想著如何模仿它做出一個 demo。一開始看的是之前下載的 2.4.2版本的 RTKLIB,裡面是使用 Delphi開發的。由於我現在對 Qt比較熟悉,所以想著使用 Qt框架來開發這個 demo。在看原始碼的過程中,陰差陽錯之間又去官網上重新下載了一次原始碼包,結果發現最新的 2.4.3版本里面就帶有相關 App程式的 Qt實現。這樣的話,就可以直接閱讀現成的 Qt原始碼了。不過首先需要解決的問題是,要嘗試將所給的原始碼編譯成功。
1.直接在 Qt creator中開啟 rtkplot_qt.pro檔案,配置專案屬性,進入正常的工作介面。直接進行除錯,則會報出如下錯誤。
一開始以為是 VS2015在安裝時出了問題,網上找的解決方案也都是說配置環境變數。其實不然,上圖中已經說明是什麼問題了,是 src\debug目錄下缺失 libRTKLib.a檔案。
2. .a檔案是 Linux系統下的靜態庫檔案,類似於 Windows系統下的 .lib檔案;同樣的,Linux系統下的 .so檔案是動態連結庫檔案,相當於 Windos系統下的 .dll檔案。另外,之前在閱讀 rtkplot_qt的原始碼時就發現,其實裡面很多資料和演算法的程式碼都是使用 src下的相應程式碼,所以這些視覺化程式是需要呼叫 src庫中的程式碼的。而呼叫方式就是通過將 src中的原始碼編譯成靜態連結庫,供這些視覺化程式使用。這一點在 rtkplot_qt.pro檔案中是有所體現的,如下圖所示。
3.既然知道了問題是 src\debug目錄下缺失 libRTKLib.a檔案,那就想辦法去找到 libRTKLib.a檔案並放置到該目錄下即可。開啟資料夾,發現 src目錄下根本就沒有 debug資料夾,所以我們就先新建一個 debug資料夾。接著在整個 RTKLIB原始碼包中搜索 libRTKLib.a檔案,結果是都沒有找到。既然沒有現成的,那就可能需要我們自己製作一個 libRTKLib.a檔案了。
4.前面說了,libRTKLib.a檔案就是將 src原始碼編譯成的靜態連結庫檔案,而 src資料夾下正好有一個 src.pro檔案。開啟該檔案,發現如下圖所示程式碼
上圖中的程式碼就是說本次 Qt專案的目的是生成一個名為 RTKLib的靜態連結庫檔案。不過需要注意的是,windows系統下生成的是 .lib檔案!直接除錯該專案,報出如下錯誤
再檢視如下圖所示的編譯資訊後,發現問題應該是編譯引數“-Wno-unused-but-set-variable” 無效導致的。百度之後,該編譯引數的原意是為了忽略掉那些設定了而沒有使用到的引數,但是如下圖所示的寫法似乎有問題,應該改成圖 7所示的寫法。
圖 5 編譯引數“-Wno-unused-but-set-variable” 所導致的的錯誤
圖 6 編譯引數“-Wno-unused-but-set-variable” 原本的書寫方式
圖 7 編譯引數“-Wno-unused-but-set-variable” 修改之後正確的書寫方式
5.清除原專案後執行 qmake,再重新除錯一次,即可成功執行,彈出如下所示的對話方塊。
一開始我也很懵逼,咋會彈出這個介面。我知道這個介面就是相當於 C++控制檯程式可以通過命令列給主函式 main傳遞引數,但是 src資料夾下根本就沒有 main函式,裡面都是函式的原始碼,並沒有呼叫這些原始碼的函式。百度之後發現,這是因為該專案本身就是為了編譯靜態庫檔案,專案中沒有可執行的主函式,所以才會彈出這個介面來選擇可執行程式並輸入引數。至於所需要的靜態連結庫檔案 libRTKLib.lib,已經生成在了build-src-Desktop_Qt_5_8_0_MSVC2015_64bit-Debug\debug目錄下。將該檔案拷貝到 src\debug目錄下,在重新編譯 rtkplot_qt專案之前,需要將圖 2中的程式碼改成下圖所示。這是因為現在生成的靜態庫是 .lib檔案,而原始碼的環境可能是 Linux系統,所以用的是 .a檔案。需要對程式碼稍作修改。
清除後執行 qmake,再重新除錯,又會報出如下錯誤
6.對於前兩個錯誤,直接在 plotcmn.cpp檔案中使用該函式報錯的地方,再新增第三個引數 ndec就可以了。而第三個錯誤,則要將字串指標陣列 name重新定義成 常量字串指標陣列(const char*)。修改之後再次編譯,又會報出如下錯誤。
這個問題初看很奇怪,因為報“無法解析的外部符號”一般都是連結庫出了問題,而我們之前已經添加了連結庫檔案 libRTKLib.lib。一開始我不知道要自己編譯 libRTKLib.lib檔案時,曾經把圖 2中的程式碼直接註釋掉,想試一下程式能不能執行,結果報了一大堆“無法解析的外部符號”的問題。而現在在添加了連結庫之後還報了這個問題,不過只報了這兩個“無法解析的外部符號”。難道是 libRTKLib.lib裡的確沒有包含 input_tersus和 input_tersusf這兩個函式?查詢之後發現這兩個函式是在 src/rcv/tersus.c檔案中的,開啟 src.pro檔案,發現其 SOURCES中真的還就只缺失了 tersus.c這個檔案。在 SOURCES中新增完該檔案後,重新編譯 src專案的靜態庫檔案。再將第二次得到的 libRTKLib.lib替換掉 src/debug目錄下的相應檔案。
7.重新執行 rtkplot_qt專案,就可以成功執行啦。執行結果如下圖所示