交叉编译 iceoryx
概述
iceoryx 是用于各种操作系统的进程间通信(IPC)中间件(目前支持 Linux、macOS、QNX、FreeBSD 和 Windows 10)。它起源于汽车行业,当涉及到驾驶员辅助或自动驾驶系统时,需要在不同的过程之间传输大量数据。然而,有效的通信机制也可以应用于更广泛的用例,例如在机器人或游戏开发领域。
iceoryx 使用一种真正的零拷贝共享内存方法,该方法允许在没有单个拷贝的情况下将数据从发布者传输到订阅者。这确保了数据传输具有恒定的延迟,而与有效负载的大小无关。有关更多信息,请查看 1000 字的 iceoryx 简介。
就其本身而言,这并不是一种新的创新,因为这种方法自 20 世纪 70 年代以来就一直在使用。然而,我们进一步采用了这种方法,将其与发布/订阅体系结构、服务发现、现代 C++ 和无锁算法相结合。通过添加一个避免复制的应用程序编程接口(API),我们可以实现我们所称的真正的零拷贝——从发布者到订阅者的端到端方法,而无需创建单个拷贝。
- GitHub: https://github.com/eclipse-iceoryx/iceoryx
下载
开发版本 (最新)
如果以研究学习为目的,或者希望尝试最新特性,又或者希望参与到 iceoryx 的开发中,可以直接从 github 上拉取最新源码,拉取命令:
git clone https://github.com/eclipse-iceoryx/iceoryx.git
技巧:在 github 页面点击右上角的
Code
按钮获取 git clone 链接。
发行版本
如果以商用量产为目的,一般选择正式的发行版本为佳。在 iceoryx 的 Release 页面,源码以压缩包的形式提供,根据需求选择合适的版本进行下载,以最新的 2.0.3 为例,下载源码包 Source Code (tar.gz).
也可以直接使用 wget
命令下载:
wget https://github.com/eclipse-iceoryx/iceoryx/archive/refs/tags/v2.0.3.tar.gz
交叉编译
解压缩源码包,如果使用 git clone
拉回来的代码可以忽略这一步:
tar -xvf v2.0.3.tar.gz
解压缩源码包之后建议先阅读 README.md
文档,在 Build and install 章节里面有关于编译的相关信息,或者直接阅读 doc/website/getting-started/installation.md
文档。
在 iceoryx 的文档及配置文件中有提及到依赖关系,最主要的是依赖 libacl 库,如果需要完整编译可以先参考「交叉编译 attr」与「交叉编译 acl」两篇文章。需要注意的点就是,需要使用 make DESTDIR=$BUILDSYSROOT install
将编译产物部署到 sysroot 目录便于 iceoryx 编译时依赖,效果类似于 apt install *-dev
安装开发依赖包。
iceoryx 使用了 CMake 编译系统,需要保证系统中已经安装了 cmake 工具。可以使用 apt
命令进行安装:
sudo apt install -y cmake
如果 cmake 版本低于 3.16 需要先更新到 cmake 3.16+ 版本。
首先创建一个环境配置文件 aarch64-environment-setup
,配置最重要的交叉编译环境变量。
aarch64-environment-setup:
export TOOLCHAIN_ROOT=/opt/toolchains/aarch64--glibc--stable-2022.03-1
export BUILDSYSROOT=$TOOLCHAIN_ROOT/aarch64-buildroot-linux-gnu/sysroot
export PATH=$TOOLCHAIN_ROOT/bin:$PATH
export PREFIX=/usr
export CC="aarch64-linux-gcc --sysroot=$BUILDSYSROOT"
export CXX="aarch64-linux-g++ --sysroot=$BUILDSYSROOT"
export CPP="aarch64-linux-gcc -E --sysroot=$BUILDSYSROOT"
export LD="aarch64-linux-ld --sysroot=$BUILDSYSROOT"
export AR=aarch64-linux-ar
export AS=aarch64-linux-as
export NM=aarch64-linux-nm
export GDB=aarch64-linux-gdb
export OBJDUMP=aarch64-linux-objdump
export OBJCOPY=aarch64-linux-objcopy
export RANLIB=aarch64-linux-ranlib
export READELF=aarch64-linux-readelf
export STRIP=aarch64-linux-strip
export PKG_CONFIG_SYSROOT_DIR=$BUILDSYSROOT
export PKG_CONFIG_PATH=$BUILDSYSROOT/usr/lib/pkgconfig:$BUILDSYSROOT/usr/share/pkgconfig
在本示例中,交叉编译工具位于 /opt/toolchains/aarch64--glibc--stable-2022.03-1/bin
目录下,将该目录配置到 PATH 环境变量,让系统能够正确搜索到。同时在配置 CC,CXX,CPP 与 LD 环境变量时指定 --sysroot=<dir>
参数让交叉编译器搜索 dir 目录下的头文件与库文件,而不是 /usr/include
及 /usr/lib
。
source aarch64-environment-setup
cmake -Bbuild -Hiceoryx_meta -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=/usr
cmake --build build
cmake --build build --target install DESTDIR=$BUILDSYSROOT
- 在源码目录下创建环境配置文件并调用
source
命令让环境变量生效; - cmake 使用 -B 参数指定构建目录为
build
,如果build
目录不存在则自动创建;使用 -H 参数指定 CMakeLists.txt 文件所在路径,指定 -DBUILD_SHARED_LIBS=ON 编译出动态链接库,并使用 -DCMAKE_INSTALL_PREFIX=/usr 配置安装的目录前缀为/usr
; - 执行
cmake --build build
命令在 build 目录编译源码; - 使用
--target install
进行安装,带上 DESTDIR 参数作为安装目标文件的前缀变量,后面带上你希望安装到的文件夹路径,在本示例中,BUILDSYSROOT 指的是交叉编译工具链的 sysroot 目录,此环境变量在aarch64-environment-setup
中已定义。更详细介绍可以参考 DESTDIR 官方介绍,也可以参考「交叉编译 libcap」关于 DESTDIR 的用法说明。
最终你就可以在 $BUILDSYSROOT/usr
文件夹中找到交叉编译好的 iceoryx 头文件及库文件。如果需要以软件包的形式发布,可以指定 DESTDIR 为其他目录,比如 DESTDIR=/tmp/sysroot
则最终交叉编译出来的产物会在 /tmp/sysroot
文件夹下。Good luck.
欢迎关注我的公众号:飞翔的小黄鸭
也许会发现不一样的风景
△ \triangle △ 交叉编译 acl