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的功能,能工作,不过只能用来识别公式,不能夹杂文字,而且用来识别线性回归的公式结果还是有错误的,说明能力也不是可以无忧的程度。

相关推荐
Lsir10110_13 分钟前
【Linux】进程信号(下半)
linux·运维·服务器
skywalk816329 分钟前
unbound dns解析出现问题,寻求解决之道
运维·服务器·dns·unbound
酉鬼女又兒30 分钟前
零基础入门Linux指南:每天一个Linux命令_pwd
linux·运维·服务器
云飞云共享云桌面33 分钟前
高性能图形工作站的资源如何共享给10个SolidWorks研发设计用
linux·运维·服务器·前端·网络·数据库·人工智能
skywalk816334 分钟前
走近科学:unbound dns域名服务器自己本地解析出现问题,寻求解决之道
运维·服务器·dns·unbound
zl_dfq34 分钟前
Linux 之 【多线程】(pthread_xxx、轻量级进程、原生线程库、线程ID、__thread、线程栈、线程与信号、线程与程序替换)
linux
choke23335 分钟前
Python 基础语法精讲:数据类型、运算符与输入输出
java·linux·服务器
袁煦丞 cpolar内网穿透实验室38 分钟前
远程调试内网 Kafka 不再求运维!cpolar 内网穿透实验室第 791 个成功挑战
运维·分布式·kafka·远程工作·内网穿透·cpolar
AZ996ZA1 小时前
自学linux的第二十一天【DHCP 服务从入门到实战】
linux·运维·服务器·php
_OP_CHEN1 小时前
【Linux系统编程】(二十八)深入 ELF 文件原理:从目标文件到程序加载的完整揭秘
linux·操作系统·编译·c/c++·目标文件·elf文件