Linux-交叉编译-gpsd

1. gpsd源码下载

地址:https://gpsd.gitlab.io/gpsd/index.html#downloads
Linux-交叉编译-gpsd
点击下面的链接,可以从git库上拉取,也可以直接下载源码压缩包。
Linux-交叉编译-gpsd
Linux-交叉编译-gpsd

压缩包下载地址:http://download-mirror.savannah.gnu.org/releases/gpsd/

Linux-交叉编译-gpsd
Linux-交叉编译-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
Linux-交叉编译-gpsd
交叉编译gpsd,需要安装依赖库 libusb 、libncurses、libtinfo。

(1)安装libusb

  1. 下载libusb
    下载网址:http://sourceforge.net/projects/libusb/files/

Linux-交叉编译-gpsd
我这里下载是:libusb-1.0.22.tar.bz2

Linux-交叉编译-gpsd
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/

Linux-交叉编译-gpsd
需要将 libusb-1.0.so 等文件压缩打包(有软连接)拷贝至 gpsd源码目录下,gpsd交叉编译时要用到。

6)编译时报错处理
若执行./configure命令时报错,找不到libudev,解决办法如下:

Linux-交叉编译-gpsd
Linux-交叉编译-gpsd
(2)安装libncurses

1) 下载源码包
ncurses库下载地址:http://ftp.gnu.org/pub/gnu/ncurses/
我下载的是
Linux-交叉编译-gpsd
解压缩源码包,进入文件:
Linux-交叉编译-gpsd
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 时报错了,错误如下:
Linux-交叉编译-gpsd
(解决办法参考:http://blog.chinaunix.net/uid-22964557-id-5569465.html

该错误的意思是 进入到目录下ncurses-6.1/progs 下执行 tic 可执行文件时,无法识别文件格式。 使用 file 命令查看一下这个 tic 文件的格式:
Linux-交叉编译-gpsd
发现它是arm平台的,当然无法在pc上运行。
如果pc机上已经安装过ncurses(ncurses是配置内核、根文件系统等需要用到make menuconfig必备的库),那么pc上一定有可以在pc运行的tic。此时,我们find一下tic 。

命令:find / -name “tic”
发现/usr/bin/目录下有tic:
file /usr/bin/tic
Linux-交叉编译-gpsd
这个是x86平台的tic,我们将 /usr/bin下的tic拷贝至 /home/heat/tronlong/debug_tools/gpsd/ncurses-6.1/progs 目录,替换该目录下的tic
Linux-交叉编译-gpsd

返回源码根目录下,继续 make install ,又报错:

Linux-交叉编译-gpsd
无法识别二进制文件 toe。问题和上面的 tic 类似。我们看一下 ncurses-6.1/progs 文件列表:

Linux-交叉编译-gpsd
发现还有好几个可执行文件,索性一次性都从 /usr/bin 下拷贝过来:
Linux-交叉编译-gpsd
返回源码根目录下,继续 make install

Linux-交叉编译-gpsd
最后总算安装成功了。

5) 交叉编译生成的库文件目录:
arm_install/lib/
Linux-交叉编译-gpsd
我这里将生成的 libncurses 相关的文件全部打包后拷贝至 gpsd 源码目录下,然后解压缩,因为libncurses库建立了几个软连接,直接拷贝过去软连接就木有了,所以先压缩后解压缩。

Linux-交叉编译-gpsd
依赖库编译完了,下面就该转战 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

执行命令后:
Linux-交叉编译-gpsd
将生成的libtinfo库压缩,拷贝至gpsd 的源码目录,然后解压缩。
如果已经将libncurses库拷贝至gpsd 的源码目录,也可以到gpsd 的源码目录下建立libtinfo 的软连接。不必来回拷贝,麻烦。

4. 交叉编译 gpsd

Linux-交叉编译-gpsd
(1)重要操作:首先切换到 root 用户下,然后进入 gpsd源码目录。

确保上面生成的依赖库已经拷贝至源码目录:

Linux-交叉编译-gpsd

(2)可以参考源码目录下的 INSTALL 和 build.txt 文件,里面详细介绍了 gpsd 的交叉编译过程。
Refer INSTALL and build.txt in gpsd source

(3)创建cache 文件
首先创建了cache 文件,该文件一开始并不存在:
vi .scons-option-cache
Linux-交叉编译-gpsd

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
执行成功:
Linux-交叉编译-gpsd
(5)执行命令:scons check
执行该命令报了一些错误,先不管了,不影响install。

Linux-交叉编译-gpsd
(6)执行命令:scons install
执行成功
Linux-交叉编译-gpsd

(7)如果需要USB热插拔功能,执行命令:scons udev-install

参考:

gpsd的启动项在源码文件中也有,有启动项和配置文件,详细阅读!

Linux-交叉编译-gpsd
(8)清除编译的文件等命令在 build.txt文件中可以找到。

Linux-交叉编译-gpsd
scons check、scons install、scons udev-install的功能介绍。

Linux-交叉编译-gpsd
(9)进入编译生成的可执行文件目录:

Linux-交叉编译-gpsd
将sbin目录下的 gpsd可执行文件拷贝至开发板的/bin目录下,执行gpsd –h查看命令是否可以执行。这里拷贝至创龙AM5728开发板上执行:
Linux-交叉编译-gpsd

上一篇:Scons 六:构建自己的Builder


下一篇:Scons一