1. 程式人生 > >Windows環境下的RTKPlot_Qt版本編譯時遇到的問題和解決方法

Windows環境下的RTKPlot_Qt版本編譯時遇到的問題和解決方法

-s debug otc 命令 rcv 目的 我們 自帶 不知道

在使用了 RTKLIB開源包自帶的 rtkplot.exe後,知道了它所具有的功能,就想著如何模仿它做出一個 demo。一開始看的是之前下載的 2.4.2版本的 RTKLIB,裏面是使用 Delphi開發的。由於我現在對 Qt比較熟悉,所以想著使用 Qt框架來開發這個 demo。在看源碼的過程中,陰差陽錯之間又去官網上重新下載了一次源碼包,結果發現最新的 2.4.3版本裏面就帶有相關 App程序的 Qt實現。這樣的話,就可以直接閱讀現成的 Qt源碼了。不過首先需要解決的問題是,要嘗試將所給的源代碼編譯成功。

1.直接在 Qt creator中打開 rtkplot_qt.pro文件,配置項目屬性,進入正常的工作界面。直接進行調試,則會報出如下錯誤。

技術分享圖片

圖 1

一開始以為是 VS2015在安裝時出了問題,網上找的解決方案也都是說配置環境變量。其實不然,上圖中已經說明是什麽問題了,是 src\debug目錄下缺失 libRTKLib.a文件

2. .a文件是 Linux系統下的靜態庫文件,類似於 Windows系統下的 .lib文件;同樣的,Linux系統下的 .so文件是動態鏈接庫文件,相當於 Windos系統下的 .dll文件。另外,之前在閱讀 rtkplot_qt的源碼時就發現,其實裏面很多數據和算法的代碼都是使用 src下的相應代碼,所以這些可視化程序是需要調用 src庫中的代碼的。而調用方式就是通過將 src中的源碼編譯成靜態鏈接庫,供這些可視化程序使用。這一點在 rtkplot_qt.pro文件中是有所體現的,如下圖所示。

技術分享圖片

圖 2

3.既然知道了問題是 src\debug目錄下缺失 libRTKLib.a文件,那就想辦法去找到 libRTKLib.a文件並放置到該目錄下即可。打開文件夾,發現 src目錄下根本就沒有 debug文件夾,所以我們就先新建一個 debug文件夾。接著在整個 RTKLIB源碼包中搜索 libRTKLib.a文件,結果是都沒有找到。既然沒有現成的,那就可能需要我們自己制作一個 libRTKLib.a文件了。

4.前面說了,libRTKLib.a文件就是將 src源碼編譯成的靜態鏈接庫文件,而 src文件夾下正好有一個 src.pro文件。打開該文件,發現如下圖所示代碼

技術分享圖片

圖 3

上圖中的代碼就是說本次 Qt項目的目的是生成一個名為 RTKLib的靜態鏈接庫文件。不過需要註意的是,windows系統下生成的是 .lib文件!直接調試該項目,報出如下錯誤

技術分享圖片

圖 4

再查看如下圖所示的編譯信息後,發現問題應該是編譯參數“-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,再重新調試一次,即可成功運行,彈出如下所示的對話框。

技術分享圖片

圖 8

一開始我也很懵逼,咋會彈出這個界面。我知道這個界面就是相當於 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文件。需要對代碼稍作修改。

技術分享圖片

圖 9

清除後執行 qmake,再重新調試,又會報出如下錯誤

技術分享圖片

圖 10

6.對於前兩個錯誤,直接在 plotcmn.cpp文件中使用該函數報錯的地方,再添加第三個參數 ndec就可以了。而第三個錯誤,則要將字符串指針數組 name重新定義成 常量字符串指針數組(const char*)。修改之後再次編譯,又會報出如下錯誤。

技術分享圖片

圖 11

這個問題初看很奇怪,因為報“無法解析的外部符號”一般都是鏈接庫出了問題,而我們之前已經添加了鏈接庫文件 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項目,就可以成功運行啦。運行結果如下圖所示

技術分享圖片

圖 12 rtkplot_qt成功運行後的主界面

Bingo!

Windows環境下的RTKPlot_Qt版本編譯時遇到的問題和解決方法