交叉编译环境搭建流程
- 交叉编译环境搭建的主要思路是利用catkin提供的rostoolchain脚本设置相应的交叉编译工具、lib库地址等,中间遇到问题再针对性解决。
基础环境:
- 目标运行环境
- arm64 cpu
- Ubuntu 16.04
- ros kinetic for arm
- 编译环境
- x86_64 cpu
- Ubuntu Kylin(16.04)
- ros kinetic for amd64
环境设置流程:
在px2环境上安装Ubuntu 16.04及arm版本ros kinetic,后面需要将这个arm版本ros 拷贝到交叉编译环境上
- 在x86环境上安装Ubuntu 16.04及对应的amd64版本ros kinetic。(ros kinetic只适配Ubuntu 16.04以上版本)
- 安装arm-linux交叉编译工具(需要注意本机的cpu架构及arm系统的cpu架构,两者应该都是64位架构)
- 安装命令
sudo apt install gcc-aarch64-linux-gnu
sudo apt install g++-aarch64-linux-gnu
- 将px2中的ros kinetic拷贝到x86机器上,将x86机器上的kinetic备份完成后,替换成arm版本的kinetic。将x86版本的kinetic备份拷贝到指定目录下(如:/opt/ros/kinetic_bak),添加LD_LIBRARY_PATH到指定目录/lib,实现运行ros命令时使用x86的lib库
export LD_LIBRARY_PATH=/opt/ros/kinetic_bak/lib
- 将arm环境下的库文件/头文件拷贝到x86环境中,目录可以自己设定(比如:/${HOME}/cross_compile/px2_env)。拷贝的目录主要包括/lib和/usr目录下面的lib、include及local目录
- 配置rostoolchain.cmake文件,设置cmake的编译工具及相关的库文件/头文件寻址路径
/opt/ros/kinetic/share/ros/core/rosbuild/rostoolchain.cmake
- 修改/opt/ros/kinetic/share/catkin/cmake/tools/rt.cmake文件,将该文件中第34行进行如下修改
if(NOT (APPLE OR WIN32 OR MINGW OR ANDROID))
- 修改为:
if(NOT (APPLE OR WIN32 OR MINGW OR ANDROID OR UNIX))
- 修改catkin中交叉编译的链接文件路径,将其修改为指向px2拷贝过来的库文件/头文件地址,修改方法为在/opt/ros/kinetic/share/catkin/cmake/catkinConfig.cmake文件末尾增加如下代码:catkinConfig.cmake
- 解决roscpp中的路径问题,将其中的绝对路径全部改成对应px2环境中拷贝过来的库路径。修改方法为将/opt/ros/kinetic/share/roscpp/cmake/roscppConfig.cmake文件的第112行改为:
set(libraries "roscpp;pthread;/home/tt/cross_compile/px2_env/usr/lib/aarch64-linux-gnu/libboost_signals.so;/home/tt/cross_compile/px2_env/usr/lib/aarch64-linux-gnu/libboost_filesystem.so;/home/tt/cross_compile/px2_env/usr/lib/aarch64-linux-gnu/libboost_system.so")
- 解决链接过程中库路径错误的问题,编译过程中会默认从/usr/lib/aarch64-linux-gnu文件夹及/lib/aarch64-linux-gnu中寻找lib文件,而实际上两文件夹并不存在,因此需要在这两文件夹下建立软链接,将其链接到px2环境拷贝的对应路径
- 链接命令:
sudo ln -s /home/tt/cross_compile/px2_env/lib/aarch64-linux-gnu /lib/aarch64-linux-gnu
sudo ln -s /home/tt/cross_compile/px2_env/usr/lib/aarch64-linux-gnu /usr/lib/aarch64-linux-gnu
编译
- 命令
catkin_make -DCMAKE_TOOLCHAIN_FILE=/$filepath/rostoolchain.cmake
验证编译产出
- 将devel产出拷贝到px2的workspace中,启动roscore之后,进入devel/lib/hdmap_interface,运行./hdmap_interface_node