1. gpsd源码下载
地址:https://gpsd.gitlab.io/gpsd/index.html#downloads
点击下面的链接,可以从git库上拉取,也可以直接下载源码压缩包。
压缩包下载地址:http://download-mirror.savannah.gnu.org/releases/gpsd/
我这里下载的是:gpsd-3.18.tar.gz
2. ubuntu 下安装交叉编译工具链以及编译工具scons
1) 确保ubuntu系统已经安装python
2) 安装交叉编译工具链 arm-linux-gnueabihf-gcc
sudo apt-get install gcc-arm-linux-gnueabihf
3) 安装编译工具 scons
scons是linux下的自动构建工具,类似cmake.
sudo apt-get install scons
3. 交叉编译依赖库libusb\libncurses
交叉编译依赖库时使用的交叉编译链是使用AM5728 SDK自带的arm-linux-gnueabihf-gcc,请看环境变量配置:vi ~/.bashrc
交叉编译gpsd,需要安装依赖库 libusb 、libncurses、libtinfo。
(1)安装libusb
- 下载libusb
下载网址:http://sourceforge.net/projects/libusb/files/
我这里下载是:libusb-1.0.22.tar.bz2
2) 交叉编译libusb
将下载好的libusb压缩包解压后进入文件libusb-1.0.22。
执行下列指令:
./configure CC=arm-linux-gnueabihf-gcc --host=arm-linux --prefix=$PWD/arm_install --disable-udev;
CC指定交叉编译工具
–host指定目标主机,linux表示linux平台,arm-linux表示arm平台
–prefix指定安装目录$PWD/arm_install表示在当前目录下的arm_install目录。
为防止报错,–disable-udev ,用于去掉对udev库的依赖。
3) 编译:make
4) 安装:make install
5) 交叉编译生成的库文件目录:
arm_install/lib/
需要将 libusb-1.0.so 等文件压缩打包(有软连接)拷贝至 gpsd源码目录下,gpsd交叉编译时要用到。
6)编译时报错处理
若执行./configure命令时报错,找不到libudev,解决办法如下:
(2)安装libncurses
1) 下载源码包
ncurses库下载地址:http://ftp.gnu.org/pub/gnu/ncurses/
我下载的是
解压缩源码包,进入文件:
2) 执行配置命令:
./configure CC=arm-linux-gnueabihf-gcc --host=arm-linux --prefix=$PWD/arm_install --with-shared
其中:
–prefix 是指定生成文件的路径
–host 指定的是交叉编译工具链的前缀
–with-shared 生成动态库
3) 编译:make (时间较长,耐心等待)
4) 安装:make install
make install 时报错了,错误如下:
(解决办法参考:http://blog.chinaunix.net/uid-22964557-id-5569465.html)
该错误的意思是 进入到目录下ncurses-6.1/progs 下执行 tic 可执行文件时,无法识别文件格式。 使用 file 命令查看一下这个 tic 文件的格式:
发现它是arm平台的,当然无法在pc上运行。
如果pc机上已经安装过ncurses(ncurses是配置内核、根文件系统等需要用到make menuconfig必备的库),那么pc上一定有可以在pc运行的tic。此时,我们find一下tic 。
命令:find / -name “tic”
发现/usr/bin/目录下有tic:
file /usr/bin/tic
这个是x86平台的tic,我们将 /usr/bin下的tic拷贝至 /home/heat/tronlong/debug_tools/gpsd/ncurses-6.1/progs 目录,替换该目录下的tic
返回源码根目录下,继续 make install ,又报错:
无法识别二进制文件 toe。问题和上面的 tic 类似。我们看一下 ncurses-6.1/progs 文件列表:
发现还有好几个可执行文件,索性一次性都从 /usr/bin 下拷贝过来:
返回源码根目录下,继续 make install
最后总算安装成功了。
5) 交叉编译生成的库文件目录:
arm_install/lib/
我这里将生成的 libncurses 相关的文件全部打包后拷贝至 gpsd 源码目录下,然后解压缩,因为libncurses库建立了几个软连接,直接拷贝过去软连接就木有了,所以先压缩后解压缩。
依赖库编译完了,下面就该转战 gpsd 的源码目录下,去编译gpsd了。
(3)安装libtinfo
libtinfo 库是 libncurses 的组成部分,所以建立libtinfo软连接:
还是在ncurses-6.1/arm_install/lib 目录下,执行以下命令:
ln -s libncurses.so.6 libtinfo.so.6
ln -s libtinfo.so.6 libtinfo.so
执行命令后:
将生成的libtinfo库压缩,拷贝至gpsd 的源码目录,然后解压缩。
如果已经将libncurses库拷贝至gpsd 的源码目录,也可以到gpsd 的源码目录下建立libtinfo 的软连接。不必来回拷贝,麻烦。
4. 交叉编译 gpsd
(1)重要操作:首先切换到 root 用户下,然后进入 gpsd源码目录。
确保上面生成的依赖库已经拷贝至源码目录:
(2)可以参考源码目录下的 INSTALL 和 build.txt 文件,里面详细介绍了 gpsd 的交叉编译过程。
Refer INSTALL and build.txt in gpsd source
(3)创建cache 文件
首先创建了cache 文件,该文件一开始并不存在:
vi .scons-option-cache
libgpsmm = False
python = False
prefix = '/home/heat/tronlong/debug_tools/gpsd/gpsd-3.18/bin/gpsd'
target = 'arm-linux-gnueabihf'
target:指定交叉编译工具;
prefix:指定编译生成后的可执行文件路径。
(4)执行编译命令:scons
注意:如果将gpsd配合 ntpd使用,建议加上以下参数进行编译:
scons timeservice=yes nmea0183=yes fixed_port_speed=9600 fixed_stop_bits=1
(编译后的 gpsd 工具依赖 libc-2.27.so,要注意自己的开发板是否将libc库更新到2.27版本,参考资料:https://gpsd.gitlab.io/gpsd/gpsd-time-service-howto.html#_running_gpsd)
Run scons in gpsd source folder
执行成功:
(5)执行命令:scons check
执行该命令报了一些错误,先不管了,不影响install。
(6)执行命令:scons install
执行成功
(7)如果需要USB热插拔功能,执行命令:scons udev-install
参考:
gpsd的启动项在源码文件中也有,有启动项和配置文件,详细阅读!
(8)清除编译的文件等命令在 build.txt文件中可以找到。
scons check、scons install、scons udev-install的功能介绍。
(9)进入编译生成的可执行文件目录:
将sbin目录下的 gpsd可执行文件拷贝至开发板的/bin目录下,执行gpsd –h查看命令是否可以执行。这里拷贝至创龙AM5728开发板上执行: