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
命令刷新动态库缓存),即可用来运行程序。