记录一下gcc简单安装步骤
- 下载源码包:
https://ftp.gnu.org/gnu/gcc/gcc-10.2.0/gcc-10.2.0.tar.gz - 解压后进入文件夹使用自带脚本下载依赖包:./contrib/download_prerequisites
- 创建build目录,cd build后:./…/configure --prefix=install路径 --disable-checking --disable-multilib --enable-languages=c,c++
- make && make install
- 如果出现以下报错,注意gcc的lib路径(环境要干净)
报错:/public/home/lijn/soft/gcc-9.1.0/host-x86_64-pc-linux-gnu/prev-gcc/cc1: /public/home/lijn/soft/gcc-9.1.0/x86_64-pc-linux-gnu/libstdc+±v3/src/.libs/libstdc++.so.6: versionGLIBCXX_3.4.29’ not found (required by /public/home/lijn/soft/gcc-9.1.0/host-x86_64-pc-linux-gnu/prev-gcc/cc1)
-
查看下cc1:/public/home/lijn/soft/gcc-9.1.0/host-x86_64-pc-linux-gnu/prev-gcc/cc1 -v
-
查看下装的gcc中libstdc++.so.6链接的库:
[lijn@Stream9 gcc-9.1.0]$ ldd /public/home/lijn/soft/gcc-9.1.0/x86_64-pc-linux-gnu/libstdc+±v3/src/.libs/libstdc++.so.6
linux-vdso.so.1 (0x00007ffe6bd94000)
libm.so.6 => /usr/lib64/libm.so.6 (0x00007f59b8bc9000)
libc.so.6 => /usr/lib64/libc.so.6 (0x00007f59b8800000)
/lib64/ld-linux-x86-64.so.2 (0x00007f59b8e86000)
libgcc_s.so.1 => /usr/lib64/libgcc_s.so.1 (0x00007f59b8bae000) -
搜索libstdc++.so.6库中指定的符号:可以看到装的gcc需要的这个库中确实没有3.4.29的
[lijn@Stream9 gcc-9.1.0]$ nm /public/home/lijn/soft/gcc-9.1.0/x86_64-pc-linux-gnu/libstdc+±v3/src/.libs/libstdc++.so.6 | grep “3.4.2”
0000000000000000 A GLIBCXX_3.4.2
0000000000000000 A GLIBCXX_3.4.20
0000000000000000 A GLIBCXX_3.4.21
0000000000000000 A GLIBCXX_3.4.22
0000000000000000 A GLIBCXX_3.4.23
0000000000000000 A GLIBCXX_3.4.24
0000000000000000 A GLIBCXX_3.4.25
0000000000000000 A GLIBCXX_3.4.26 -
查看系统中cc1的链接文件:
[lijn@Stream9 gcc-9.1.0]$ ldd /public/home/lijn/soft/gcc-9.1.0/host-x86_64-pc-linux-gnu/prev-gcc/cc1
linux-vdso.so.1 (0x00007ffc7ccfe000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f72df800000)
libm.so.6 => /usr/lib64/libm.so.6 (0x00007f72dfab3000)
libgcc_s.so.1 => /usr/lib64/libgcc_s.so.1 (0x00007f72dfa98000)
libc.so.6 => /usr/lib64/libc.so.6 (0x00007f72df400000)
/lib64/ld-linux-x86-64.so.2 (0x00007f72dfb90000) -
libstdc++.so.6最终链接到libstdc++.so.6.0.29
[lijn@Stream9 gcc-9.1.0]$ ll /usr/lib64/libstdc++.so.6*
lrwxrwxrwx. 1 root root 19 Mar 30 06:13 /usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.29
-rwxr-xr-x. 1 root root 2306432 Mar 30 06:17 /usr/lib64/libstdc++.so.6.0.29
[lijn@Stream9 gcc-9.1.0]$ file /usr/lib64/libstdc++.so.6.0.29
/usr/lib64/libstdc++.so.6.0.29: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, BuildID[sha1]=47e2a171712a54733a4cb06672df78fd1a1281a1, stripped
[lijn@Stream9 gcc-9.1.0]$ nm /usr/lib64/libstdc++.so.6.0.29
nm: /usr/lib64/libstdc++.so.6.0.29: no symbols
-
查看libstdc++.so.6.0.29中关键字:可以看到系统库中是存在3.4.29版本的
[lijn@Stream9 gcc-9.1.0]$ readelf -s /usr/lib64/libstdc++.so.6.0.29 | grep “3.4.29”
304: 000000000019de00 73 FUNC WEAK DEFAULT 14 […]@@GLIBCXX_3.4.29
312: 00000000000c7180 946 FUNC GLOBAL DEFAULT 14 […]@@GLIBCXX_3.4.29
404: 0000000000000000 0 OBJECT GLOBAL DEFAULT ABS GLIBCXX_3.4.29
496: 00000000001a1d50 147 FUNC WEAK DEFAULT 14 […]@@GLIBCXX_3.4.29
639: 00000000001a1350 600 FUNC WEAK DEFAULT 14 […]@@GLIBCXX_3.4.29
677: 00000000001a2380 147 FUNC WEAK DEFAULT 14 […]@@GLIBCXX_3.4.29
763: 000000000019d9f0 248 FUNC WEAK DEFAULT 14 […]@@GLIBCXX_3.4.29
868: 00000000000d9260 595 FUNC GLOBAL DEFAULT 14 […]@@GLIBCXX_3.4.29
934: 000000000019f890 266 FUNC WEAK DEFAULT 14 […]@@GLIBCXX_3.4.29
1113: 000000000019fb20 188 FUNC WEAK DEFAULT 14 […]@@GLIBCXX_3.4.29 -
改装的gcc编译器中配置选项:
装gcc时候他是链接的自己安装包里面的库,版本低所以没过,但是系统有满足要求的库版本,所以修改其配置文件,使其编译过程默认链接系统的libstdcxx库
[lijn@Stream9 gcc-9.1.0]$ ./configure --help | grep lib
–libexecdir=DIR program executables [EPREFIX/libexec]
–libdir=DIR object code libraries [EPREFIX/lib]
–disable-libquadmath do not build libquadmath directory
–disable-libquadmath-support
disable libquadmath support for Fortran
–enable-libada build libada directory
–enable-libssp build libssp directory
–disable-libstdcxx do not build libstdc+±v3 directory
–enable-liboffloadmic=ARG