一
基于VS2008利用rtklib开源代码处理GPS以及北斗数据详解
1、在vs中新建一个控制台项目(含预编译头);
2、在建好的项目中添加rtklib.h以及需要用到的source文件(.c文件),然后将.c改为.cpp并在每个文件首句增加一行#include "stdafx.h",当然在stdafx.h文件中添加#include "rtklib.h"; 这样编译基本可以通过了;
3、一般而言,我们不会需要用到rtklib程序集中的所有文件,只是需要部分。比如我需要用到其中的pntpos这个标准单点定位函数,这个时候就需要添加该函数所在实现文件(pntpos.c)。于是添加了这个文件。但是一般而言,只添加这一个可能不能解决问题,因为rtklib的各个文件之间并不是完全独立,pntpos文件中某些函数可能会调用到其他文件中实现的函数。于是需要再把相关文件添加到工程中。对于这个问题,可以根据自己添加的文件,编译时候的提示,依次添加进来相应文件。这样可以解决fatal error的问题;
4、在添加完成后,可能会遇到一些其他问题。主要问题有:
a.关于某些地方数组越界或为空(主要是glonass),这个时候,查看rtklib.h头文件,可以发现关于系统启用的#define语句,其中除GPS系统外,其他系统数目都是0,解决的办法主要是注释掉这个判断语句。注释掉rtklib.h文件的自第146行后开始的关于启用其他卫星导航系统的语句,如GLONASS:
//#else
//#define MINPRNGLO 0
//#define MAXPRNGLO 0
//#define NSATGLO 0
//#define NSYSGLO 0
//#endif
b.关于很多地方会出现const char*与char*的不能转化问题,这个很简单,在相应地方进行强制转化就行。
c.还存在字符集采用的问题,这个只需要在项目属性中使用多字节字符集即可(见下图)。
d.关于某些函数存在未实现的问题,这个时候,可以网上直接搜索那些没有实现的函数,进行替换,或是直接屏蔽掉。
rtklib中代码的添加工作基本就这些问题,解决后应该就可以使用了
相关文章地址:https://www.cnblogs.com/DKSoft/p/4677381.html
这篇介绍了VS2008平台下创建一个C++控制台程序,编译rtklib源码的过程,创建时含预编译头,另外麻烦的将.c文件都改为.cpp文件,还取巧通过注释程序的方法避免一些问题,总的来说没有针对性解决问题,借鉴意义不大。
二
学习rtklib时,作者在manual中说过,可以用gcc重建CUI程序。因此选择Visual Studio来重建,VS比C++ Builder好用,且网上的资源也多得多。
1. 首先在vs2013中新建一个win32的dll项目,取消预编译头。,将rtklib下src源码放到工程路径下(注意不是工程组所在路径),如E:\Projects\rtklib-rebuild\src
2. 在项目上添加一个文件夹rtklibsrc然后在文件夹上【添加现有项目】把src中另外的源文件下文件加入工程。在rtklib-rebuild下建立rcv文件夹把原src\rcv下面的文件也添加到工程。创建的工程如下图所示:
然后我们尝试执行编译。
首次编译会与很多错误,我第一次编译时提示了大量的:无法打开包括文件:“rtklib.h”的错误,这是因为没有将rtklib.h头文件的目录包含在项目里的缘故。
解决思路就是将以下路径加入到include目录下(在项目上右键->配置属性->VC++目录->包含目录Include Path选择rtklib.h所在的目录即可)。
再次编译,上述错误不再提示。但还存在以下三个错误:
首先是一个这样的错误:
error C2466: 不能分配常量大小为0的数组 x:\xxxx\rtklibhelper\rtklibsrc\rinex.c
这个错误我们来看一下, 在[MAXPRNGLO]上面按F12,看他的定义处。
这个常量为0,那么不能进行编译,我们需要在预编译器里面加入 ENAGLO
网上的教程是:项目上右键->c/c++ ->预处理器->添加ENAGLO。
再次编译发现上述问题确实消失了。但是会出现以下新的问题。。。。。。
error LNK2019: 无法解析的外部符号 _settspan,该符号在函数 _postpos 中被引用 x:\xxxx\ xxxx \postpos.obj
error LNK2019: 无法解析的外部符号 _showmsg,该符号在函数 _convrnx 中被引用 x:\xxxx\ xxxx \convrnx.obj
error LNK2019: 无法解析的外部符号 __imp__timeGetTime@0,该符号在函数_tickget 中被引用 x:\xxxx\ xxxx \rtkcmn.obj
error LNK2019: 无法解析的外部符号 __imp__accept@12,该符号在函数 _accept_nb 中被引用 x:\xxxx\ xxxx \stream.obj
解决思路可通过在添加附加库[连接器->输入->附加依赖库]添加winmm.lib, ws2_32.lib ;在预处理器里面加入DLL,来解决此问题。
最终其预编译器