更改gcc默认版本(gcc版本降级/升级)

本文介绍如何在Ubuntu 16.04中安装并设置旧版本GCC为默认编译器,适用于编译老旧项目。步骤包括安装所需GCC版本、设置默认版本、验证设置及回滚方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

更改gcc默认版本(gcc版本降级/升级)

Ubuntu系统升级到16.04以后,gcc的版本变为6.2,编译比较老的项目编译不过,需要将gcc版本降级到ubunt14.04时候4.8版本.

可以让系统存在两个gcc版本,4.8和6.2,但是默认的gcc版本为4.8(编译老的项目,直接make).而更高的版本6.2则可以留着供自己平时指定使用.

按照如下步骤即可:

(1)在Ubuntu 16.04上安装老版gcc十分简单,直接用apt-get命令下载即可.

sudo apt-get install gcc-4.8

 

安装完成后输入命令gcc --verison查看gcc的版本,此时还是6.2
(2)设置gcc的默认版本
设置之前可以先输入命令ls /usr/bin/gcc* 查看gcc 4.8版本是否安装成功
然后输入下面的命令设置默认版本:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 100
最后的数字为优先级(越大越高),因为只有一个4.8版本作为alternatives,可以不要纠结数字,这样设就行了
(3)然后可以输入以下命令查看设置结果(非必须)
sudo update-alternatives --config gcc
  • 因为只设置了一个,所以显示结果为:"链接组 gcc (提供 /usr/bin/gcc)中只有一个候选项:/usr/bin/gcc-4.8
    无需配置.",如果有多个则会显示一个按优先级的列表.
(4)最后再次输入命令gcc -version查看gcc的版本已经变成4.8啦...就成功啦.
现在默认版本已经是4.8版本,如果想用6.2版本,则gcc-6.2 这样指定就好啦

g++ 等其他软件也是这样设置进行版本升级/降级.

ps:

(1)当以上设置不需要的时候输入以下命令删除:

sudo update-alternatives --remove gcc /usr/bin/gcc-4.8

(2)当时设置g++的时候,命令复制的太快,导致没有将gcc全部替换掉,变成这样

sudo update-alternatives --install /usr/bin/g++ gcc /usr/bin/g++-4.8 

,导致g++链接到了gcc.当时怎么也修复不好,上面的--remove命令也无效,...别急,只要将gcc设置的那个命令重新设置一下,然后再重新设置g++就好了.Linux下输入命令要小心,不然有的真的不知道怎么恢复.

<think>我们正在讨论的是在不联网的麒麟V10虚拟机中降级GCC版本可能遇到的问题及注意事项。由于是降级操作,与升级操作相比,会有一些不同的挑战。 主要问题及注意事项: 1. **依赖关系破坏**: - 降级GCC可能会破坏系统中其他软件包对高版本GCC的依赖。例如,某些软件可能是在高版本GCC下编译的,降级后可能导致这些软件无法运行或出现兼容性问题。 - 注意:麒麟V10系统本身可能依赖特定版本GCC降级前需要确认系统组件兼容性。 2. **手动降级操作复杂**: - 降级GCC通常需要手动编译安装目标版本,但编译低版本GCC时可能依赖当前高版本GCC的一些特性,形成循环依赖(即高版本GCC编译的低版本GCC可能不兼容,但这里降级一般不会遇到,因为低版本GCC通常用低版本工具链编译,但注意编译环境可能要求不高)。 - 然而,如果当前系统已经升级到高版本GCC,再编译低版本GCC时,可能因为高版本GCC的某些新特性或弃用特性导致编译失败。 3. **库版本冲突**: - 降级GCC后,其配套的运行时库(如libstdc++.so)也会降级。如果系统中存在使用高版本C++特性的程序,在运行时可能因为找不到高版本的符号而崩溃。 - 例如:降级后,运行依赖高版本C++ABI的程序会出现类似`undefined symbol: _ZSt28__throw_bad_array_new_lengthv`的错误。 4. **环境变量和链接配置**: - 降级后需要更新环境变量,确保新降级GCC路径在系统路径之前。同时,使用`update-alternatives`来管理多个GCC版本,避免混乱。 - 注意:如果之前使用过`update-alternatives`管理,降级后需要重新配置。 5. **内核头文件和系统库兼容性**: - 降级后的GCC版本可能和当前系统的内核头文件不兼容。麒麟V10的内核头文件可能针对默认GCC版本进行过调整,降级到过低版本可能导致编译内核模块失败。 6. **离线环境依赖包缺失**: - 降级GCC需要编译,编译过程需要依赖一些开发工具和库(如make, binutils, glibc-devel等),这些在离线环境中如果没有预先安装,会导致编译失败。 7. **回退计划**: - 在降级前,建议备份当前GCC版本,以便在降级失败时能够回退。可以通过备份GCC相关的二进制文件、库文件和头文件来实现。 操作步骤建议: 1. **确认降级目标版本**: - 确定需要降级GCC版本,并检查该版本与麒麟V10的兼容性。 2. **准备离线编译环境**: - 在联网环境中下载目标GCC版本的源码包及其依赖库(gmp, mpfr, mpc等),并传输到离线虚拟机中。 3. **卸载高版本GCC(谨慎)**: - 通常不建议直接卸载系统自带的GCC,因为系统工具可能依赖它。而是采用编译安装到独立路径(如`/usr/local/gcc-version`)的方式,然后通过环境变量或`update-alternatives`切换。 4. **编译安装目标版本**: - 按照标准流程编译安装,注意指定安装路径,避免覆盖系统默认GCC。 - 编译配置示例: ```bash tar -xf gcc-4.8.5.tar.gz cd gcc-4.8.5 ./contrib/download_prerequisites # 如果已下载依赖包,可手动解压并创建软链接 mkdir build && cd build ../configure --prefix=/usr/local/gcc-4.8.5 --disable-multilib --enable-languages=c,c++ make -j$(nproc) sudo make install ``` 5. **切换版本**: - 使用`update-alternatives`设置版本优先级: ```bash sudo update-alternatives --install /usr/bin/gcc gcc /usr/local/gcc-4.8.5/bin/gcc 48 sudo update-alternatives --install /usr/bin/g++ g++ /usr/local/gcc-4.8.5/bin/g++ 48 sudo update-alternatives --config gcc # 选择48对应的编号 sudo update-alternatives --config g++ # 同上 ``` 6. **验证并测试**: - 运行`gcc -v`检查版本。 - 编译测试程序,并检查运行是否正常。 7. **处理运行时库问题**: - 如果程序运行出现库问题,可能需要设置`LD_LIBRARY_PATH`: ```bash export LD_LIBRARY_PATH=/usr/local/gcc-4.8.5/lib64:$LD_LIBRARY_PATH ``` 或者将新路径添加到`/etc/ld.so.conf.d/gcc-4.8.5.conf`并运行`ldconfig`。 注意事项: - **谨慎卸载系统自带GCC**:麒麟V10系统工具可能依赖于系统自带的GCC版本,卸载可能导致系统不稳定。 - **备份**:在操作前备份重要数据,包括当前GCC相关文件。 - **测试**:降级后,全面测试系统功能及关键应用程序。 引用说明:用户提到麒麟操作系统切换内核有风险,同样,降级GCC也是系统级操作,需谨慎[^1]。 相关问题: 1. 如何备份麒麟V10系统中的GCC版本? 2. 降级GCC后如何恢复原来的版本? 3. 如何解决降级GCC后出现的动态库链接错误? 4. 在麒麟V10中如何同时保留多个GCC版本? 5. 降级GCC版本后,如何修复因C++ ABI不兼容导致的程序崩溃?</think>在不联网的麒麟V10虚拟机中降级GCC版本,可能遇到以下关键问题及注意事项: --- ### **核心问题** #### **1. 依赖库降级冲突** - **问题描述**: 高版本GCC编译的软件(如`glibc`、`libstdc++`)可能依赖新版ABI(应用二进制接口),降级GCC会导致**动态库符号缺失**。例如: ```bash /usr/lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found ``` 引用[1]中提到的内核切换风险类似,库版本冲突可能引发系统级不稳定[^1]。 #### **2. 系统工具链断裂** - **问题描述**: 麒麟V10系统工具(如`yum`、`dnf`)依赖特定GCC版本编译的Python组件,降级可能导致**包管理器崩溃**: ```bash ImportError: /lib64/libpython3.6m.so.1.0: undefined symbol: _ZSt28__throw_bad_array_new_lengthv ``` #### **3. 内核模块兼容性问题** - **问题描述**: 已加载的内核模块(如`nvidia`驱动、`vfio-pci`)若由高版本GCC编译,降级后**无法重新加载**: ```bash insmod: ERROR: could not insert module: Invalid module format ``` 引用[1]指出内核修改风险高,此问题可能导致虚拟机功能异常[^1]。 #### **4. 头文件不兼容** - **问题描述**: 高版本GCC安装的`/usr/include/c++/11/*`头文件与旧版编译器**语法不兼容**,编译时报错: ```bash error: ‘std::string_view’ has not been declared ``` --- ### **操作注意事项** #### **1. 安全降级流程** ```mermaid graph LR A[备份系统] --> B[卸载高版本GCC] B --> C[安装旧版依赖库] C --> D[编译旧版GCC] D --> E[修复符号链接] ``` #### **2. 关键步骤** 1. **备份系统**: ```bash sudo tar -cvpzf /backup/gcc_backup.tar.gz --exclude=/proc --exclude=/sys / ``` 2. **卸载高版本GCC**(避免直接删除系统GCC): ```bash sudo update-alternatives --remove-all gcc # 解除版本绑定 sudo rpm -e --nodeps gcc-9.3.0-1.ky10 # 仅删除非系统版本 ``` 3. **安装旧版依赖库**(需提前离线下载): ```bash sudo rpm -ivh --oldpackage gmp-6.1.2-10.ky10.aarch64.rpm sudo rpm -ivh --oldpackage mpfr-3.1.6-1.ky10.aarch64.rpm ``` 4. **编译旧版GCC**(以GCC 7.3为例): ```bash ./configure --prefix=/opt/gcc-7.3 \ --disable-multilib \ --with-system-zlib \ --enable-languages=c,c++ make -j$(nproc) sudo make install ``` 5. **修复符号链接**: ```bash sudo ln -sf /opt/gcc-7.3/bin/gcc /usr/bin/gcc sudo ldconfig # 重建库缓存 ``` #### **3. 风险规避措施** - **不删除系统GCC**:保留`/usr/bin/gcc`系统默认版本,将降级版本安装到`/opt` - **ABI兼容性检查**: ```bash strings /usr/lib64/libstdc++.so.6 | grep CXXABI # 确认支持的ABI版本 ``` - **虚拟机快照**:操作前创建VMware虚拟机快照,引用[1]提到虚拟机实验更安全[^1] --- ### **验证方法** 1. **版本检查**: ```bash gcc -v # 输出应为目标版本(如7.3.0) ``` 2. **ABI兼容测试**: ```c++ // test_abi.cpp #include <iostream> int main() { std::cout << __cplusplus << std::endl; // C++11应为201103L return 0; } ``` ```bash g++ test_abi.cpp -o test_abi && ./test_abi ``` 3. **系统工具验证**: ```bash yum list installed # 确认包管理器功能正常 ``` --- ### **紧急恢复方案** 若降级后系统崩溃: 1. 通过VMware控制台进入救援模式 2. 还原备份: ```bash sudo tar -xvpzf /backup/gcc_backup.tar.gz -C / ``` 3. 重建内核镜像: ```bash sudo dracut --regenerate-all --force # 重制initramfs ``` > 引用说明:内核操作风险高,虚拟机环境务必提前备份[^1] ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值