三
RTKLIB编译—形成GNSS定位开源库,RTKLIB开源库有着强大的GPS数据实时和后处理功能,RTKLIB还提供了很多底层的函数,因此我们可以考虑采用直接对源码进行编译输出标准DLL的方式供C调用。便编译平台选择VS,RTKLIB库用的是网上开源的rtklib_2.4.3版本,编译的项目采用“相对路径”,即工程可移植到任何地方,方便以后使用。
RTKLIB的下载地址为:http://www.rtklib.com/
1、新建工程。首先,我们在VS2012下先新建一个win32的dll项目(空项目)
2、复制库文件。把在github上下载的rtklib2.4.3里的 “src文件夹”文件复制到刚刚建立的RTKLIB工程项目文件所在目录下
3、添加库文件。为了与库文件结构保持一致,我们首先在“源文件”文件夹,右击—》添加—》新建筛选器,接下来先添加头文件rtklib.h;然后是源文件—》添加—》现有项(添加除rtklib.h所有源文件,)创建“rcv”子文件夹并添加“src/rcv”目录下的所有源文件。
4、初步编译。“解决方案管资源理器”下,右击“RTKLIB”项目—》生成,进行编译。因为RTKLIB是在C++ Builder编译器下写的,但是我们现在用VS进行编译,会出现一堆的错误,现在我们就一个个来解决。
错误类型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】
错误类型2: error C2466: 不能分配常量大小为 0 的数组
解决:这个主要是编译器的问题,用g++就没有问题,在vc中定义数组,需要一个常量值。
我们双击此错误,在有问题的数组定义处,按F12,看到数组大小定义的确实是0。我们像上面一样在“预处理器定义”里面加入【ENAGLO】可解决此问题。
错误类型3:error C1083: 无法打开包括文件:“rtklib.h”: No such file ordirectory
解决:这是因为rcv里的文件找不到rtklib.h这个头文件。我们继续在项目属性里,在配置属性-> C/C++ 常规-> 附加包含目录-> 编辑 。在上面添加rtklib.h的相对路径(使用相对路径,工程才可以移植到任何地方,否则,换个目录路径,还是会提示此错误)在项目里的src找到rtklib.h并查看它的绝对路径,在属性界面下的“附加包含目录”下,添加:【.\src】
错误类型4:error LNK2019: 无法解析的外部符号 _showmsg,该符号在函数 _convrnx 中被引用
解决:一查showmsg这个函数如果在DLL中需要自己定义,rtklib里面已经做好了处理需要在预处理器里面加入【DLL】即可,我们找到之前预处理器定义处,在下面添加【DLL】,再找到项目属性,在配置属性 -> 链接器 -> 输入 -> 附加依赖项里添加 【winmm.lib】和 【ws2_32.lib】
部分警告处理。大多数是什么类型转换上的Warning,暂时没有影响,暂不处理
同样按照这篇文章的操作步骤仍然无法成功将rtklib编译为一个dll库文件,问题仍出在:
看了几篇文章试了几种方法这个问题一直无法得到解决。
经过与文章四对比发现,解决这个问题的关键就在于将RTKLIB-rtklib_2.4.3\app\rnx2rtkp文件夹下的rnx2rtkp.c文件放到项目的src文件夹下并加入到工程。再次编译错误就会得到解决。
转载本文请联系原作者获取授权,同时请注明本文来自尚正辉科学网博客。
链接地址:https://wap.sciencenet.cn/blog-3386358-1138019.html?mobile=1
收藏