解决在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
相关推荐
lsh曙光4 小时前
延时at指令和定时cron指令
linux·服务器·网络
圆山猫5 小时前
[Virtualization](四):Linux KVM/RISC-V 的 vCPU 运行路径
java·linux·risc-v
布鲁飞丝5 小时前
vivo Pulsar 万亿级消息处理实践()-Ansible运维部署
运维·ansible
XR1234567885 小时前
企业全光网络架构选型技术白皮书:从物理层到运维层的全链路分析
运维·网络·架构
似的8355 小时前
一步一步学习使用FireMonkey动画() 使用TAnimator类创建动画
linux·学习·nginx
HiDev_5 小时前
【非标自动化】2、认识元器件(直线模组)
运维·自动化
龙仔7256 小时前
人大金仓 KingbaseES V8 只读账号创建完整运维笔记
运维·笔记·sql·人大金仓
我不管我就要叫小猪7 小时前
嵌入式Linux----网络通信
linux·运维·服务器
江湖有缘7 小时前
Docker实战 :使用Docker部署OneTerm堡垒机
运维·docker·容器
泡沫冰@7 小时前
ECS 的介绍和使用
linux·服务器·网络