起因
公司买了台机器狗,厂家给的SDK依赖2.35版本的GLIBC,而目前使用的ROS是ROS1而且系统版本是18.04,GLIBC版本是2.27,导致无法直接运行SDK,链接报错:
/home/gitlab-runner/builds/x1Fy88Kek/0/navi/general_robot/devel/lib/mc_sdk/libmc_sdk_x86_64.so: undefined reference to `pthread_detach@GLIBC_2.34'
/home/gitlab-runner/builds/x1Fy88Kek/0/navi/general_robot/devel/lib/mc_sdk/libmc_sdk_x86_64.so: undefined reference to `__libc_single_threaded@GLIBC_2.32'
/home/gitlab-runner/builds/x1Fy88Kek/0/navi/general_robot/devel/lib/mc_sdk/libmc_sdk_x86_64.so: undefined reference to `pthread_sigmask@GLIBC_2.32'
/home/gitlab-runner/builds/x1Fy88Kek/0/navi/general_robot/devel/lib/mc_sdk/libmc_sdk_x86_64.so: undefined reference to `pthread_join@GLIBC_2.34'
/home/gitlab-runner/builds/x1Fy88Kek/0/navi/general_robot/devel/lib/mc_sdk/libmc_sdk_x86_64.so: undefined reference to `pthread_condattr_setclock@GLIBC_2.34'
/home/gitlab-runner/builds/x1Fy88Kek/0/navi/general_robot/devel/lib/mc_sdk/libmc_sdk_x86_64.so: undefined reference to `pthread_create@GLIBC_2.34'
目前考虑了多种办法,包括:
- 升级22.04,把程序全改成ROS2。这个方案的代价是最大的不值当。
- 使用Docker隔离封装SDK的程序,然后把一些接口用RPC框架暴露出来。
- 使用chroot环境,手动链接高版本的GLIBC库,同样用RPC框架和原系统版本上的其他模块通信。
- 使用linuxbrew,同2,3思路
其中2和4的方法都已经证明可以用,但是配置使用较为复杂,现在尝试3这种方法
chroot环境搭建
安装debootstrap
sudo apt-get update
sudo apt-get install -y debootstrap
sudo apt-get install -y schroot
创建chroot根目录并引导22.04
export CHROOT_DIR=/srv/chroot/jammy
mkdir -p $CHROOT_DIR
sudo debootstrap --arch amd64 jammy $CHROOT_DIR http://mirrors.tuna.tsinghua.edu.cn/ubuntu/
挂载必要的文件系统并配置网络
# 挂载 /proc /sys /dev
for d in proc sys dev dev/pts; do
sudo mount --rbind /$d $CHROOT_DIR/$d
sudo mount --make-rslave $CHROOT_DIR/$d
done
# DNS
sudo cp /etc/resolv.conf $CHROOT_DIR/etc/resolv.conf
绑定HOME目录(可选)
sudo mkdir -p $CHROOT_DIR/home/$USER
sudo mount --rbind $HOME $CHROOT_DIR/home/$USER
配置schroot
编辑/etc/schroot/chroot.d/jammy.conf
[jammy]
description=Ubuntu 22.04 Jammy
type=directory
directory=/srv/chroot/jammy
users=<username>
root-users=<username>
profile=desktop
personality=linux
里面的<username>
需要改成你自己的用户名,配置好后就可以使用schroot
命令进入这个chroot环境了。
sudo schroot -c jammy
切换了之后就会看到最左边有个(jammy)
,和python虚拟环境一样。
安装工具和库
进入chroot环境
sudo schroot -c jammy
重新配置apt源,把这些覆盖/etc/apt/source.list
,用vi
编辑器打开文件,改成:
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
安装编译工具
sudo apt-get update
sudo apt-get install -y build-essential cmake git pkgconfig binutils
然后就可以在这个chroot环境中编译和运行依赖高版本GLIBC的程序了。
大功告成!