VS2012编译RTKLIB——GNSS定位开源库

2023-05-16

       

         RTKLIB开源库有着强大的GPS数据实时和后处理功能,由于笔者的毕业设计中需要对GPS载波相位观测量进行RTK解算,故而,对RTKLIB开源库进行了学习与研究。

RTKLIB提供了很多底层的函数,笔者准备直接对源码进行编译输出标准DLL的方式供C#调用。所用的VS平台是VS2012(其它VS版本类似),RTKLIB库用的是网上使用的最多,相对稳定的rtklib_2.4.2版本编译的项目采用“相对路径”,即工程可移植到任何地方,方便以后使用。

GNSS标准&精密定位开源程序包 rtklib_2.4.2 下载

目前(2018.6.21)RTKLIB开源库最新版本:rtklib_2.4.3 官网最新版本下载

也可直接参考笔者编译好的RTKLIB VS2012工程 下载 

一、RTKLIB简介

        RTKLIB是全球导航卫星系统GNSS(global navigation satellite system)的标准&精密定位开源程序包,RTKLIB由日本东京海洋大学(Tokyo Universityof Marine Science and Technology)的高须知二(Tomoji Takasu)开发。RTKLIB由一个便携式程序库和多个AP(应用程序)工具库组成。

RTKLIB的主要功能有:

1)支持多个GNSS系统的标准和精密定位算法,包括GPSGLONASSBeidouGalileoQZSSSBAS

2)支持多种GNSS实时和后处理定位模式:单点定位、DGPS/DGNSS,动态RTK、静态RTK、移动基站、PPP

3)支持多种GNSS标准格式和协议:RINEX2.10RINEX2.11RINEX2.12RINEX3.00RINEX3.01RINEX3.02RTCM2.3RTCM3.1RTCM3.2BINEXNTRIPNMEA0183SP3ANTEX1.4IONEX1.0NGS PCVEMS 2.0

4)支持多种GNSS接收机专有数据协议格式:NovAtel:OEM4/V/6OEM3, OEMStarSuperstar II HemisphereCrescentublox:LEA-4T/5T/6TSkyTraqJAVAD GW10-II/IIINVS

5)支持外部通信:SerialTCP/IPNTRIP、本地日志文件(记录和播发)FTP/HTTP

6)提供许多函数库和APIapplication program interfaces):卫星和导航系统函数、矩阵和向量函数,时间和字符串函数、坐标的转换,输入和输出函数、调试跟踪函数、平台依赖函数、定位模型、大气模型、天线模型、地球潮汐模型、大地水准面模型、基准转换、RINEX函数、星历和时钟函数、精密星历和时钟、接收机原始数据函数、RTCM函数,解算函数、谷歌地球KML转换、SBAS函数、选项(option)函数、流数据输入和输出函数、整周模糊度解算、标准定位、精密定位、后处理定位(解算)、流服务器函数、RTK服务器函数、下载函数。


二、基于VSRTKLIB编译

1.新建工程。首先,我们在VS2012下先新建一个win32的dll项目(空项目)



Win32应用程序设置如下:



2. 复制库文件。把在github上下载的rtklib2.4.2里的所有文件夹及文件复制到刚刚建立的RTKLIB工程项目文件所在目录下,如图




RTKLIB开源库(RTKLIB开源库是用C++Builder建立的工程,与VS不同)下文件目录结构及各文件夹功能:

\app-- APs构建环境         \bin--可执行二进制APs和windows链接库

\data-- APs样本数据         \doc--文档文件                       

\lib --库生成环境               \src--RTKLIB库的源程序                

\test--测试程序和数据        \util-- 实用程序工具                    

然后我们删掉的RTKLIB工程目录下的两个文件(github开源项目的配置文件)

其实,由于我们现在只是为了编译这个开源库, RTKLIB开源库中除“src文件夹”其它的我们暂时都用不到,但为了保持库的完整性以及防止以后做工程会用的到,此处都留下了,做实际工程应用的话,可以删除其它用不到的文件夹。


3.添加库文件。为了与库文件结构保持一致,我们首先在“源文件”文件夹,右击—》添加—》新建筛选器,接下来先添加头文件(在src文件夹中,只有一个头文件:rtklib.h),

然后是源文件—》添加—》现有项(添加除rtklib.h所有源文件,)“rcv”子文件夹中添加“src/rcv”目录下的所有源文件,添加完成之后,如图:



4.初步编译。“解决方案管资源理器”下,右击“RTKLIB”项目—》生成,进行编译。因为RTKLIB是在C++ Builder编译器下写的,但是我们现在用VS进行编译,会出现一堆的错误,现在我们就一个个来解决。



5. 错误类型1:error C4996: 'strncpy': This function or variable may beunsafe. Consider using strncpy_s instead. To disable deprecation, use_CRT_SECURE_NO_WARNINGS. See online help for details.     

解决:这是由于函数安全性问题,编译器已经给出建议,添加预编译指令【_CRT_SECURE_NO_WARNINGS】。我们打开调试下的项目属性,然后在 配置属性 -> C/C++ -> 预处理器 -> 预处理器定义 -> 编辑。在下面添加上【_CRT_SECURE_NO_WARNINGS】


看到网上有人编译的时候提示类似上面的另一错误,解决方法也类似,同样在预处理器定义-> 编辑。在下面添加上【_WINSOCK_DEPRECATED_NO_WARNINGS

笔者这里并没有出现,不过为了以防万一,也在“预处理器定义”中添加上此宏。



接下来,我们再次Build工程,继续解决下一错误。


6. 错误类型2: error C2466: 不能分配常量大小为 0 的数组        


解决:这个主要是编译器的问题,用g++就没有问题,在vc中定义数组,需要一个常量值。

我们双击此错误,在有问题的数组定义处,按F12,看到数组大小定义的确实是0


同样的,我们像上面一样在“预处理器定义”里面加入【ENAGLO】

接下来,我们再次Build工程,继续解决下一错误。


7. 错误类型3:error C1083: 无法打开包括文件:rtklib.h: No such file ordirectory    

解决:这是因为rcv里的文件找不到rtklib.h这个头文件。我们继续在项目属性里,在配置属性-> C/C++ 常规-> 附加包含目录-> 编辑 。在上面添加rtklib.h的相对路径使用相对路径,工程才可以移植到任何地方,否则,换个目录路径,还是会提示此错误)在项目里的src找到rtklib.h并查看它的绝对路径

要想设置相对路径,我们首先要了解.< \与..\的区别> 

.\     表示项目文件所在目录之下的目录。                   

..\     表示项目文件所在目录向上一级目录下的目录。        

..\..\   表示项目文件所在目录向上二级目录之下的目录。       

都是针对项目文件所在目录而言,用于定位其它文件的路径位置。

因此,在“附加包含目录”下,添加:【.\src】




接下来,我们再次Build工程,继续解决下一错误。


8. 错误类型4:error C2099: 初始值设定项不是常量        

解决:我们双击此错误,定位到如下代码段


初始值设定项不是常量,这是因为c编译器不支持函数外动态声明变量和分配空间,如果要必须是常量值(在数学中,0/0这种形式一般称之为不定式。 [1]  因为计算0/0就是求出一个数,使之与0相乘结果仍得0,显然,其结果可以等于任何数。 [2] 0/0”型的函数极限的结果也没有一般的规律。)故此,我们把这条语句变量定义的初值初始化为【=0.0】

接下来,我们再次Build工程,继续解决下一错误。


9. 错误类型5:error C4703: 使用了可能未初始化的本地指针变量“sbs  

解决:我们双击此错误,定位到如下代码段,做如下修改




接下来,我们再次Build工程,编译后发现又蹦出来20个莫名的错误。


10. 错误类型6:error LNK2019: 无法解析的外部符号 _showmsg,该符号在函数 _convrnx 中被引用   

解决:一查showmsg这个函数如果在DLL中需要自己定义,rtklib里面已经做好了处理需要在预处理器里面加入【DLL】即可,我们找到之前预处理器定义处,在下面添加【DLL】,再找到项目属性,在配置属性 -> 链接器 -> 输入 -> 附加依赖项里添加 【winmm.lib】和 【ws2_32.lib】


再次Build工程,没有错误,大功告成。




11.部分警告处理。大多数是什么类型转换上的Warning,暂时没有影响,暂不处理。



12.总结与补充。一般的“变量初始化”等错误,我们都能通过错误列表定位到代码段,进而解决,而添加宏定义、头文件包含路径,容易被开发者忽略。下面总结一下我们在此次编译RTKLIB开源库中,所做的添加宏定义、头文件包含路径等操作。

 

(1)C/C++下预处理器 里面我们添加了

配置属性 ->C/C++ -> 预处理器-> 预处理器定义-> 编辑

 

        _CRT_SECURE_NO_WARNINGS

        _WINSOCK_DEPRECATED_NO_WARNINGS

        ENAGLO

        DLL

 

(2)C/C++下的附加包含目录 里面我们添加了

配置属性 ->C/C++ 常规-> 附加包含目录-> 编辑

       .\src

(3)连接器下的附加依赖项 里面我们添加了

 (配置属性 -> 链接器 -> 输入 -> 附加依赖项

        winmm.lib

        ws2_32.lib

  

补充:

         通过上面的设置,我们可以发现,我们大多操作的是[C/C++]下的配置选项,而同样,在[VC++]配置选项下,

同样有[包含目录],作用几乎与[C/C++]下面的[附加包含目录]一样,我们首先了解【包含目录、库目录、附加包含目录、附加库目录、附加依赖项区别】

VC++目录:

    包含目录:寻找#include<xxxx.h>中的xxxx.h的搜索目录

    库目录:寻找.lib文件的搜索目录

C/C++:

    常规->附加包含目录:寻找#include<xxxx.h>中的xxxx.h的搜索目录(每一项对应一个文件夹XXXX,文件夹中包含了编译时所需的头文件,使用时直接#include<XXXX>即可)

链接器:

    常规->附加库目录:寻找.lib文件的搜索目录

    输入->附加依赖项:lib库(C++的库会把函数、类的声明放在*.h中,实现放在*.cpp或*.cc中。编译之后,*.cpp,*.cc,*.c会被打包成一个.lib文件,这样可以保护源代码)

故,包含目录和附加包含目录(库目录和附加库目录)的区别:

    包含目录:修改了系统的include宏的值,是全局的;

    附加包含目录:用于当前项目,对其他项目没有影响。

    (库目录和附加库目录的区别同上)

进而可知包含目录和附加包含目录(库目录和附加库目录)的区别主要在于全局还是当前,那么当需要对某工程添加这些目录时,通常情况下,都是在附加包含目录和附加库目录中添加的。

补充这些是因为,笔者刚开始编译RTKLIB库时,头文件的包含路径都是添加在[VC++/包含目录]下的,当时惊奇的发现,即使笔者一开始在[VC++/包含目录]下包含的是“绝对路径”,工程也是可以编译通过,并可以移植到任何地方的。但了解到以上以后,建议我们一般使用C/C++Linker下面的设置,而一般不建议使用VC++下面的设置。












本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VS2012编译RTKLIB——GNSS定位开源库 的相关文章

  • PnP 单目相机位姿估计(二):solvePnP利用二维码求解相机世界坐标

    前言原理简介输入参数准备 1 objectPoints特征点世界坐标2 imagePoints特征点在摄像头下的像素点坐标3cameraMatrixdistCoeffs内参矩阵和畸变矩阵 相机世界坐标的求解 1求世界坐标中的点在相机坐标系下
  • Linux下socket编程,附带tcp例子

    1 网络中进程之间如何通信 xff1f 本地的进程间通信 xff08 IPC xff09 有很多种方式 xff0c 但可以总结为下面4类 xff1a 消息传递 xff08 管道 FIFO 消息队列 xff09 同步 xff08 互斥量 条件
  • 程序员加班到深夜,你经历过没?

    我看到了自己的影子啊 虽然自己非科班出身 xff0c 学历也不高吧 xff0c 但是自认为还是很努力的 xff0c 但是为什么现在的工资水平却跟应届生差不多呢 xff1f xff08 xff09 仔细想想 xff0c 自己毕业3年了 xff
  • 【C/C++学院】(16)QT版:幸运大抽奖

    程序效果 xff1a ifndef DIALOG H define DIALOG H include lt QDialog gt include lt QLabel gt include lt QPushButton gt include
  • 【Python基础】--Pickle/函数默认参数/函数的参数*args/Bytes<=>str/32-64bit/bytes对象

    Pickle gt gt gt import pickle gt gt gt my list 61 1 2 3 39 haha 39 39 and 39 39 or 39 gt gt gt pickle file 61 open 39 my
  • Windows平台python操作串口示例,可以加工下,改写成方便的测试软件

    在 windows中 xff0c 使用 Python 进行串口编程需要安装一个 Serial 模块 pyserial xff1a 下载地址 https pypi python org pypi pyserial下载完成后得到一个 pyser
  • 告别csdn一年了

    原本坚持了4年的学习 xff0c 整理笔记 xff0c 在csdn平台上进行发表 xff0c 记录 同朋友们互动 xff0c 探讨进行学习 xff0c 自己也在不断地成长 今天再次进入博客页面 xff0c 发现界面来了个大改版 xff0c
  • php视频课程

    php视频课程 xff1a 下载地址 xff1a http php itcast cn php video shtml 注 xff1a 此系列视频 xff0c 韩顺平主讲 1 php入门到精通教程 2 第二版mysql视频教程 进行中 3
  • pixhawk ulg转csv

    ulg是目前最新版px4固件生成的log格式 xff0c 下载最新版的flightplot即可对内部数据进行预览分析 xff0c flightplot中支持部分函数和运算符操作 xff0c 但对带 数据的操作不支持 xff0c 如需要对某些
  • 将Kinetic中的Gazebo7升级为Gazebo9

    将Kinetic中的Gazebo7升级为Gazebo9 一 查看所有gazebo7的相关包二 卸载当前已安装的gazebo相关包三 添加源四 安装新版本gazebo五 安装gazebo ros pkgs六 后记 官方教程 http gaze
  • 你真的了解串口 (Serial)吗?

    一 串口的定义 串口 xff0c 全称串行通信接口或串行通讯接口 xff0c 是一种常用于电子设备间通讯的全双工扩展接口 xff1b 串行通信 xff0c 串口通讯的技术基础 xff0c 指一位一位地按顺序传送数据 其特点是线路简单 xff
  • PnP 单目相机位姿估计(三):二维码角点检测

    解PnP问题时用二维码的好处二维码识别的流程代码最后 IDE xff1a visual studio 2013 使用库 xff1a Eigen opencv2 4 9 文档版本 xff1a 1 0 解PnP问题时 xff0c 用二维码的好处
  • 2014年计算机求职总结--面试篇

    又一年实习招聘陆续开始了 xff0c 这里分享一下我在2013年实习招聘和秋季招聘中的一些面试经历 xff0c 希望能对找工作的同学有所帮助 2013年面试过的公司有蘑菇街 网易游戏 阿里巴巴 腾讯 百度 大众点评 人人网 雅虎 xff08
  • 用位运算实现两个整数的加减乘除运算

    位运算的思想可以应用到很多地方 xff0c 这里简单的总结一下用位运算来实现整数的四则运算 1 整数加法 int Add int a int b for int i 61 1 i i lt lt 61 1 if b amp i for in
  • 深入理解C/C++数组和指针

    版权所有 xff0c 转载请注明出处 xff0c 谢谢 xff01 http blog csdn net walkinginthewind article details 7044380 C语言中数组和指针是一种很特别的关系 xff0c 首
  • 轻松搞定面试中的链表题目

    版权所有 xff0c 转载请注明出处 xff0c 谢谢 xff01 http blog csdn net walkinginthewind article details 7393134 链表是最基本的数据结构 xff0c 面试官也常常用链
  • 轻松搞定面试中的二叉树题目

    版权所有 xff0c 转载请注明出处 xff0c 谢谢 xff01 http blog csdn net walkinginthewind article details 7518888 树是一种比较重要的数据结构 xff0c 尤其是二叉树
  • 动态内存分配(malloc/free)简单实现--隐式空闲链表

    本文使用隐式空闲链表实现简单的动态内存分配 动态内存分配器维护一个大块区域 xff0c 也就是堆 xff0c 处理动态的内存分配请求 分配器将堆视为一组不同大小的块的集合来维护 xff0c 每个块要么是已分配的 xff0c 要么是空闲的 实
  • 二分查找,你真的掌握了吗?

    版权所有 xff0c 转载请注明出处 xff0c 谢谢 xff01 http blog csdn net walkinginthewind article details 8937978 二分查找 xff0c 最基本的算法之一 xff0c
  • 【谷歌面试题】求数组中两个元素的最小距离

    一个数组 xff0c 含有重复元素 xff0c 给出两个数num1和num2 xff0c 求这两个数字在数组中出现的位置的最小距离 O n 时间复杂度 xff0c O 1 空间复杂度 int minDistance int A int si

随机推荐

  • 进程间通信

    原作者地址不详 摘 要 随着人们对应用程序的要求越来越高 xff0c 单进程应用在许多场合已不能满足人们的要求 编写多进程 多线程程序成为现代程序设计的一个重要特点 xff0c 在多进程程序设计中 xff0c 进程间的通信是不可避免的 Mi
  • 通过能观性分析理解SLAM系统的可观维度。

    目录 1 能观性分析大体理解2 可观性定义3 可观性矩阵 1 能观性分析大体理解 什么是能观性分析 xff1f 能观性分析通过计算可观性矩阵 xff0c 分析它的零空间的秩 xff0c 来分析系统哪些状态维度可观 不可观 可观性矩阵对应系统
  • 百度2014移动研发笔试题目——1013清华版

    一 简答题 1 简述计算机的存储系统分为哪几个层次 xff0c 为什么这样的分层能够提高程序的执行效率 2 浮点数在计算中如何表示 xff0c 如何对浮点数判等 3 简述TCP与UDP协议的差别 xff0c 两者与HTTP的关系 并列举HT
  • 史上最全的ubuntu16.04安装nvidia驱动+cuda9.0+cuDnn7.0

    本文参考了 http www cnblogs com 5211314jackrose p 7081020 html https jingyan baidu com article 4853e1e55679491909f726f4 html
  • 4、ORB-SLAM闭环检测之通过词袋寻找当前关键帧和闭环候选帧之间的匹配

    目录 1 SearchByBoW 2 图解每一步实现原理 2 1 通过词袋模型寻找匹配 2 2 通过旋转直方图来筛除离群点 3 期待您加入 前面 我们已经了解到了sim3的求解流程 具体计算过程中有三步比较重要 1 寻找两关键帧之间的粗匹配
  • 基于Web服务的物联网-WoT(Web of Things)

    当我们谈到智能手机 xff0c 多样性 往往不是问题 xff0c 主流市场不是基于苹果IOS系统的就是谷歌的Android系统 xff0c 但即将到来的物联网浪潮 xff0c 智能对象是否也能这样 xff1f 这就复杂多了 xff0c 当前
  • 如何选择 catkin_make和catkin_make_isolated

    问题 在编译cartographer的代码包的时候 xff0c 会被建议使用catkin make isolated xff0c 为何不使用catkin make呢 xff1f 原因 catkin make was the first sc
  • 基于共享内存的分布式消息学习笔记

    作者 xff1a 深圳自研业务组 jimwu 编辑 xff1a 上海业务组 alenai 目录 xff1a Tbus 简介 Tbus 原理 Tbus 配置与工具 Tbus 简单应用 Tbus 运维应用 为 python 扩展 总结 Tbus
  • 分享一下工作以来我看过计算机书籍

    由于自工作依赖一直专注于linux 下的c c 43 43 编程工作 xff0c 所以 xff0c 我的书籍也大的都是这方 这边书尽管很经典 xff0c 但是我的能力实在有限 xff0c 只把数据结构的那点看了一下 xff0c 其他的 看的
  • 51单片机定时器初值计算详解

    前言 xff1a 本文详细介绍了51单片机学习过程中定时器的初值计算问题以及相关概念 xff0c 力求把每一个学习过程中的可能会遇到的难点说清楚 xff0c 并举相关的例子加以说明 学习完毕 xff0c 又顺手利用刚学到定时器的相关知识写了
  • STM32平台下官方DMP库6.12超详细移植教程

    前记 Motion Driver官方库 xff1a Motion Driver 6 12 STM32工程源码 xff1a STM32F103C8 软件MPU6050 xff08 DMP xff09 MPU6050软件I2C驱动 xff0c
  • STM32F103C8-平衡小车笔记

    STM32F103C8 平衡小车笔记 1 PID的作用 xff08 1 xff09 比例项 xff1a 提高响应速度 xff0c 减小静差 xff08 2 xff09 积分项 xff1a 消除稳态误差 xff08 3 xff09 微分项 x
  • 嵌入式Linux系统开发笔记(十四)

    U Boot环境变量 uboot 中有两个非常重要的环境变量 bootcmd 和 bootargs xff0c bootcmd 和 bootagrs 是采用类似 shell 脚本语言编写的 xff0c 里面有很多的变量引用 xff0c 这些
  • 嵌入式Linux系统开发笔记(十五)

    Linux内核启动验证 5 1 编译内核 span class token comment 清除工程 span span class token comment make distclean span span class token co
  • 基于ROS搭建机器人仿真环境

    别人的发复现及经验 https blog csdn net qq 38620941 article details 125321347 gazebo默认仿真环境 1 gazebo models 是系统下gazebo放置模型库的默认位置 2
  • 嵌入式Linux系统开发笔记(十六)

    根文件系统rootfs启动验证测试 接下来我们使用测试一下前面创建好的根文件系统 rootfs xff0c 测试方法使用 NFS 挂载 6 1 检查是否在Ubuntu主机中安装和开启了NFS服务 xff08 特别注意 xff1a nfs 配
  • 安卓5.0以上7.0以下使用Termux

    参考 xff1a https zhuanlan zhihu com p 400507701 说明 xff1a Termux支持5 0以上的安卓系统 Termux7 3版本之后 xff0c 仅支持7 0以上的安卓系统 1 安装Termux 设
  • 关于DSP的CCS6.0平台下的工程搭建(完全可移植)

    本工程以CCS6 0下新建TMS320F28335工程为例 xff0c 其他系列处理器工程搭建类似 xff0c 参考本例即可 工程搭建用到的F2833x TI官方库文件 下载链接 也可直接参考笔者搭建好CCS6 0的工程 下载链接 所建工程
  • STM32Fxx JTAG/SWD复用功能重映射

    问题描述 xff1a 在实验室调车过程中 xff0c 遇到的一个问题 xff1a 为了每次下载程序方便 xff0c 队员们往往会把 Jlink 插在板子上 xff0c 可是在调车过程中发现 xff0c 有时程序会莫名死掉 xff0c 而同样
  • VS2012编译RTKLIB——GNSS定位开源库

    RTKLIB 开源库 有着强大的 GPS 数据实时和后处理功能 xff0c 由于 笔者的毕业设计中需要对GPS 载波相位观测量进行 RTK 解算 xff0c 故而 xff0c 对 RTKLIB 开源库进行了学习与研究 RTKLIB 提供了很