当前位置: 首页 > news >正文

保姆级教程:在Ubuntu上为AM5728开发板交叉编译GPSD 3.18(附libusb/ncurses依赖库完整配置)

AM5728开发板GPSD 3.18交叉编译实战:从依赖库配置到避坑指南

在嵌入式Linux开发中,GPSD作为一款开源的GPS数据解析服务,能够将原始GPS数据转换为标准格式,为定位应用提供统一接口。然而在为AM5728这类ARM架构开发板进行交叉编译时,依赖库的配置往往成为拦路虎。本文将手把手带你完成GPSD 3.18的完整编译过程,特别针对libusb和ncurses等依赖库的"坑点"提供解决方案。

1. 环境准备与工具链配置

1.1 基础开发环境搭建

在Ubuntu 20.04 LTS系统上,首先需要安装必要的编译工具和交叉编译器:

sudo apt update sudo apt install -y build-essential python2.7

对于AM5728开发板,推荐使用TI官方提供的SDK中的工具链。如果使用系统自带工具链,安装命令如下:

sudo apt install -y gcc-arm-linux-gnueabihf

验证工具链是否安装成功:

arm-linux-gnueabihf-gcc --version

1.2 Scons构建工具安装

GPSD使用Scons作为构建系统,安装命令如下:

sudo apt install -y scons

注意:虽然GPSD 3.18官方文档推荐使用Python 2.7,但新版本已支持Python 3。如果遇到兼容性问题,可以通过以下命令安装Python 2.7:

sudo apt install -y python2.7 python-is-python2

2. 依赖库的交叉编译实战

2.1 libusb编译与配置

libusb是USB设备通信的基础库,编译时需要特别注意平台兼容性问题:

  1. 下载并解压libusb源码:
wget https://downloads.sourceforge.net/project/libusb/libusb-1.0/libusb-1.0.22/libusb-1.0.22.tar.bz2 tar -xjf libusb-1.0.22.tar.bz2 cd libusb-1.0.22
  1. 配置编译选项:
./configure CC=arm-linux-gnueabihf-gcc \ --host=arm-linux \ --prefix=$PWD/arm_install \ --disable-udev

关键参数说明:

参数作用必要性
--host指定目标平台必须
--prefix设置安装目录推荐
--disable-udev避免udev依赖可选
  1. 编译并安装:
make -j$(nproc) make install

编译完成后,将生成的库文件复制到GPSD源码目录:

cp -r arm_install/lib/* /path/to/gpsd-3.18/

2.2 ncurses库的"tic/toe"陷阱解决

ncurses库的交叉编译过程中会遇到tic/toe工具的平台兼容问题,这是最常见的坑点之一。

  1. 下载并解压ncurses源码:
wget https://ftp.gnu.org/pub/gnu/ncurses/ncurses-6.1.tar.gz tar -xzf ncurses-6.1.tar.gz cd ncurses-6.1
  1. 配置编译环境:
./configure CC=arm-linux-gnueabihf-gcc \ --host=arm-linux \ --prefix=$PWD/arm_install \ --with-shared
  1. 遇到tic工具错误的解决方案:

当执行make install时,会报错提示tic工具无法执行。这是因为生成的tic是ARM架构的,无法在x86主机上运行。解决方法如下:

# 查找系统自带的x86版本tic find /usr -name "tic" # 复制到ncurses源码目录 cp /usr/bin/tic ./progs/ cp /usr/bin/toe ./progs/ cp /usr/bin/infocmp ./progs/
  1. 完成编译安装:
make -j$(nproc) make install
  1. 处理libtinfo软链接:
cd arm_install/lib ln -s libncurses.so.6 libtinfo.so.6 ln -s libtinfo.so.6 libtinfo.so

3. GPSD核心编译与配置

3.1 源码准备与配置

  1. 下载GPSD 3.18源码:
wget http://download-mirror.savannah.gnu.org/releases/gpsd/gpsd-3.18.tar.gz tar -xzf gpsd-3.18.tar.gz cd gpsd-3.18
  1. 创建scons缓存配置文件:
cat > .scons-option-cache <<EOF libgpsmm = False python = False prefix = '/usr/local/gpsd' target = 'arm-linux-gnueabihf' EOF

3.2 编译选项详解

GPSD提供了丰富的编译选项,根据实际需求进行配置:

scons timeservice=yes \ # 启用时间服务 nmea0183=yes \ # 支持NMEA 0183协议 fixed_port_speed=9600 \ # 设置默认串口波特率 fixed_stop_bits=1 # 设置停止位

常用选项说明:

  • dbus:是否启用DBus支持
  • bluez:蓝牙GPS设备支持
  • qt:Qt绑定支持
  • strip:是否剥离调试符号

3.3 编译与安装

  1. 执行编译:
scons -j$(nproc)
  1. 运行测试(可选):
scons check
  1. 安装到目标目录:
scons install
  1. 如果需要USB热插拔支持:
scons udev-install

4. 开发板部署与验证

4.1 文件系统准备

将编译生成的文件部署到开发板需要以下步骤:

  1. 复制可执行文件:
scp /usr/local/gpsd/sbin/gpsd root@开发板IP:/usr/sbin/
  1. 复制依赖库:
scp /usr/local/gpsd/lib/libgps.so.23 root@开发板IP:/usr/lib/
  1. 创建必要的设备节点:
mknod /dev/gps0 c 240 0

4.2 配置文件调整

GPSD的配置文件通常位于/etc/default/gpsd,基本配置如下:

START_DAEMON="true" GPSD_OPTIONS="-n" DEVICES="/dev/ttyS2" USBAUTO="true"

4.3 常见问题排查

  1. 库版本不兼容
# 查看缺失的库 ldd /usr/sbin/gpsd # 解决方案 scp /path/to/missing/lib root@开发板IP:/usr/lib/
  1. 权限问题
# 确保用户有访问设备的权限 chmod 666 /dev/ttyS2
  1. 启动失败
# 查看详细日志 gpsd -N -D3 /dev/ttyS2

5. 高级配置与优化

5.1 与NTPD的时间同步配置

要启用GPSD的时间服务功能,需要在编译时开启timeservice选项,并在开发板上配置:

# ntp.conf配置 server 127.127.28.0 minpoll 4 maxpoll 4 fudge 127.127.28.0 time1 0.420 refid GPS

5.2 性能优化参数

在资源受限的嵌入式系统中,可以通过以下参数优化GPSD性能:

scons dbus=no \ # 禁用DBus bluez=no \ # 禁用蓝牙 qt=no \ # 禁用Qt strip=yes # 剥离调试符号

5.3 自定义输出格式

GPSD支持多种输出格式,可以通过cgps或gpsmon工具查看:

# JSON格式输出 gpsd -N -D2 -F /var/run/gpsd.sock

在实际项目中,GPSD的稳定运行往往需要结合硬件特性进行调整。例如在AM5728平台上,UART接口的时钟配置会影响GPS数据的接收稳定性。建议在系统启动脚本中加入以下命令:

# 设置UART时钟 devmem2 0x48020000 w 0x00000030 devmem2 0x48020070 w 0x00000000
http://www.jsqmd.com/news/689565/

相关文章:

  • 避开Latex!用Word向ACM会议投稿的完整攻略:从模板适配到TAPS最终提交
  • 智能合约开发框架对比
  • 别再只盯着运放了!用TI INA826这类仪表放大器搞定传感器信号调理,实测避坑指南
  • 从入门到精通:AI产品经理的完整学习指南与实战路径
  • 告别Grbl依赖:手把手教你用STM32CubeMX和emWin搭建带U盘脱机功能的CNC控制界面
  • 电荷泵在嵌入式系统中的应用:从LCD驱动到EEPROM编程
  • IGBT驱动信号里的‘空白时间’:手把手教你分析SVPWM/SPWM中的死区效应与谐波
  • Spring Boot Admin Server 2.3.1 保姆级搭建教程:从零到UI界面,含Spring Security安全配置避坑指南
  • ADS负载牵引实战:从CGH40010F管子的1.6GHz仿真到稳定电路设计,一步步教你优化PA性能
  • 【2026年最新600套毕设项目分享】微信小程序的酒店管理系统(30147)
  • 虾皮 大数据开发工程师面试题精选:10道高频考题+答案解析(附PDF)
  • 别再傻傻分不清了!一文讲透增量式与绝对式编码器到底怎么选(附选型避坑指南)
  • C#借助EPPlus高效处理海量Excel数据:从导入到写入的实战解析
  • FeNOMS架构:存储内计算加速质谱数据分析
  • 2026年最新|手把手教你用EasyClaw PPT大师:免费一键生成PPT,告别手动排版
  • Excel实战:用PCA给你的客户数据‘瘦身’,5步完成特征筛选与可视化
  • 量子储层计算在对抗鲁棒性中的优势与应用
  • 【NASA/JPL/ISO联合认证配置包首发】:C内存安全2026规范工业级部署套件(含SAST白名单规则集+运行时hook注入检测模块+审计报告自动生成脚本)
  • 别再只改hosts了!RocketMQ Broker启动时指定conf文件的正确姿势(解决连接失败)
  • RTX 3050 Ti显卡玩转PyTorch:如何为特定版本(如1.12)精准匹配CUDA 11.3环境
  • 你用的ChatGPT,99%的“努力”都在你根本看不见的地方
  • 保姆级教程:手把手教你优化SA8155 QNX系统启动时间(从32ms到秒级)
  • FHE-SQL全同态加密数据库性能优化实战
  • 云顶之弈悬浮助手:提升你的策略决策效率
  • 从Java到前端:一名全栈开发者的成长之路
  • 抖音无水印下载神器:GitHub_Trending/do/douyin-downloader终极使用指南
  • CRNN里的CTC Loss到底是咋工作的?用‘连连看’和‘消消乐’给你讲明白
  • 2026年AI生成PPT横评:5款工具实测,哪个最好用?
  • 开发环境救星:把整套Win+Linux+MySQL服务塞进移动固态硬盘,随插随用还能内网穿透
  • Unity URP角色头发渲染避坑指南:从面片建模到深度排序的完整流程