LCM (Lightweight Communications and Marshalling)是一个 基于 UDP 网络的消息传递库,适合高带宽和低延迟的通信需求,模式为发布/订阅。

本文讲述如何交叉编译 LCM 库到 arm linux上。

LCM 依赖 glib 2.0 库,glib 又依赖 zlib/libffi,所以需要依次编译依赖的库。如果目标平台 rootfs 中已有这些库,那么则可以直接最终的 LCM。

需要的源码包

根据目标 arm 平台不同,需要修改后面脚本命令中的 HOST 变量定义,用来指定交叉编译器:

  • armel: arm-linux-gnueabi
  • armhf: arm-linux-gnueabihf
  • aarch64(arm64): aarch64-linux-gnu

交叉编译器编译器可以通过 apt-get install crossbuild-essential-??? 来安装,具体后缀与目标 arm 平台一致。

0. 环境变量配置

以下为编译环境配置,需要在终端中执行,并且之后的编译命令也需要在该终端中执行。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
export HOST=arm-linux-gnueabihf      # 不同平台需要修改变量
export ROOTFS="~/dev_rootfs/${HOST}" # 指定编译文件存放根目录
export CFLAGS="-L${ROOTFS}/usr/local/lib -I${ROOTFS}/usr/local/include"
export CC=${HOST}-gcc
export AR=${HOST}-ar
export NM=${HOST}-nm
export LD=${HOST}-ld
export STRIP=${HOST}-strip
export RANLIB=${HOST}-ranlib
export PREFIX=${ROOTFS}/usr/local

1. 编译 zlib/libffi

以下为编译 zlib 和 libffi 的命令,使用配置过环境变量的终端进入源码目录执行。

1
2
3
4
5
6
7
# 注意:
# 编译 zlib  不需要 --host 参数
# 编译 libffi 需要 --host 参数
./configure --prefix=${PREFIX} --host=${HOST}

make 
make install 

这里需要注意 libffi 的头文件会安装到 ${ROOTFS}/usr/local/lib 目录中,需要手动移动到 ${ROOTFS}/usr/local/include 目录里,否则编译 glib 时会提示找不到头文件。

2. 编译 glib

编译 glib 2.0,如果本机架构不是 x86_64,则需要修改 --build 参数项。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
MN=nm ./configure --prefix=${PREFIX} \
   --build=x86_64-linux \
   --host=${HOST} \
   glib_cv_stack_grows=no \
   glib_cv_uscore=no \
   ac_cv_func_posix_getpwuid_r=yes \
   ac_cv_func_posix_getgrgid_r=yes \
   ac_cv_lib_rt_clock_gettime=no \
   glib_cv_monotonic_clock=yes \
   --enable-libmount=no \
   --with-pcre=internal

make 
make install

3. 编译 LCM

编译 LCM,需要使用 cmake 工具。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
cmake .. -DCMAKE_CROSSCOMPILING=true \
         -DCMAKE_C_COMPILER=${HOST}-gcc \
         -DCMAKE_CXX_COMPILER=${HOST}-g++ \
         -DCMAKE_FIND_ROOT_PATH=${ROOTFS}/usr/local/ \
         -DCMAKE_INSTALL_PREFIX:PATH=${ROOTFS}/usr/local/ \
         -DLCM_ENABLE_TESTS=OFF \
         -DCMAKE_BUILD_TYPE=Release

make
make install

备注:编译 LCM 也可以使用 cmake toolchain 文件,这样更简洁方便。

编译完成后将头文件/库文件保存到交叉编译rootfs中,即可用来交叉编译应用程序,将动态库文件复制到目标 arm 板子上的 /usr/lib/usr/local/lib 中(需要使用 ldconfig 命令刷新动态库缓存),即可用来运行程序。