保姆级教程:在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 --version1.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-python22. 依赖库的交叉编译实战
2.1 libusb编译与配置
libusb是USB设备通信的基础库,编译时需要特别注意平台兼容性问题:
- 下载并解压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- 配置编译选项:
./configure CC=arm-linux-gnueabihf-gcc \ --host=arm-linux \ --prefix=$PWD/arm_install \ --disable-udev关键参数说明:
| 参数 | 作用 | 必要性 |
|---|---|---|
| --host | 指定目标平台 | 必须 |
| --prefix | 设置安装目录 | 推荐 |
| --disable-udev | 避免udev依赖 | 可选 |
- 编译并安装:
make -j$(nproc) make install编译完成后,将生成的库文件复制到GPSD源码目录:
cp -r arm_install/lib/* /path/to/gpsd-3.18/2.2 ncurses库的"tic/toe"陷阱解决
ncurses库的交叉编译过程中会遇到tic/toe工具的平台兼容问题,这是最常见的坑点之一。
- 下载并解压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- 配置编译环境:
./configure CC=arm-linux-gnueabihf-gcc \ --host=arm-linux \ --prefix=$PWD/arm_install \ --with-shared- 遇到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/- 完成编译安装:
make -j$(nproc) make install- 处理libtinfo软链接:
cd arm_install/lib ln -s libncurses.so.6 libtinfo.so.6 ln -s libtinfo.so.6 libtinfo.so3. GPSD核心编译与配置
3.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- 创建scons缓存配置文件:
cat > .scons-option-cache <<EOF libgpsmm = False python = False prefix = '/usr/local/gpsd' target = 'arm-linux-gnueabihf' EOF3.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 编译与安装
- 执行编译:
scons -j$(nproc)- 运行测试(可选):
scons check- 安装到目标目录:
scons install- 如果需要USB热插拔支持:
scons udev-install4. 开发板部署与验证
4.1 文件系统准备
将编译生成的文件部署到开发板需要以下步骤:
- 复制可执行文件:
scp /usr/local/gpsd/sbin/gpsd root@开发板IP:/usr/sbin/- 复制依赖库:
scp /usr/local/gpsd/lib/libgps.so.23 root@开发板IP:/usr/lib/- 创建必要的设备节点:
mknod /dev/gps0 c 240 04.2 配置文件调整
GPSD的配置文件通常位于/etc/default/gpsd,基本配置如下:
START_DAEMON="true" GPSD_OPTIONS="-n" DEVICES="/dev/ttyS2" USBAUTO="true"4.3 常见问题排查
- 库版本不兼容:
# 查看缺失的库 ldd /usr/sbin/gpsd # 解决方案 scp /path/to/missing/lib root@开发板IP:/usr/lib/- 权限问题:
# 确保用户有访问设备的权限 chmod 666 /dev/ttyS2- 启动失败:
# 查看详细日志 gpsd -N -D3 /dev/ttyS25. 高级配置与优化
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 GPS5.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