首页
论坛
课程
招聘
[原创]多版本gcc/g++共存方案
2021-11-26 09:06 17461

[原创]多版本gcc/g++共存方案

2021-11-26 09:06
17461

Description

有时需要进行交叉编译的时候,可能需要在高版本的架构上编译一个低版本的工具来运行到一个旧平台上。高版本的架构一般自带的都是高版本工具,这样编译出来的工具无法在低版本架构上运行,所以就有了多版本编译器共存的情况。这里我们以 gcc 为例简单说一下多版本 gcc 共存的解决方案,其实很简单。

安装低版本gcc/g++

在高版本的 Linux 上的源里是不能直接 apt 去安装低版本的 gcc/g++ 的,所以这里简单记录下如何在高版本的 Ubuntu 上也可以直接 apt 安装。

  1. 换源

    既然高版本的源里没有安装包,直接更新一下低版本的源好了。以 gcc-4.8 为例,这里首先把 ubuntu 16.04 的源更新到 /etc/apt/sources.list中去:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # official
    deb http://dk.archive.ubuntu.com/ubuntu/ xenial main
    deb http://dk.archive.ubuntu.com/ubuntu/ xenial universe
     
    # 国内源aliyun
    deb http://mirrors.aliyun.com/ubuntu/ xenial main
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial main
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main
    deb http://mirrors.aliyun.com/ubuntu/ xenial universe
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial universe
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security main
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe

    然后 sudo apt update 一下,把包资源更新进来。

  2. 安装

    可以先查看一下版本信息:sudo apt-cache policy gcc-4.8 ,作用类似于搜索,下面所有能安装的子版本都会列出来。然后直接 apt install 对应的版本即可。
    这种方法不管想安装什么版本的旧软件,只要有对应的更新源即可。

版本控制

  1. 第一种方法:

    直接在使用时指定 CC 或 CXX,跟上对应版本的 gcc/g++ 的绝对路径即可。个人感觉这样会更方便一点,只要在编译的时候指定一下变量即可。

  2. 第二种方法:

    设置优先级:

    1
    2
    3
    4
    5
    $ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 40
    $ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90
    $ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++4.8 40
    $ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 90
    #

    数字越大,表示优先级越高,上面的例子中就是优先使用 gcc-9 ,这个具体的数字不用特别关注,只要能体现出来大小来表达优先级就可以。

    删除设置的优先级:

    1
    $ sudo update-alternatives --remove /usr/bin/g+±4.8

    切换版本可以通过以下命令:

    1
    2
    $ sudo update-alternatives --config gcc
    $ sudo update-alternatives --config g++

    选择对应的数字即可,然后回车即可切换版本。

Others

在使用 gcc-4.8 静态编译 gdbserver 的时候遇到错误:

1
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbeginT.o: relocation R_X86_64_32 against `__TMC_END__' can not be used when making a shared object; recompile with -fPIC

解决办法其实很简单,在 make 之前进行文件 copy:

1
2
3
$ cd /usr/lib/gcc/x86_64-linux-gnu/4.8
$ sudo cp crtbeginT.o crtbeginT.orig.o
$ sudo cp crtbeginS.o crtbeginT.o

然后就可以加上-fPIC -static 参数进行静态编译。

 

make 完成之后,记得再改回来:

1
2
3
$ cd /usr/lib/gcc/x86_64-linux-gnu/4.8
$ sudo cp crtbeginT.orig.o crtbeginT.o
$ sudo rm crtbeginT.orig.o

上述问题是 gcc 的一个 Bug,解决方案就如我们上面的操作一样。


【公告】 [2022大礼包]《看雪论坛精华22期》发布!收录近1000余篇精华优秀文章!

最后于 2021-11-26 09:14 被有毒编辑 ,原因:
收藏
点赞1
打赏
分享
最新回复 (4)
雪    币: 5871
活跃值: 活跃值 (1038)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
TopC 活跃值 2021-11-27 17:54
2
0
如果libc的版本太高,低版本的gcc应该也运行不了吧
雪    币: 14779
活跃值: 活跃值 (12841)
能力值: (RANK:730 )
在线值:
发帖
回帖
粉丝
有毒 活跃值 10 2021-11-29 09:04
3
0
TopC 如果libc的版本太高,低版本的gcc应该也运行不了吧
libc切版本好切,你直接指定就行了,方法有好几种。
雪    币: 978
活跃值: 活跃值 (830)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
HOWMP 活跃值 1 2021-11-30 22:12
4
0

可以考虑用docker,从4.8到最新都有 https://hub.docker.com/_/gcc?tab=tags&page=1&ordering=-last_updated

最后于 2021-11-30 22:12 被HOWMP编辑 ,原因:
雪    币: 14779
活跃值: 活跃值 (12841)
能力值: (RANK:730 )
在线值:
发帖
回帖
粉丝
有毒 活跃值 10 2021-12-1 08:46
5
0
HOWMP 可以考虑用docker,从4.8到最新都有 https://hub.docker.com/_/gcc?tab=tags&page=1&ordering ...
嗯嗯,师傅好思路。主要是我的场景没办法用docker,就用原始方法了
游客
登录 | 注册 方可回帖
返回