QTrtklib編譯記錄


QTrtklib編譯記錄

結合最近編譯中遇到的問題,重新試一下看能不能編譯通過rtklib的Qt版本。畢竟用c++build編譯太麻煩了。

需要特別說明的是本文使用的代碼是rtklibexplorer修改的rtklib代碼分支,所以有些問題可能是直接編譯rtklib源碼所不能遇到的。
本文中,exp分支特指rtklibexplorer修改的rtklib版本 demo5分支,主分支指的是tomojitakasu的rtklib v2.4.3分支
qt編譯器現在mingw32

使用的代碼:

問題1:

如下圖:

  • 方案1: 從之前的版本中找到這個文件,放到rcv下,然后修改src.pro,注釋掉rcv/ss2.c \z這行代碼再反注釋就可以初步調試通。

  • 方案2:刪除rcv/ss2.c \這行代碼,即認為不存在這個文件進行編譯。

問題2:

找不到FREQ1的定義。

思路:查看該問題位於ss2.c文件中。(也就是上步注銷掉ss2.c文件就沒這個問題了。。)由於ss2.c文件很久沒有更新了,所以追溯到最后一次更新的版本,找到對應的rtklib.h
頭文件71行。

 #define FREQ1       1.57542E9           /* L1/E1  frequency (Hz) *

對應現在的rtklib.h文件對應的變量為FREQL1:

#define FREQL1      1.57542E9           /* L1/E1  frequency 1 (Hz) */

所以解決辦法為:將FREQ1修改為FREQL1.

問題3:

code2obs調用方法不對:

思路:這個是因為exp分支對北斗的頻率做了特殊處理:

extern char *code2obs(int sys, unsigned char code, int *freq)
{
    if (freq) *freq=0;
    if (code<=CODE_NONE||MAXCODE<code) return "";
    if (freq) {
       if (sys==SYS_CMP)
           *freq=obsfreqs_cmp[code];
       else
           *freq=obsfreqs[code];
    }
    return obscodes[code];
}

主分支為:

extern char *code2obs(unsigned char code, int *freq)
{
    if (freq) *freq=0;
    if (code<=CODE_NONE||MAXCODE<code) return "";
    if (freq) *freq=obsfreqs[code];
    return obscodes[code];
}

特殊處理在添加了北斗對應的觀測頻段obsfreqs_cmp數組。從上面函數的變化可以看出,新增加的參數主要是針對北斗的觀測值,所以只有當使用北斗觀測值的時候才對sys賦值SYS-CMP,例如:

obs1=code2obs(SYS_CMP,codes[i],NULL);

除北斗外的觀測值sys賦值為0即可。例如:

obs1=code2obs(0,codes[i],NULL);

所以找到這些報錯的地方,根據函數使用環境,在sys變量對應位置填上0或者SYS_CMP即可。(由於這里只是在調用數據繪圖,BDS和Galileo的頻段很多類似,所以統一補充上0就行)。

問題4:

RTKLIB-demo5\app\rtkconv_qt\codeopt.cpp:333: error: 'FREQTYPE_L7' was not declared in this scope
E27->setEnabled((NavSys&SYS_GAL)&&(FreqType&FREQTYPE_L7));

查看主分支的源代碼里的codeopt.cpp這一部分也沒改,檢索發現rtklib.h解釋的FREQTYPE_L7定義為:

#define FREQTYPE_L7 0x10                /* frequency type: E5b/B2 */
#define FREQTYPE_L8 0x20                /* frequency type: E5(a+b) */

而exp分支對它做了處理,所以有點不一樣,特殊處理了一下,直接替換一下:

#define FREQTYPE_L7 0x10                /* frequency type: E5b/B2 */
#define FREQTYPE_L2 0x04               /* frequency type: E5b/B2 */

按照同樣的方法處理其他提示頻率有問題的項目:

#define FREQTYPE_L6 0x08                /* frequency type: E6/LEX/B3 */
#define FREQTYPE_E6 0x10                /* frequency type: E6/LEX/B3 */
#define FREQTYPE_L8 0x20                /* frequency type: E5(a+b) */
#define FREQTYPE_E5ab 0x20              /* frequency type: E5(a+b) */
#define FREQTYPE_L9 0x40                /* frequency type: S */
#define FREQTYPE_S 0x40                 /* frequency type: S */

問題5 :

error: No rule to make target '../../src/debug/libRTKLib.a', needed by 'release/rtkget_qt.exe'. Stop.

在網上查找的時候遇到過國外的一個小伙伴遇到這個問題,帖子暫時找不到了,不過找到一個國內的小伙伴調試的帖子這個可能有用:Windows環境下的RTKPlot_Qt版本編譯時遇到的問題和解決方法,這里就參照這個帖子一步一步調試看看:

就是有一點需要注意:libRTKLib.lib生成需要調換到debug模式,然后在構建菜單下執行qmake操作。

debug模式下調試沒問題,在*****——debug目錄下的app/debug/rtk各軟件目錄下能找到各自編好的debug版本的程序,但是直接運行不行,會提示缺庫,這是qt打包exe時會出現的問題,參考這個帖子,這時候需要用到用到這個工具:

在命令行下執行windeployqt xxx.exe,xxx這里可以放上生成的exe dug版的路徑。執行完后這個exe文件夾內會生成多個dll庫,這時候雙擊exe就可以運行了。這就類似生成的是綠色版的程序。對,類似Vnote的Windows版,就是直接運行exe。

確實感覺沒有c++ builder 生成的方便。另外,切換到release模式,一直會提示找不到libRtkLib.a,實在搞不定就放棄了。

看到科學網的這篇博客,突然發現一個點:mkl矩陣加速,鏈接是:RTKLIB 在OSX系統下Xcode/CLion平台上的編譯問題及解決方法,好奇查了一下好像確實能加快矩陣運算,但因為mkl是Intel的技術,商用還是有風險。


免責聲明!

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



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