openSUSE Leap 15.1 安装 gcc9

我用的系统是opensuse15.1,gcc版本:
[cqs@linux-xcd4:/usr]$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib64/gcc/x86_64-suse-linux/7/lto-wrapper
OFFLOAD_TARGET_NAMES=hsa:nvptx-none
Target: x86_64-suse-linux
Configured with: …/configure --prefix=/usr --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib64 --libexecdir=/usr/lib64 --enable-languages=c,c++,objc,fortran,obj-c++,ada,go --enable-offload-targets=hsa,nvptx-none=/usr/nvptx-none, --without-cuda-driver --enable-checking=release --disable-werror --with-gxx-include-dir=/usr/include/c++/7 --enable-ssp --disable-libssp --disable-libvtv --disable-libcc1 --disable-plugin --with-bugurl=https://bugs.opensuse.org/ --with-pkgversion=‘SUSE Linux’ --with-slibdir=/lib64 --with-system-zlib --enable-libstdcxx-allocator=new --disable-libstdcxx-pch --enable-version-specific-runtime-libs --with-gcc-major-version-only --enable-linker-build-id --enable-linux-futex --enable-gnu-indirect-function --program-suffix=-7 --without-system-libunwind --enable-multilib --with-arch-32=x86-64 --with-tune=generic --build=x86_64-suse-linux --host=x86_64-suse-linux
Thread model: posix
gcc version 7.4.1 20190424 [gcc-7-branch revision 270538] (SUSE Linux)

我现在想安装gcc9,但又想保留原来版本的gcc7和gcc8,我应该怎么安装呢?
按照网上多版本gcc的安装方法,他们是直接从源里面安装的,然后利用update-alternatives切换本版,但我发现opensuse15.1源中最高本版是gcc8;我也参考了网上直接编译源码安装的方法,但这样会覆盖原来的旧版本gcc7吧!
在了解多版本gcc共存的时候,我有个疑问,不同版本的gcc,用的so库(比如libc,libstdc++)版本是不是一样的呢,用的头文件是不是一样的呢,如果不一样,他们应该分开目录存放才对?下面是我搜索了gcc7的目录:

[cqs@linux-xcd4:/usr]$ find -name 7 -a -type d
./include/c++/7
./lib64/gcc/x86_64-suse-linux/7
./lib64/go/7
./lib/hpc/compiler/gnu/7
./share/terminfo/7
./share/texmf/tex4ht/ht-fonts/iso8859/7

这样的话,是不是说明gcc7和gcc8共用同个版本的so库呢?如果我采用编译源码的方式安装gcc9,我应该怎么和 gcc7、gcc8区别开来呢?

编译源码的话会默认安装到/usr/local下面,这样就可以跟系统的gcc7, gcc8区分开了。

1赞

devel 源里貌似有 gcc9

1赞

依据我的观察,应该是无关,因为我机器上(leap15)只有gcc7,但是libstdc++是gcc8的。不过libstdc+±devel有分gcc7和gcc8的版本。
而且你这个搜索结果里不是已经表现出来7有单独目录了吗……

1赞

我加入devel源后,可以安装了,谢谢!!!

如果源上有就最好了,我懒得编译:rofl:

对,我发现某些库是有分开目录的,那是不是调用不同版本的gcc就会到对应目录下找头文件和库呢

gcc这个包是一个虚包,依赖于任何一个版本的gcc
实际操作的时候gcc的版本取决于你最后装的是哪个版本,当然也可以用update-alternatives来改。

头文件是可以多版本共存的,至少C++是这样的。

你用到的.so库版本取决于你当前系统glibc或者其他外部组件版本,跟编译器版本没有直接关系。
.so是英语Shared object的缩写,直译为共享对象,相当于Windows里的dll(dynamic-link library)。
除非编译时明确要求静态编译,编译器不会把glibc和其他外部组件连接到你编译出的文件中,而是调用相应的so文件。这些组件应该在打包时以定义依赖的方式,或者在源码readme里明确标出。

举一个例子,比如Leap 15.1现在用的是2.26版本的glibc,你的C文件里用到了stdio.hcario.h

编译时编译器需要stdio.hcario.h来定义你程序中所使用的标准C函数和cairo函数,这两个文件随包glibc-develcairo-devel提供。缺少这两个文件或包会因为函数、符号未定义和找不到头文件而无法编译。

运行时操作系统需要libc-2.26.solibcairo.so.2来调用glibccairo的函数,这两个文件随glibclibcairo2提供。缺少这两个文件会使程序无法正常运行。

如果编译时没有明确指定glibc或者其他外部组件的版本,那么他编译的时候就会在二进制文件里标出依赖当前系统已安装的glibc-devel或者其他组件的devel包版本。

通常包名结尾有devel字样的包都为包含头文件的包,开头有lib字样或者没有devel字样的包都为运行时需要的运行库包

2赞

我觉得gcc版本没有那么重要,只要不是什么C99、C++11都不支持的上古版本应该都没问题

1赞

其实主要是ABI问题,如果确定ABI兼容那就随便用,最多是语法支持程度不同(gcc7应该已经很够用了)

1赞

头文件肯定是,库的话……应该也是吧,这个我不敢保证,等dalao吧

1赞

了解了,多谢耐心解答~

现在的 gcc8, gcc9 其实应该叫 gcc 5.x

本质上没有太大区别,都是在飙版本号,没有大改进。