QTrtklib編譯記錄
結合最近編譯中遇到的問題,重新試一下看能不能編譯通過rtklib的Qt版本。畢竟用c++build編譯太麻煩了。
需要特別說明的是本文使用的代碼是rtklibexplorer修改的rtklib代碼分支,所以有些問題可能是直接編譯rtklib源碼所不能遇到的。
本文中,exp分支特指rtklibexplorer修改的rtklib版本 demo5分支,主分支指的是tomojitakasu的rtklib v2.4.3分支
qt編譯器現在mingw32
使用的代碼:
- rtklib-rtklibexplorer分支(以下簡稱exp分支)
- rtklib-主分支
問題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的技術,商用還是有風險。