在卫星导航与定位领域中,一方面,现有程序或商业软件往往存在或多或少的不足,不能完全满足研究者的需要;另一方面,独立开发新的程序软件,对于初学者来讲过于困难,且研究者也往往会陷入基本、琐碎的代码编译工作中,只见树木不见森林。因此在开源软件上做二次开发无疑是一个极佳的选择。
RTKlib由日本东京海洋大学开发,软件用面向过程的C语言开发完成,并提供多个API函数接口方便用户进行调用。它是卫星导航与定位领域研究者常用来做二次开发的开源软件之一。
作为卫星导航与定位领域的入门级小白,作者需要学习RTKlib源代码并在其上做二次开发。但在网上查阅资料,发现现有RTKlib调试教程多是基于Visual Studio 2010和Visual Studio 2013版本,为了方便后来人在使用RTKlib时减少不必要的麻烦,作者参考上述教程,编写了基于Visual Studio 2017平台的RTKlib代码调试教程。本文参考的教程均在致谢部分罗列出来了,在此向他们表示感谢,“分享带来快乐,交流带来进步”。由于时间紧急,肯定会存在一些错误未被发现,欢迎各位交流。下面奉上干货。
(1)在Visual Studio 2017下新建项目,选择Windows控制台应用程序,项目所在路径自己选择,路径记为*\,项目命名为rtklib;
(2)解压RTKLIB-rtklib_2.4.3安装包,将安装包下src文件夹复制到*\rtklib\rtklib\,并重命名为rtklibsrc;
(3)在界面左侧右击rtklib项目,选择“添加”-“新建筛选器”,右击新建的筛选器并重命名为rtklibsrc;同样的,右击rtklibsrc,创建新的筛选器并命名为rcv;
(4)右击rtklibsrc,选择“添加”-“现有项”,* \rtklib\rtklib\rtklibsrc\,全选所有的.c文件,点击“添加”,同样地,将* \rtklib\rtklib\rtklibsrc\rcv下所有的.c文件添加到(3)中新建的rcv下;
(5)右击rtklib项目,选择“属性”,找到“预编译头”,在右侧选择“不使用预编译头”,点击确定;删除pch.h头文件,删除rtklib.cpp开头的#include “pch.h”行,删除pch.cpp;
(6)Ctrl+F5运行程序,程序报错,要么按照说明中将fopen等对应改成fopen_s等,要么右击rtklib项目,选择“属性”,找到“预处理器”-“预处理器定义”,点击编辑,加上“_CRT_SECURE_NO_WARNINGS”,点击“确定”退出;
(7)Ctrl+F5运行程序,程序报错:C4133 “函数”:从“const char*”到“LPCWSTR”的类型不兼容。报错位置在download.c中,双击报错语句定位到download.c中报错位置,首先在文件头部分添加#include
(8)Ctrl+F5运行程序,程序报错:C1083 无法打开包括文件:rtklib.h: No such file or directory。此时,仍右击rtklib项目,选择“属性”-“常规”-“附加包含目录”,编辑选择*\rtklib\rtklib\rtklibsrc,例如笔者的路径为E:\PPP\program\RTKlib\rtklib\rtklib\rtklibsrc;点击确定退出。
(9)Ctrl+F5运行程序,程序报错:C4996 ‘inet_addr’:Use inet_pton() or InetPton() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings;类似(6),在“预处理器定义”中添加_WINSOCK_DEPRECATED_NO_WARNINGS,点击确定退出。
(10)Ctrl+F5,程序报错:C4703 使用了可能未初始化的本地指针变量”sbs”。有两种办法:一、在报错的ephemeris.c的文件中定义“const sbssatp_t *sbs=NULL;”;二、项目“属性”-“C/C++”-“所有选项”-“SDL检查”-“否”。
(11)还有一个重要事项,必须要把rtklib.h头文件包含于rtklib.cpp中:
#include
(12)Ctrl+F5,程序报错:LNK2019 无法解析的外部符号_showmsg,该符号在函数_convrnx中被引用;LNK2001 无法解析的外部符号_showmsg。在网上能查到一些方法,比如“属性”-“C/C++”-“预处理器”-“预处理器定义”中添加DLL,但是Vs2017编译仍没有解决问题。本文采用了另一种办法,在主函数所在的rtklib.cpp的main()函数前面定义showmsg()函数:
extern int showmsg(char* format, …)
{
va_list arg;
va_start(arg, format);
vfprintf(stderr, format, arg);
va_end(arg);
fprintf(stderr, “\r”);
return 0;
}
(13)Ctrl+F5,程序报错:LNK2019 无法解析的外部符号_settspan,该符号在函数_postpos中被引用;LNK2019 无法解析的外部符号_settime,该符号在函数_inputobs中被引用。解决方案和(11)类似,同样在rtklib.cpp的main()函数前面定义settspan()函数和settime()函数:
extern void settspan(gtime_t ts, gtime_t te){}
extern void settime(gtime_t time){}
(14)Ctrl+F5,程序报错:LNK2019 无法解析的外部符号_imp_timeGetTime@0,该符号在函数_tickget中被引用。有两种解决方案:一,“属性”-“链接器”-“输入”-“附加依赖项”,添加winmm.lib和ws2_32.lib;二,在rtklib.cpp的文件头部分加上:
#pragma comment (lib,“winmm.lib”)
#pragma comment (lib,“ws2_32.lib”)
(15)Ctrl+F5,屏幕出现“Hello! Welcome to GNSS!”!下面就可以开始编写自己的函数了!
致谢:本教程参考了
https://blog.csdn.net/qq_38335172/article/details/77620362
https://blog.csdn.net/zhangtao_heu/article/details/79536427
https://zhidao.baidu.com/question/1574192061434152540.html
https://blog.csdn.net/m0_37362454/article/details/82453545
https://blog.csdn.net/longxing525/article/details/79427460
第一幅图片选自微信公众号-“不迷途导航程序员”中迷途兄的文章《RTKLIB源码阅读笔记》