前段时间因项目需要,交叉编译ROS2,结果花了好些天,走了好多弯路,最终搞定了。
一,尝试一 :
一开始按照既往编译Qt、openCV之类库的思路,直接拉下来源码,用交叉编译工具链就想搞定,后来试了好几天,发现ros2的ament_cmake体系有点麻烦,他似乎不能支持这种本地交叉编译的方式,后来终于放弃,准备换一个思路。
二,尝试二
一开始准备用官网这个链接的思路去试试,毕竟在网上好多人也使用这个思路:
Cross-compilation — ROS 2 Documentation: Foxy documentation
docker也不是很熟,试了半天还是出现各种问题,尤其是那个raw.githubusercontent.com访问不了(鄙视great wall及其相关的垃圾),在docker下改那个hosts文件很麻烦,后来去官方论坛看,这个方法早就不支持了,并且官方给的ubuntu 的docker镜像是18.04版本的,用来构建humble不行,比如cmake版本就太低。
三,尝试三
后来没办法,只好去官网下载了预编译版本(预编译版本只有x86和arm 64平台的),直接用了。
一开始下载的新版,发现新版在官方预编译的时候,用的编译器和glibc比较新,而我的嵌入式系统的glibc是2.33的,后来只好下载了2020年12月发布的forxy版本。
之后在qt中引入这个库的时候,又有不少麻烦,这就是另外一个问题了。
至此项目需求算是解决,但内心有所不甘。
四,尝试四
之后在humble的页面看了看,最终决定用docker官方的arm64平台的ubuntu 20.04镜像去构建,,humble下的交叉编译页面如下:
Cross-compilation — ROS 2 Documentation: Humble documentation
其实就一句话:之前的交叉编译工具已经不再支持,请用docker buildx直接搞就行了。
实际上,连里面提到的docker buildx其实都不需要,直接:
docker pull arm64v8/ubuntu:20.04
docker run -it arm64v8/ubuntu:20.04 /bin/bash
就进入目标docker images的容器中了,然后完全按照如下本机source安装的步骤,开始就可以了,链接:
Ubuntu (source) — ROS 2 Documentation: Humble documentation
中间遇到一些问题,有一些是桌面编译时就会遇到的,比如acl库缺失、下载失败等,都逐一解决。还有一些是使用docker镜像才会遇到的(docker镜像的环境,和桌面版的ubuntu还是有区别的,但大部分都是缺失默认的支持库),把报错告诉chatgpt,也一一解决,编译完成后记得保存docker 容器到新的image,后边就很方便的可以给别人用了,也可以自己保存。
中间遇到的问题:
待补充。