Eclipse框架下rtklib动态库编译
Posted 远方的驼队
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Eclipse框架下rtklib动态库编译相关的知识,希望对你有一定的参考价值。
1、前言
RTKLIB是全球导航卫星系统GNSS(global navigation satellite system)的标准&精密定位开源程序包,包含了丰富的导航定位算法应用、通信协议接口和各类函数库API,具体内容可参考笔者博文《RTKLIB编译及RTCM数据读取样例》。
目前网络上流传的rtklib动态库编译博文多是基于Microsoft Visual Studio框架,这主要是由于国人习惯于使用微软Windows操作系统的缘故,而rtklib本质上是一个跨平台的导航定位库,其在Linux或Unix系统下运行更为稳健,且编译开发难度更容易。因此,笔者在Eclipse框架下对rtklib动态库编译问题进行了研究,并给出若干实用样例,供导航算法研究人员和软件研发人员参考。
2、基于Eclipse框架的rtklib编译
基于Eclipse框架的rtklib编译的第一步是搭建编译环境,笔者使用的操作系统是Ubuntu18.04桌面版,使用的IDE版本是Eclipse Oxygen.3a Release(4.7.3a),具体编译环境开发人员可根据需要做相应调整,在此不在赘述。
搭建好IDE编译环境后,即可进行代码编译工作,具体步骤如下:
(1)创建Project。在Eclipse IDE环境中新建一个C Managed Build工程,填写工程名和工程保存路径,选择项目类型和编译工具,填写工程基本信息,设定工程配置信息,如图1至图4所示。笔者在构建工程时将项目命名为rtklibdemo,选择了Hello World ANSI C Project可执行程序模板和linux GCC编译器,项目配置属性采用IDE默认属性,暂未做更改,后续根据编译需要再做相应调整。初学者可仿照处理,也可预先配置Advanced settings的相应选项。
图1 新建C Managed Build工程
图2 设置工程名、工程路径、项目类型和编译器
图3 设置项目基本信息
图4 设置项目配置信息
(2)导入rtklib源文件。rtklib源文件目前在Github上有两个分支,最新的版本分别是rtklib 2.4.3 b29版本(更新日期为2017/09/02)和rtklib 2.4.2 p13版本(更新日期为2018/01/30),其中rtklib 2.4.2版本包含PPP定位导航算法的相关源码,开发人员可根据需要自行选择。完成下载后,在Eclipse项目工程src文件夹标签下右键选择导入源文件,在弹出的界面框中选择File System,定位到rtklib源文件文件夹,选择所有的c文件,点击Finish按钮即可,如图5、6所示。
图5 配置导入资源
图6 导入rtklib源文件
(3)编译rtklib。完成源文件导入后,点击编译Eclipse IDE会提示“fatal error:rtklib.h:No such file or directory”错误,如图7所示。原因是rtklib源码中将各个厂家的数据解码函数统一存放在rcv文件夹中,与头文件rtklib不在同一文件夹,笔者采用的更正策略是将rcv文件夹中的所有c文件的#include “rtklib.h”统一更新为#include “../rtklib.h”以规避头文件路径错误的问题,如图8所示。
图7 rtklib.h头文件路径错误
图8 rtklib.h头文件路径错误解决方案
再次点击编译Eclipse IDE会提示“undefined reference to ‘tan’”等数学函数定义不存在错误,“undefined reference to ‘pthread_creat’”等线程函数定义不存在错误以及“undefined reference to ‘showmsg’”等函数不存在错误,如图9、10所示。
图9 数学函数与线程函数定义不存在错误
图10 “undefined reference to ‘showmsg’”等函数不存在错误
“数学函数定义不存在错误”是由于gcc编译器在编译时缺少libm,解决方案是在链接库中添加m库,如图11所示。
图11 “数学函数定义不存在错误”解决方案
“线程函数定义不存在错误”是由于pthread不是Linux下的默认的库,在链接的时候,无法找到phread库中哥函数的入口地址,链接失败。解决方案是在gcc编译是添加-lpthread参数,具体到Eclipse IDE即在GCC C Compiler的Miscellaneous选项卡和GCC C Linker的General选项卡中勾选“Support for pthread (-lpthread)”选项,如图12、13所示。
图12 GCC C Compiler -lpthread参数配置
图13 GCC C Linker -lpthread参数配置
“undefined reference to ‘showmsg’”等函数不存在错误是由于在编译前没有预定义“DLL”标识,从而导致函数无法正常编译。解决方案是在GCC C Compiler的Preprocessor选型卡中的Defined symbols中添加DLL预定义标识,如图14所示。(注:后续可采用类似的操作预定义ENAGLO、ENACMP、TRACE等调整rtklib库的功能范围。)
图14 “undefined reference to ‘showmsg’”等函数不存在错误解决方案
再次点击编译Eclipse IDE会提示编译成功,表明rtklib动态库编译基本完成,可在此基础上调用相关接口。
3、应用实例
完成了Eclipse IDE环境下rtklib编译后,笔者调用了rtklib中封装的串口通信的接口函数,实现了简单的串口数据通信功能,代码如下:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include "rtklib.h" 4 5 int main(void) { 6 int opt[8] = { 10000, 10000, 1000, 32768, 10, 1000, 30, 0 }; 7 int strs[1] = { STR_SERIAL }; 8 double nemapos[3] = { 0 }; 9 char *path[8],*cmd[4]={0},*cmds_p[4]={0}; 10 strconv_t *conv[4] = { 0 }; 11 12 strsvr_t *svr = (strsvr_t *)malloc(sizeof(strsvr_t)); 13 for (int i = 0; i < 8; i++) 14 path[i] = (char*)malloc(sizeof(char) * 1024); 15 16 printf("please input the device name:"); 17 scanf("%s",path[0]); 18 19 strsvrinit(svr, 0); 20 strsvrstart(svr, opt, strs, path, conv, cmd, cmds_p, nemapos); 21 22 unsigned int npb0 = 0; 23 while(1) 24 { 25 strlock(&svr->stream[0]); 26 for (unsigned int i = 0; i < svr->stream[0].inb - npb0; i++) 27 { 28 printf("%c", svr->buff[i]); 29 } 30 if (npb0 < svr->stream[0].inb){ 31 npb0 = svr->stream[0].inb; 32 } 33 34 strunlock(&svr->stream[0]); 35 sleepms(1); 36 } 37 return EXIT_SUCCESS; 38 }
以上是关于Eclipse框架下rtklib动态库编译的主要内容,如果未能解决你的问题,请参考以下文章