上一篇文章讲解了如何在Ubuntu系统下使用Lucid相机,但是相关开发包以及ArenaView要求ubuntu 22.04和24.04系统,因此出现不兼容的问题。

这个错误的核心原因是,你下载的 ArenaViewMP 这个程序依赖的 C++ 和 C 标准库版本太高了,而你电脑里的版本却有点旧,导致程序无法正常启动。
Ubuntu 20.04 默认自带的 C 库(GLIBC)版本是 2.31,而 ArenaViewMP 需要的是 2.34 或更高版本。C++ 库(libstdc++.so.6)也是同理,系统版本(3.4.28)低于程序需要的 3.4.29/3.4.30。
对于GLIBCXX_3.4.29 缺失的问题,可以通过升级C++库的方式
-
添加PPA并更新 :添加
ubuntu-toolchain-r的测试源,可以获得更新版本的 GCC。bash
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test sudo apt update -
安装GCC 11 :安装 G++ 11,它会自动把需要的
libstdc++.so.6.0.29库带进来。bash
sudo apt install -y g++-11 -
验证安装 :检查一下系统里有没有
GLIBCXX_3.4.29这个版本。bash
strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep 'GLIBCXX_3.4.29'如果命令有输出,说明库已经成功升级,可以再次尝试运行
ArenaViewMP了。
但是升级GLIBC,风险非常高。
glibc 是几乎所有程序都依赖的最底层核心库,强制升级它风险极高,很可能导致整个系统不稳定甚至崩溃。因此,强烈不建议在主力机器上尝试。
因此,采用Docker 容器进行解决
-
安装 Docker:首先需要安装 Docker,可以参考官方文档或使用以下命令:
sudo apt update sudo apt install docker.io -
创建并运行容器:拉取一个 Ubuntu 22.04 的镜像并进入其命令行。
sudo docker run -it --name arena_env ubuntu:22.04 /bin/bash
你可能会遇到拉取镜像超时的错误,因此需要给给 Docker 配置一个国内镜像加速器
我尝试了很多,发现 https://docker.1ms.run 可用。
第一步:测试新镜像源是否可解析
先测试一下最推荐的 https://docker.1ms.run:
curl -I https://docker.1ms.run
如果能返回 200 或 302 等状态码,说明网络可达。如果返回 curl: (6) Could not resolve host,说明你的 DNS 仍然有问题,需要先按我之前说的修改 DNS(改成 8.8.8.8)。
第二步:修改 Docker 配置文件
假设测试成功,执行以下命令写入新的配置(这里也提供了一些常见的镜像源,docker会不断尝试 建议都加上):
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.m.daocloud.io",
"https://lispy.org",
"https://docker-0.unsee.tech",
"https://docker.xuanyuan.me"
]
}
EOF
第三步:重启 Docker
sudo systemctl restart docker
第四步:验证配置生效
sudo docker info | grep -A 5 "Registry Mirrors"
应该能看到你配置的这五个镜像源。
第五步:测试拉取镜像
sudo docker pull ubuntu:22.04
如果成功拉取,说明镜像加速器工作正常。然后运行容器:
sudo docker run -it --name arena_env ubuntu:22.04 /bin/bash

这个提示符 root@4f2aa0cf55c1:/# 表示你已经成功进入了一个正在运行的 Docker 容器内部。
接下来,你需要在容器内运行 ArenaViewMP
你的主机上已经下载了 ArenaViewMP 的文件夹,但容器是隔离的,看不到主机上的文件。你需要把那个文件夹挂载到容器里。
方法一:退出当前容器,重新运行带挂载参数的容器
-
先退出当前容器 :输入
exit回车。 -
删除旧容器 (因为名字
arena_env已被使用):bashsudo docker rm arena_env -
在宿主机上允许图形连接:
bashxhost + -
重新创建容器(不带任何预先设置的环境变量)
bashsudo docker run -it --name arena_env \ --network="host" \ -v /home/yyg/下载/ArenaViewMP_v_1.0.0.10_Linux_x64:/opt/arena \ -e DISPLAY=$DISPLAY \ -v /tmp/.X11-unix:/tmp/.X11-unix \ ubuntu:22.04 /bin/bash
5. 在容器内,先安装所有系统依赖(不要设置LD_LIBRARY_PATH)
bash
apt install -y libasound2 libatk-bridge2.0-0 libgtk-3-0 libatomic1 libglib2.0-0 procps coreutils libnss3 libdrm2 libglx-mesa0 libgl1-mesa-glx libegl1 libopengl0 libglvnd0 libibverbs1 librdmacm1 libxcb-cursor0 libxcb-util1 libxcb-icccm4 libxcb-keysyms1 libxcb-randr0 libxcb-shape0 libxcb-shm0 libxcb-xfixes0 libxcb-xinerama0 libxcb-xkb1 libxcb-xv0 libxkbcommon-x11-0
6.切换到程序目录,此时才设置环境变量并运行程序
bash
cd /opt/arena/ArenaSDK_Linux_x64/OutputDirectory/Linux/x64Release
export LD_LIBRARY_PATH=.:/opt/arena/ArenaSDK_Linux_x64/lib64:/opt/arena/ArenaSDK_Linux_x64/Metavision/lib:../../../GenICam/library/lib/Linux64_x64:../../../ffmpeg:../../../lib64:../../../Qt/lib
export LD_PRELOAD=libcef.so
export LANG=C.UTF-8
export LC_ALL=C.UTF-8
./ArenaViewMP

成功运行
为了能够方便运行,制作一个启动脚本
bash
cat > /opt/arena/ArenaSDK_Linux_x64/OutputDirectory/Linux/x64Release/run_avmp1.sh << 'EOF'
#!/bin/bash
cd /opt/arena/ArenaSDK_Linux_x64/OutputDirectory/Linux/x64Release
export LD_LIBRARY_PATH=.:/opt/arena/ArenaSDK_Linux_x64/lib64:/opt/arena/ArenaSDK_Linux_x64/Metavision/lib:../../../GenICam/library/lib/Linux64_x64:../../../ffmpeg:../../../lib64:../../../Qt/lib
export LD_PRELOAD=libcef.so
export LANG=C.UTF-8
export LC_ALL=C.UTF-8
./ArenaViewMP
EOF
chmod +x /opt/arena/ArenaSDK_Linux_x64/OutputDirectory/Linux/x64Release/run_avmp1.sh
然后运行脚本即可:
bash
/opt/arena/ArenaSDK_Linux_x64/OutputDirectory/Linux/x64Release/run_avmp1.sh
在退出之后,如果想进入创建的容器可以使用下面的命令
通过这个方式,查看所有已运行和未运行的docker,其中STATUS列为Exited,表示容器已停止,Up表示正在运行。
bash
sudo docker ps -a
找到已创建的docker名称,若未运行,则先进行启动
bash
sudo docker start arena_env # 启动容器
进入容器
bash
sudo docker exec -it arena_env /bin/bash # 进入容器
进入相应的文件夹内
bash
cd /opt/arena/ArenaSDK_Linux_x64/OutputDirectory/Linux/x64Release
运行相应程序
bash
sh run_avmp1.sh