Deepin 20.9 误装gcc-8-base_8.4.0-1ubuntu1~16.04.1_amd64 后卸载

Deepin 20.9 自带的gcc是 8.3版本,我本意安装8.4版本,然后就从 https://ppa.launchpadcontent.net/ubuntu-toolchain-r/test/ubuntu/pool/main/g/gcc-8/ 下载了 gcc-8-base_8.4.0-1ubuntu1~16.04.1_amd64.deb 安装包。

然而,这个安装包是给 ubuntu16.04 64位用的,我用不了,装不上。更严重的是,此后这个包就卸载不了!

查了不少资料,然后尝试摸索了一下,终于将其"卸载"(其实是恢复到8.3版本)。

bash 复制代码
sjg@sjg-PC:~$ dpkg -l | grep gcc
ii  gcc                                               4:8.3.0-1                                                                amd64        GNU C compiler
ii  gcc-8                                             8.3.0.3-3+rebuild                                                        amd64        GNU C compiler
iU  gcc-8-base:amd64                                  8.4.0-1ubuntu1~16.04.1                                                   amd64        GCC, the GNU Compiler Collection (base package)
iF  gcc-8-base:i386                                   8.3.0.3-3+rebuild                                                        i386         GCC, the GNU Compiler Collection (base package)
.................

dpkg -l 列出的首列一般是两个字母,分别表示软件包的期望状态和当前状态。所以,gcc-8-base:amd64 软件包(版本号8.4和其他所有不一样)状态 iU 表示仅解压缩(软件包已解压,但未配置)。gcc-8-base:i386软件包状态 iF 表示期望安装,但配置失败了。

bash 复制代码
sjg@sjg-PC:~$ dpkg -s gcc-8-base:amd64
Package: gcc-8-base
Status: install ok unpacked
Priority: required
Section: libs
Installed-Size: 117
Maintainer: Ubuntu Core developers <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: amd64
Multi-Arch: same
Source: gcc-8
Version: 8.4.0-1ubuntu1~16.04.1
Config-Version: 8.3.0.3-3+rebuild
Description: GCC, the GNU Compiler Collection (base package)
 This package contains files common to all languages and libraries
 contained in the GNU Compiler Collection (GCC).
Homepage: http://gcc.gnu.org/
Original-Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>

上面代码用 dpkg -s 查看了 gcc-8-base:amd64 的详细状态信息,确认了状态,而且版本和配置版本不一致。

bash 复制代码
sjg@sjg-PC:~$ sudo apt install gcc-8-base -y
.......................   
gcc-8-base 已经是最新版 (8.4.0-1ubuntu1~16.04.1)。
您也许需要运行"apt --fix-broken install"来修正上面的错误。
下列软件包有未满足的依赖关系:
 cpp-8 : 依赖: gcc-8-base (= 8.3.0.3-3+rebuild) 但是 8.4.0-1ubuntu1~16.04.1 正要被安装
 g++-8 : 依赖: gcc-8-base (= 8.3.0.3-3+rebuild) 但是 8.4.0-1ubuntu1~16.04.1 正要被安装
 gcc-8 : 依赖: gcc-8-base (= 8.3.0.3-3+rebuild) 但是 8.4.0-1ubuntu1~16.04.1 正要被安装
 gcc-8-base : 破坏: gcc-8-base:i386 (!= 8.4.0-1ubuntu1~16.04.1) 但是 8.3.0.3-3+rebuild 正要被安装
 gcc-8-base:i386 : 破坏: gcc-8-base (!= 8.3.0.3-3+rebuild) 但是 8.4.0-1ubuntu1~16.04.1 正要被安装
 gfortran-8 : 依赖: gcc-8-base (= 8.3.0.3-3+rebuild) 但是 8.4.0-1ubuntu1~16.04.1 正要被安装
 lib32gcc1 : 依赖: gcc-8-base (= 8.3.0.3-3+rebuild) 但是 8.4.0-1ubuntu1~16.04.1 正要被安装
 lib32stdc++6 : 依赖: gcc-8-base (= 8.3.0.3-3+rebuild) 但是 8.4.0-1ubuntu1~16.04.1 正要被安装
............................
 libubsan1 : 依赖: gcc-8-base (= 8.3.0.3-3+rebuild) 但是 8.4.0-1ubuntu1~16.04.1 正要被安装
E: 有未能满足的依赖关系。请尝试不指明软件包的名字来运行"apt --fix-broken install"(也可以指定一个解决办法)。

用以上方法视图重新安装仓库里面的 gcc-8-base 失败,因为8.4版本更新,而且同时提示依赖有损坏。感觉不能用 sudo apt --fix-broken install 来处理,因为会提示大量包需要卸载,释放空间24GB多,这感觉是把系统删了的节奏。

bash 复制代码
sjg@sjg-PC:~$ sudo dpkg -r gcc-8-base:i386
dpkg: 依赖问题阻止了卸载 gcc-8-base:i386 的操作:
 libstdc++6:i386 依赖于 gcc-8-base (= 8.3.0.3-3+rebuild).
 libgomp1:i386 依赖于 gcc-8-base (= 8.3.0.3-3+rebuild).
 libgcc1:i386 依赖于 gcc-8-base (= 8.3.0.3-3+rebuild).
 libatomic1:i386 依赖于 gcc-8-base (= 8.3.0.3-3+rebuild).

dpkg: 处理软件包 gcc-8-base:i386 (--remove)时出错:
 依赖问题 - 不会执行卸载
在处理时有错误发生:
 gcc-8-base:i386
sjg@sjg-PC:~$ sudo apt install gcc-8-base:i386

// 出现和前面安装 gcc-8-base:amd64 相似的错误提示

sjg@sjg-PC:~$ sudo apt-get remove --purge gcc-8-base:i386

// 出现和前面安装 gcc-8-base:amd64 相似的错误提示

sjg@sjg-PC:~$ sudo apt-get remove --purge gcc-8-base:amd64

// 出现和前面安装 gcc-8-base:amd64 相似的错误提示

像上面那样,无论试图重新安装或者卸载都不行。接下来用 aptitude 试一下:

bash 复制代码
sjg@sjg-PC:~$ sudo aptitude remove --purge-unused gcc-8-base:amd64
下列软件包将被"删除":           
  gcc-8-base 
下列仅部分安装的软件包将被配置:
  gcc-8-base:i386 
0 个软件包被升级,新安装 0 个,1 个将被删除, 同时 14 个将不升级。
需要获取 0 B 的存档。解包后将释放 120 kB。
下列软件包存在未满足的依赖关系:
 libmpx2 : 依赖: gcc-8-base (= 8.3.0.3-3+rebuild) 但它将不会被安装
 ...........................
 libstdc++-8-dev : 依赖: gcc-8-base (= 8.3.0.3-3+rebuild) 但它将不会被安装
打开:2;关闭;1;defer: 0; 冲突;0                                            .下列动作将解决这些依赖关系:

     降级 下列软件包:                                                        
1)     gcc-8-base [8.4.0-1ubuntu1~16.04.1 (now) -> 8.3.0.3-3+rebuild (<NULL>)]



是否接受该解决方案?[Y/n/q/?] y
下列软件包将被"降级":
  gcc-8-base 
下列仅部分安装的软件包将被配置:
  gcc-8-base:i386 
0 个软件包被升级,新安装 0 个,1 个被降级,0 个将被删除, 同时 14 个将不升级。
需要获取 16.8 kB 的存档。解包后将释放 37.9 kB。
您要继续吗?[Y/n/?] y
读取: 1 https://cdn-community-packages.deepin.com/deepin apricot/main amd64 gcc-8-base amd64 8.3.0.3-3+rebuild [16.8 kB]
已下载 16.8 kB,耗时 1秒 (29.0 kB/s)    
dpkg: 警告: 即将把 gcc-8-base:amd64 从 8.4.0-1ubuntu1~16.04.1 降级到 8.3.0.3-3+rebuild
(正在读取数据库 ... 系统当前共安装有 509965 个文件和目录。)
准备解压 .../gcc-8-base_8.3.0.3-3+rebuild_amd64.deb  ...
正在解压 gcc-8-base:amd64 (8.3.0.3-3+rebuild) 并覆盖 (8.4.0-1ubuntu1~16.04.1) ...
dpkg: 处理归档 /var/cache/apt/archives/gcc-8-base_8.3.0.3-3+rebuild_amd64.deb (--unpack)时出错:
 尝试覆盖共享的 '/usr/share/doc/gcc-8-base/changelog.Debian.gz', 它与软件包 gcc-8-base:amd64 中的其他实例不同
在处理时有错误发生:
 /var/cache/apt/archives/gcc-8-base_8.3.0.3-3+rebuild_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
dpkg: 处理软件包 gcc-8-base:amd64 (--configure)时出错:
 现在尚不能配置软件包 gcc-8-base:amd64 8.4.0-1ubuntu1~16.04.1,因为 gcc-8-base:i386 处于一个不同的版本(8.3.0.3-3+rebuild)
在处理时有错误发生:
 gcc-8-base:amd64

sjg@sjg-PC:~$ sudo aptitude remove --purge-unused gcc-8-base:i386

// 提示信息与上面的完全相同

提示降级,似乎有戏,但后来还是失败了,不过有提示在覆盖文件时失败了。查看哪些包依赖了覆盖失败的文件:

bash 复制代码
sjg@sjg-PC:~$ dpkg -S /usr/share/doc/gcc-8-base/changelog.Debian.gz
gcc-8-base:i386, gcc-8-base:amd64: /usr/share/doc/gcc-8-base/changelog.Debian.gz

我们干掉覆盖失败的文件(保险起见,用移动代替删除),然后再一次清理未使用的包

bash 复制代码
sjg@sjg-PC:~$ sudo mv /usr/share/doc/gcc-8-base/changelog.Debian.gz ~/garbage/
sjg@sjg-PC:~$ ll /usr/share/doc/gcc-8-base/changelog.Debian.gz
ls: 无法访问'/usr/share/doc/gcc-8-base/changelog.Debian.gz': 没有那个文件或目录
sjg@sjg-PC:~$ sudo aptitude remove --purge-unused gcc-8-base:i386
回答 y  y  降级成功
sjg@sjg-PC:~$ sudo aptitude remove --purge-unused gcc-8-base:amd64
回答 y  y  提示已经降级

sjg@sjg-PC:~$ dpkg -l | grep gcc

再次查看时,发现版本已经降级成功了。

man aptitude 可以查看 --purge-unused 选项的含义:

bash 复制代码
       --purge-unused
           If Aptitude::Delete-Unused is set to "true" (its default), then in addition
           to removing each package that is no longer required by any installed package,
           aptitude will also purge them, removing their configuration files and perhaps
           other important data. For more information about which packages are
           considered to be "unused", see the section "Managing Automatically Installed
           Packages" in the aptitude reference manual.  THIS OPTION CAN CAUSE DATA LOSS!
           DO NOT USE IT UNLESS YOU KNOW WHAT YOU ARE DOING!

           This corresponds to the configuration option Aptitude::Purge-Unused.

说明:我的情况中,通常用来处理安装中断的情况的命令 sudo dpkg --configure -a 无效。

Deepin 20.9 安装更新版本的Python3,参考 https://www.fungj.com/information/deepin-v20-installing-python.html

gcc编译安装,参考 https://blog.csdn.net/m0_37605642/article/details/120325517

遇到的问题本身是为了在Deepin 20.9上跑 pix2tex,参考 https://blog.csdn.net/gitblog_01003/article/details/151482466

bash 复制代码
sjg@sjg-PC:~$ strings /lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBC
GLIBCXX_3.4
GLIBCXX_3.4.1
................
GLIBCXX_3.4.25
................

运行pix2tex报错,Deepin 20.9本身只能支持 glibstdc++ 版本到 3.4.25,我们需要 3.4.29。libstdc++的源码在gcc源码中有,但编译gcc源码时似乎并不会自动编译安装这部分。

参考 https://developer.aliyun.com/article/1540422

http://fancyerii.github.io/2024/03/07/multi-glibc-patchelf/ 编译 glibc 的方法编译这部分,安装后生成的文件在 /usr/local/lib64 下。

运行python -m pix2tex.api.run时,尝试用patchelf修改报错提示中的 .so文件要求的 libstdc++.so 版本为自己编译的 3.4.29,但仍有错误。

bash 复制代码
sudo find /opt -name libstdc++.so*
LD_PRELOAD=/opt/apps/cn.wps.wps-office/files/kingsoft/wps-office/office6/libstdc++.so.6.0.32  python -m pix2tex.api.run

用上述方法找出系统中有的版本,然后挑了个高版本的加载运行居然成功了(下载模型的时候老是断网,试了好几次)。wps所用的版本最后那个数字似乎对应libstdc++.so版本号最后的数字。这似乎表明需要比3.4.29更高版本才行。以后有机会再试验了。下面的是运行前端的命令。

bash 复制代码
sjg@sjg-PC:~/.local/lib/python3.14/site-packages$ streamlit run pix2tex/api/streamlit.py

试了一下 pix2tex的功能,能工作,不过只能用来识别公式,不能夹杂文字,而且用来识别线性回归的公式结果还是有错误的,说明能力也不是可以无忧的程度。

相关推荐
梁萌1 天前
Jenkins流水线配置的两种方式
运维·jenkins·jenkinsfile·流水线配置
Hi梅1 天前
批量处理框架 (Batch Processing Framework)
java·服务器·batch
终端行者1 天前
Nginx 反向代理与负载均衡配置 反向代理与负载均衡配置参数
运维·nginx·负载均衡
oMcLin1 天前
CentOS 7.6 磁盘空间不足导致服务崩溃:如何有效清理日志文件和临时文件
linux·运维·centos
筑梦之路1 天前
Jenkins 构建部署多模块Java应用流水线参考——筑梦之路
java·运维·jenkins
秋风不问归客1 天前
linux 网络相关命令 及常用场景
linux·服务器·网络
金牌归来发现妻女流落街头1 天前
【线程池 + Socket 服务器】
java·运维·服务器·多线程
牛奶咖啡131 天前
Linux文件快照备份工具rsnapshot的实践教程
linux·服务器·文件备份·文件快照备份·rsnapshot·定时备份本地或远程文件·查看指定命令的完整路径
大模型铲屎官1 天前
【操作系统-Day 47】揭秘Linux文件系统基石:图解索引分配(inode)与多级索引
linux·运维·服务器·人工智能·python·操作系统·计算机组成原理
乾元1 天前
Network-as-Code:把 HCIE / CCIE 实验脚本转为企业级 CI 工程化流程
运维·网络·人工智能·安全·web安全·ai·架构