[Feelings & Sharing] 记录一次gcc/g++编译升级(13.1.0)
Tofloor
poster avatar
wlly-lzh
deepin
2023-08-12 02:10
Author

现在deepin23上的gcc的版本是11.2,不算新,也谈不上旧,但是本人是一个“追新族”,所以钻研了一下编译升级gcc的方法。


提前声明:

升级gcc(g++)版本可能会有风险,请认真考虑之后在进行操作。

如果没有必要,尽量就不要升级。

此外,本人不保证安装本贴操作一定可以成功,可能仍然需要一定水平。

还有一点,在运行命令之前请务必阅读注释


1、下载源码

http://mirrors.ustc.edu.cn/gnu/gcc/ 老规矩,上镜像站。

选择自己想要的版本(我选择13.1)然后解压

2、准备编译所需的软件和库

编译器:gcc、g++

构建工具:make

对应的库:libgmp-dev 、libmpc-dev 、libmpfr-dev(请用apt 安装这几个库

这几个库我原本是下载了源码想要自己编译的,但是最后不知道为什么失败了(见: gcc编译报错之 gmp、mpfr、mpc),算了,又不是不能用。

介绍一下这几个库:

GMP 是一个免费的任意精度算术库,对有符号整数、有理数和浮点数进行运算。(目前deepin23上的版本是6.2.1)

MPFR:GNU多精度浮点舍入库。 (目前deepin23上的版本是4.1.0)

MPC是一个复杂数字算法的c语言库,支持任意精度和数字。 (目前deepin23上的版本是1.2.1)

个人认为已经算是比较新的了,离最新版本好像也就那么两三个版本。

补充一点:

可以通过执行./contrib/download_prerequisites来安装这三个库,个人认为这也是一个不错的办法。

3、编译

进入到解压出来的目录下面,然后执行:

sudo ./configure --prefix=/usr/local/gcc13.1.0/

注释:这条命令会检查系统环境是否满足编译的条件,并且指定安装目录为/usr/local/gcc13.1.0

如果执行之后没有报错,就可以进行下一步了:

sudo make -jn

注释:执行本命令会开始编译,其中的n指的是将要用来编译的cpu的线程数,一般情况下选择比你的cpu的最大线程少一两个就好。

sudo make install

注释:执行本命令会将生产的文件拷贝到前面操作的指定目录下

4、将系统的gcc(g++)替换成自己编译的

温馨提示:可以保留原来的gcc和g++,这样方便出了问题恢复

我们平时所执行的gcc和g++其实是在 /usr/bin目录下的一个软连接,替换只需要修改这个软连接的指向

替换gcc:

sudo ln -sf /usr/local/gcc13.1.0/bin/gcc /usr/bin/gcc

注:原gcc指向/usr/bin/x86_64-linux-gnu-gcc-11

替换g++:

sudo ln -sf /usr/local/gcc13.1.0/bin/g++ /usr/bin/g++

注:原g++指向/usr/bin/x86_64-linux-gnu-g++-11

执行完这一步,你可以运行gcc --version或者g++ --version来查看gcc或g++的版本,如果版本变了,就是替换成功了。

5、替换libstdc++库

更新g++之后,需要同时更新c++的动态库,不然无法运行新的g++动态链接的程序

sudo ln -sf  /usr/local/gcc13.1.0/lib64/libstdc++.so.6.0.31 /usr/lib/x86_64-linux-gnu/libstdc++.so.6

注:原libstdc++.so.6指向 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.29


感谢:软件技术就是生产力 deepin20 升级gcc9.5教程 虽然比较粗糙但是也提供了一些帮助

类似的帖子收集在:https://bbs.deepin.org/zh/post/255506


水贴结束……………………pride

Reply Favorite View the author
All Replies
wlly-lzh
deepin
2023-08-12 02:11
#1

沙发!pride

同样的情况,一些大佬可能会选择使用docker来解决问题

像我这样的菜鸟只能表示不会,嘻嘻嘻

Reply View the author
世事大梦一场
deepin
2023-08-12 02:32
#2

社区版20.9尝试到第三步检查依赖时,出现报错

checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking target system type... x86_64-pc-linux-gnu
checking for a BSD-compatible install... /usr/bin/install -c
checking whether ln works... yes
checking whether ln -s works... yes
checking for a sed that does not truncate output... /usr/bin/sed
checking for gawk... gawk
checking for libatomic support... yes
checking for libitm support... yes
checking for libsanitizer support... yes
checking for libvtv support... yes
checking for libphobos support... yes
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for gcc option to accept ISO C99... none needed
checking for g++... no
checking for c++... no
checking for gpp... no
checking for aCC... no
checking for CC... no
checking for cxx... no
checking for cc++... no
checking for cl.exe... no
checking for FCC... no
checking for KCC... no
checking for RCC... no
checking for xlC_r... no
checking for xlC... no
checking whether we are using the GNU C++ compiler... no
checking whether g++ accepts -g... no
checking whether g++ accepts -static-libstdc++ -static-libgcc... no
checking for gnatbind... no
checking for gnatmake... no
checking whether compiler driver understands Ada and is recent enough... no
checking for gdc... no
checking whether the D compiler works... no
checking how to compare bootstrapped objects... cmp --ignore-initial=16
checking whether g++ supports C++11 features by default... no
checking whether g++ supports C++11 features with -std=gnu++11... no
checking whether g++ supports C++11 features with -std=gnu++0x... no
checking whether g++ supports C++11 features with -std=c++11... no
checking whether g++ supports C++11 features with +std=c++11... no
checking whether g++ supports C++11 features with -h std=c++11... no
checking whether g++ supports C++11 features with -std=c++0x... no
checking whether g++ supports C++11 features with +std=c++0x... no
checking whether g++ supports C++11 features with -h std=c++0x... no
configure: error: *** A compiler with support for C++11 language features is required.

Reply View the author
wlly-lzh
deepin
2023-08-12 02:45
#3
世事大梦一场

社区版20.9尝试到第三步检查依赖时,出现报错

checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking target system type... x86_64-pc-linux-gnu
checking for a BSD-compatible install... /usr/bin/install -c
checking whether ln works... yes
checking whether ln -s works... yes
checking for a sed that does not truncate output... /usr/bin/sed
checking for gawk... gawk
checking for libatomic support... yes
checking for libitm support... yes
checking for libsanitizer support... yes
checking for libvtv support... yes
checking for libphobos support... yes
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for gcc option to accept ISO C99... none needed
checking for g++... no
checking for c++... no
checking for gpp... no
checking for aCC... no
checking for CC... no
checking for cxx... no
checking for cc++... no
checking for cl.exe... no
checking for FCC... no
checking for KCC... no
checking for RCC... no
checking for xlC_r... no
checking for xlC... no
checking whether we are using the GNU C++ compiler... no
checking whether g++ accepts -g... no
checking whether g++ accepts -static-libstdc++ -static-libgcc... no
checking for gnatbind... no
checking for gnatmake... no
checking whether compiler driver understands Ada and is recent enough... no
checking for gdc... no
checking whether the D compiler works... no
checking how to compare bootstrapped objects... cmp --ignore-initial=16
checking whether g++ supports C++11 features by default... no
checking whether g++ supports C++11 features with -std=gnu++11... no
checking whether g++ supports C++11 features with -std=gnu++0x... no
checking whether g++ supports C++11 features with -std=c++11... no
checking whether g++ supports C++11 features with +std=c++11... no
checking whether g++ supports C++11 features with -h std=c++11... no
checking whether g++ supports C++11 features with -std=c++0x... no
checking whether g++ supports C++11 features with +std=c++0x... no
checking whether g++ supports C++11 features with -h std=c++0x... no
configure: error: *** A compiler with support for C++11 language features is required.

它提示没有c++编译器,可能需要安装g++。

Reply View the author
世事大梦一场
deepin
2023-08-12 02:49
#4
wlly-lzh

它提示没有c++编译器,可能需要安装g++。

不会吧,g++居然还要我自己安装

感谢讲解

Reply View the author
世事大梦一场
deepin
2023-08-12 03:08
#5
wlly-lzh

它提示没有c++编译器,可能需要安装g++。

我发现这个安装包里没有Makefile文件,这可咋整

sudo make -j 6

出错

make: *** 没有指明目标并且找不到 makefile。 停止。

Reply View the author
wlly-lzh
deepin
2023-08-12 03:17
#6
世事大梦一场

不会吧,g++居然还要我自己安装

感谢讲解

提醒一下,这样做是有风险的,系统可能会崩。

这里是来自某大佬的警告:珍惜你还能用deepin的时间吧

如果真的要搞,记得备份重要数据。

最后祝你的系统没有崩。

Reply View the author
世事大梦一场
deepin
2023-08-12 03:22
#7
wlly-lzh

提醒一下,这样做是有风险的,系统可能会崩。

这里是来自某大佬的警告:珍惜你还能用deepin的时间吧

如果真的要搞,记得备份重要数据。

最后祝你的系统没有崩。

既然这样,那我还是用docker吧

Reply View the author