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动态库编译的主要内容,如果未能解决你的问题,请参考以下文章

RTKLIB编译及RTCM数据读取样例

VS2015编译rtklib2.4.2

Eclipse 动态库调试(联合调试)

rtklib代码阅读与调试

Windows环境下的RTKPlot_Qt版本编译时遇到的问题和解决方法

是否可以动态编译和执行 C# 代码片段?