zoukankan      html  css  js  c++  java
  • 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-demo5app tkconv_qtcodeopt.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的技术,商用还是有风险。

  • 相关阅读:
    设置debian的静态IP
    《深入理解Java虚拟机》学习笔记之最后总结
    《深入理解Java虚拟机》学习笔记之字节码执行引擎
    《深入理解Java虚拟机》学习笔记之类加载
    《深入理解Java虚拟机》学习笔记之工具
    《深入理解Java虚拟机》学习笔记之内存回收
    Proxy源码解析
    Mysql索引
    搞定Hotspot-api
    JNI链接
  • 原文地址:https://www.cnblogs.com/guoxianwei/p/12697117.html
Copyright © 2011-2022 走看看