解决在Ubuntu系统下使用Lucid 相机(HTR003S-001)-Ubuntu 20.04系统遇到GLIBC和GLIBCXX版本不兼容的问题

https://blog.csdn.net/m0_46090849/article/details/159960343?sharetype=blogdetail&sharerId=159960343&sharerefer=PC&sharesource=m0_46090849&spm=1011.2480.3001.8118

上一篇文章讲解了如何在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++库的方式

  1. 添加PPA并更新 :添加 ubuntu-toolchain-r 的测试源,可以获得更新版本的 GCC。

    bash

    复制代码
    sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
    sudo apt update
  2. 安装GCC 11 :安装 G++ 11,它会自动把需要的 libstdc++.so.6.0.29 库带进来。

    bash

    复制代码
    sudo apt install -y g++-11
  3. 验证安装 :检查一下系统里有没有 GLIBCXX_3.4.29 这个版本。

    bash

    复制代码
    strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep 'GLIBCXX_3.4.29'

    如果命令有输出,说明库已经成功升级,可以再次尝试运行 ArenaViewMP 了。

但是升级GLIBC,风险非常高。

glibc 是几乎所有程序都依赖的最底层核心库,强制升级它风险极高,很可能导致整个系统不稳定甚至崩溃。因此,强烈不建议在主力机器上尝试。

因此,采用Docker 容器进行解决

  1. 安装 Docker:首先需要安装 Docker,可以参考官方文档或使用以下命令:

    复制代码
    sudo apt update
    sudo apt install docker.io
  2. 创建并运行容器:拉取一个 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

如果能返回 200302 等状态码,说明网络可达。如果返回 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 的文件夹,但容器是隔离的,看不到主机上的文件。你需要把那个文件夹挂载到容器里。

方法一:退出当前容器,重新运行带挂载参数的容器
  1. 先退出当前容器 :输入 exit 回车。

  2. 删除旧容器 (因为名字 arena_env 已被使用):

    bash 复制代码
    sudo docker rm arena_env
  3. 在宿主机上允许图形连接

    bash 复制代码
    xhost +
  4. 重新创建容器(不带任何预先设置的环境变量)

    bash 复制代码
    sudo 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
相关推荐
悠然南风2 小时前
【云原生学习】Linux网络知识操作精讲 + 实战踩坑
linux
李李李li2 小时前
linux x86 离线安装docker 27.5.0
linux·docker·eureka
洛菡夕2 小时前
LVS+Keepalived高可用群集
运维·服务器·lvs
float_com2 小时前
【JavaWeb】----- Linux基础入门
linux·javaweb
智能运维指南2 小时前
2026 运维监控选型指南:全栈智能可观测平台如何选?
运维
卢傢蕊2 小时前
LVS+Keepalived 高可用群集
linux·运维·lvs·keepalived
Heart_to_Yang2 小时前
TPLink路由器虚拟专用网端口映射故障问题,端口转发无效
运维·服务器·网络
艾莉丝努力练剑2 小时前
【Linux线程】Linux系统多线程(六):<线程同步与互斥>线程同步(上)
java·linux·运维·服务器·c++·学习·线程
姚不倒2 小时前
构建高可用可观测性平台:VictoriaMetrics 集群 + VictoriaLogs 统一接入实践
运维·docker·微服务·云原生·架构