NXP i.MX8系列平台开发讲解 - 4.1.5 GNSS篇(五) - GPSD 编译(包含交叉编译)详解

news2024/11/15 19:59:35

专栏文章目录传送门:返回专栏目录

Hi, 我是你们的老朋友,主要专注于嵌入式软件开发,有兴趣不要忘记点击关注【码思途远】


文章目录

目录

1. 编译GPSD[Ubuntu]

2. 交叉编译

2.1 解决依赖库编译

2.1.1 libusb 编译

2.1.2 libncurses 编译

2.3 编译gpsd

2.4 板子上运行

3. 问题记录

3.1 stack level too deep

3.2 libncurses 错误:Unable to recognise the format of the input file

4. 总结


当前环境Ubuntu 18.04

CPU:i.MX8MM

参考:build.adoc · master · gpsd / gpsd · GitLab

1. 编译GPSD[Ubuntu]

Index of /releases/gpsd/

Necessary components for any build:

C compilergpsd and client library are written in C
sconsfor executing the build recipe
Python2.x(x>=6) or 3.y(y>=2)for scons and some helper scripts
sudo apt-get install scons

下载源码:

wget https://download-mirror.savannah.gnu.org/releases/gpsd/gpsd-3.25.zip
unzip gpsd-3.25.zip
cd gpsd-3.25

开始编译:

scons && scons check
# if that passes, and you want udev support, not recommended:
scons udev-install

正常来说基本不会有什么错误的!

2. 交叉编译

编译完毕后目录结构记录:

$ nxp/GNSS$ tree -L 1
.
├── gpsd-3.25
├── gpsd-3.25.zip
├── libusb-1.0.22
├── libusb-1.0.22.tar.bz2
├── ncurses-6.1
└── ncurses-6.1.tar.gz
​
3 directories, 3 files
 

从官方来说,支持的平台还是比较丰富的,比如OpenWRT, FreeBSD, NetBSD, Android等等。

Cross-building

依赖:libusb, libncurses, 【这两个是需要交叉编译!!】

2.1 解决依赖库编译

以下是在ubuntu 18.04 环境下编译,在什么版本上编译,问题不大;

2.1.1 libusb 编译

打开 下载libusb https://sourceforge.net/projects/libusb/files/libusb-1.0/libusb-1.0.22/

wget https://sourceforge.net/projects/libusb/files/libusb-1.0/libusb-1.0.22/libusb-1.0.22.tar.bz2
tar -xvf libusb-1.0.22.tar.bz2
cd libusb-1.0.22
configure

指定交叉编译器GCC ,安装目录

./configure CC=你的交叉编译 --host=arm-linux --prefix=$PWD/arm_install --disable-udev
make
make install


​
# 由于这里使用i.mx8mm 交叉编译环境[以下根据自身情况]
source ../../toolchain_sdk/sysroots/armv8a-poky-linux
./configure  --host=arm-linux --prefix=$PWD/arm_install --disable-udev
安装成功:

2.1.2 libncurses 编译

下载源码libncurses

Index of /pub/gnu/ncurses

这里采用6.1 版本

wget https://ftp.gnu.org/pub/gnu/ncurses/ncurses-6.1.tar.gz
tar zxvf ncurses-6.1.tar.gz
cd ncurses-6.1

配置& 编译& 安装

./configure  CC=你的交叉编译GCC --host=arm-linux --prefix=$PWD/arm_install --with-shared
make 
make install
​
​
# 由于这里使用i.mx8mm 交叉编译环境,会设置CC[以下根据自身情况]
source ../../toolchain_sdk/sysroots/armv8a-poky-linux
./configure  --host=arm-linux --prefix=$PWD/arm_install --with-shared
make 
make install

安装成功:

2.3 编译gpsd

wget https://download-mirror.savannah.gnu.org/releases/gpsd/gpsd-3.25.zip
unzip gpsd-3.25.zip
cd gpsd-3.25

将刚刚编译的libusb, libcurese 的库放在当前目录下:

# 打包libusb 库
$ GNSS/libusb-1.0.22/arm_install$ tar czvf libusb_so.tar.gz ./lib/*
./lib/libusb-1.0.a
./lib/libusb-1.0.la
./lib/libusb-1.0.so
./lib/libusb-1.0.so.0
./lib/libusb-1.0.so.0.1.0
./lib/pkgconfig/
./lib/pkgconfig/libusb-1.0.pc
​
# 打包libncurses 库
$ GNSS/ncurses-6.1/arm_install$ tar czvf libncurses-6.1_so.tar.gz ./lib/*
./lib/libform.a
./lib/libform_g.a
./lib/libform.so
./lib/libform.so.6
./lib/libform.so.6.1
./lib/libmenu.a
./lib/libmenu_g.a
./lib/libmenu.so
./lib/libmenu.so.6
./lib/libmenu.so.6.1
./lib/libncurses.a
./lib/libncurses++.a
./lib/libncurses_g.a
./lib/libncurses++_g.a
./lib/libncurses.so
./lib/libncurses.so.6
./lib/libncurses.so.6.1
./lib/libpanel.a
./lib/libpanel_g.a
./lib/libpanel.so
./lib/libpanel.so.6
./lib/libpanel.so.6.1
./lib/terminfo
​
​
# 将上面两个库拷贝至gpsd 目录,并解压

编译【指定安装目录】:

scons timeservice=yes nmea0183=yes fixed_port_speed=9600 fixed_stop_bits=1 prefix=$PWD/arm_install

安装:

scons install

可以看到各个需要使用的东西,将这些可执行文件,库文件放入板子中运行既可。

2.4 板子上运行

简单运行,没有问题,后续添加GNSS 设备测试。

3. 问题记录

3.1 stack level too deep

cd gpsd-3.25/www; (cat hardware-head.html && PYTHONIOENCODING=utf-8 /usr/bin/python gpscap.py && cat hardware-tail.html) > hardware.html
/usr/bin/asciidoctor -b html5 -v -a gpsdweb=https://gpsd.io/ -a gpsdver=3.25 -a docinfo=shared -o gpsd-3.25/www/building.html gpsd-3.25/build.adoc
/usr/bin/asciidoctor -b html5 -v -a gpsdweb=https://gpsd.io/ -a gpsdver=3.25 -a docinfo=shared -o gpsd-3.25/www/installation.html gpsd-3.25/INSTALL.adoc
/usr/bin/asciidoctor -b html5 -v -a gpsdweb=https://gpsd.io/ -a gpsdver=3.25 -a docinfo=shared -o gpsd-3.25/www/README.html gpsd-3.25/README.adoc
/usr/bin/asciidoctor -b html5 -v -a gpsdweb=https://gpsd.io/ -a gpsdver=3.25 -a docinfo=shared -o gpsd-3.25/www/SUPPORT.html gpsd-3.25/SUPPORT.adoc
/usr/bin/asciidoctor -b html5 -v -a gpsdweb=https://gpsd.io/ -a gpsdver=3.25 -a docinfo=shared -o gpsd-3.25/www/AIVDM.html gpsd-3.25/www/AIVDM.adoc
/usr/bin/asciidoctor -b html5 -v -a gpsdweb=https://gpsd.io/ -a gpsdver=3.25 -a docinfo=shared -o gpsd-3.25/www/client-howto.html gpsd-3.25/www/client-howto.adoc
/usr/bin/asciidoctor -b html5 -v -a gpsdweb=https://gpsd.io/ -a gpsdver=3.25 -a docinfo=shared -o gpsd-3.25/www/gpsd-numbers-matter.html gpsd-3.25/www/gpsd-numbers-matter.adoc
/usr/bin/asciidoctor -b html5 -v -a gpsdweb=https://gpsd.io/ -a gpsdver=3.25 -a docinfo=shared -o gpsd-3.25/www/gpsd-client-example-code.html gpsd-3.25/www/gpsd-client-example-code.adoc
stack level too deep
  Use --trace for backtrace
scons: *** [gpsd-3.25/www/gpsd-client-example-code.html] Error 1
scons: building terminated because of errors.

解决办法:

sudo gem update asciidoctor

3.2 libncurses 错误:Unable to recognise the format of the input file

由于使用./progs/中的bin文件都是arm 需要修改

解决办法[将系统的那些文件拷贝至./progs/]:

ls ./progs/
capconvert   clear_cmd.h   infocmp      MKtermsort.sh  reset_cmd.h  tic    tparm_type.c  transform.c  tty_settings.c
clear        clear.sh      infocmp.c    modules        tabs         tic.c  tparm_type.h  transform.h  tty_settings.h
clear.c      dump_entry.c  Makefile     progs.priv.h   tabs.c       toe    tput          tset
clear_cmd.c  dump_entry.h  Makefile.in  reset_cmd.c    termsort.h   toe.c  tput.c        tset.c


# 系统的文件拷贝至./progs/
cp /usr/bin/infocmp /usr/bin/tic /usr/bin/clear /usr/bin/tabs /usr/bin/toe /usr/bin/tput /usr/bin/tset ./progs/
 

4. 总结

本章主要对GPSD 的交叉编译进行操作,中间涉及一些库的编译,期间可能出现的一些问题记录,有些在对于自动驾驶授时方面可能会用上这个gpsd 符合外加授时功能的程序进行时间的统一,有空后续操作并在视频号发布。

参考:

Linux 使用 gpsd 获取 GPS 数据_linux gpsd-CSDN博客

其他玩法:

How to connect an usb GPS receiver with a Linux computer? jack wu ...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2165190.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis的一些通用指令

首先我们需要先连接客户端服务器,此时我们需要通过redis-cli和redis服务器进行交互,输入ping来确保通路的流畅 (一)get和set redis中最核心的两个命令就是get和set,get就是根据key来取出对应value,set就是把…

2024年汉字小达人区级自由报名比赛的真实流程图解——和往年比有一个重大变化

今天是2024年9月25日,上海小学生(和家长)们最关注的赛事之一——美丽汉字中文自修杯第十一届上海市小学生汉字小达人区级自由报名区级比赛正式开始了! 虽然今天才是比赛的第一天,但是很多孩子已经摩拳擦掌开始展示自己…

信息安全工程师(18)常见密码算法

前言 常见的密码算法主要分为三大类:对称加密算法、非对称加密算法和摘要算法。 一、对称加密算法 对称加密算法,又称为秘密密钥算法或单密钥算法,是指加密和解密使用相同密钥的加密方式。这种算法的特点是加密速度快,适用于大量数…

【延时队列的实现方式】

文章目录 延时队列JDK自带的延时队列实现Redis实现延迟队列RabbitMQ 延时队列 延时队列 延时队列是一种特殊类型的队列,它允许元素在特定时间间隔后才能被处理。这种队列在处理具有延迟需求的任务时非常有用,例如定时任务、事件驱动系统等 延时队列在项…

Cannon-es.js编程进阶:复杂形状的碰撞

本文目录 前言最终复杂模型碰撞效果1、碰撞事件及休眠事件1.1 前文回顾及代码整改1.2 效果1.3 监听碰撞事件与休眠1.3.1 碰撞事件collide1.3.2 休眠事件sleepy及sleep2、多个形状的组合物体碰撞2.1 效果3、Trimesh3.1 代码3.2 效果前言 我们在Cannon-es.js基础入门:3D 物理碰撞…

新闻媒体宣发套餐扩大影响力和建立品牌形象方法-华媒舍

在当今互联网时代,营销推广是任何企业必须要面对的挑战。而在众多的营销方式中,精准投放和新闻媒体宣发套餐推广成为了越来越受欢迎的选择。本文将从精准投放和新闻媒体宣发套餐推广两个方面进行科普介绍,解析其背后的重要意义和带来的百倍回…

微软宣布弃用WSUS,企业用户尽早准备替换方案

微软最近宣布将逐步弃用Windows Server Update Services (WSUS),不再为其开发新功能,但会继续支持现有的更新和功能。这一决定对企业客户来说影响深远,尤其是那些依赖WSUS来管理大规模Windows设备更新的组织。 对企业客户的影响 安全性与合规…

如何使用ant design vue的a-select下拉框,实现既能输入内容,也可以下拉选择的效果,apiselect同样适用

修改mode 强烈推荐 代码如下&#xff0c;重点在search和mode <ApiSelectv-if"editableData[record.key]"mode"SECRET_COMBOBOX_MODE_DO_NOT_USE"search"inputinspect":api"problem":params"{projectId:projectId}"showS…

[前端]DOM+CSS+HTML实现水波进度效果

效果展示&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Documen…

PAT甲级-1115 Counting Nodes in a Binary Search Tree

题目 题目大意 给定节点个数&#xff0c;以及每个节点的值&#xff0c;要求构造一棵二叉排序&#xff08;搜索&#xff09;树&#xff0c;并按照规定格式输出最后一层和倒数第二层的节点个数。 思路 二叉排序树的构造方法是递归&#xff0c;但思路类似于二分查找。逐个将n个…

浅克隆与深克隆

1、浅克隆 1.1、什么是浅克隆&#xff1f; 被复制对象的所有变量都含有与原来的对象相同的值&#xff0c;而所有的对其他对象的引用仍然 指向原来的对象(克隆对象与原型对象共享引用数据类型变量)。 如下图所示&#xff1a; 1.2、浅克隆代码实现 类实现接口 Cloneable&#xf…

教育在线答题在线小程序源码系统 PHP+MySQL组合开发源码开源可二次开发 带搭建部署教程

系统概述 教育在线答题在线小程序源码系统是一款专为教育行业设计的&#xff0c;集在线题库管理、智能组卷、在线答题、自动评分、成绩分析等功能于一体的综合性平台。该系统采用PHP作为后端开发语言&#xff0c;结合MySQL数据库进行数据存储与管理&#xff0c;确保了系统的稳…

数据在内存中的存储(下)

目录 前言一、浮点数在内存中的存储1.1 练习1.2 浮点数的存储1.2.1 浮点数存的过程1.2.2 浮点数取的过程 1.3 题目解析 总结 前言 前面一期我们主要说到整形在数据中的存储方式&#xff0c;这期我们来看看浮点数在内存中是如何存储的&#xff0c;话不多说&#xff0c;正文开始…

Proto3 深度解读:Protobuf 的用法与实例分析(C++)

文章目录 1. 前言1.1 序列化和反序列化1.2 什么情况下要进行序列化1.3 部分序列化工具 2. 了解Protobuf2.1 什么是Protobuf2.2 proto 成分2.3 如何编译proto2.4 编译.proto文件后生成的文件都有什么&#xff1f; 3. Protobuf的使用3.1 Protobuf的使用过程3.2 上手编写实例 4. p…

打印沙漏(最蠢的办法)

直接给代码&#xff0c;很好理解的 #include<bits/stdc.h> using namespace std; int s(int b){if(b<1)return 0;if(b2)return 1;for(int i3;i<sqrt(b);i){if(b%i0)return 0;}return 1; } int main(){int n;cin>>n;char c;cin>>c;vector<int>s;…

什么是服务器日志,日志有什么作用?

前言 服务器日志是指服务器等电脑设备或软件的运作记录‌。这些日志记录了服务器接收客户端处理请求的过程以及服务器对这些请求的处理结果。服务器日志对于排查和解决计算机系统和网络应用中的问题至关重要&#xff0c;因为它们包含了用于调试问题的消息、服务器状态以及其他…

深入解析网络通信关键要素:IP 协议、DNS 及相关技术

我的主页&#xff1a;2的n次方_ 1. IP 协议报头结构 4 位版本&#xff1a;表示 IPv4 / IPv6 4 位首部长度&#xff1a;表示 IP 报头的长度&#xff0c;以 4 字节为单位 8 位服务类型&#xff1a;包括 3 位优先权字段&#xff08;已弃用&#xff09;&#xff0c;4 位 TOS 字…

css基础知识(二)

“落座无言行三载&#xff0c;持笔无悔笑苍生&#xff01;” 文章目录 前言文章有误敬请斧正 不胜感恩&#xff01;1. 选择器类型标签选择器类选择器ID选择器通配符选择器复合选择器 2. 元素显示模式块级元素行内元素行内块元素 3. 背景属性4. 字体和文本属性5.垂直居中的实现方…

vue到出excel

安装 npm install exceljs npm install file-saver<template><button click"dade66">导出 66</button> </template><script> import ExcelJS from exceljs; import { saveAs } from file-saver;export default {data() {return {data…

Unity多语言插件I2 Localization国际化应用

【就不收费了&#xff0c;要个关注不过分吧】 【图片来自插件官网&#xff0c;侵删】 前言 目前游戏往往都不会仅局限于国内语言&#xff0c;为了适应产品都要做国际化适配&#xff0c;因此会用到这个插件&#xff0c;这个插件要付费&#xff0c;因此请前往unity官网进行下载…