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