简介:这份资源面向在 Ubuntu 18.04 环境下需要离线部署 GCC 编译工具链的开发者和运维人员,尤其适合内网服务器、无外网条件的实验环境或需要固定 GCC 7 版本进行 C/C++ 项目构建的场景。压缩包共 25 个文件,以 24 个 deb 安装包和 1 个 sh 脚本为主,整体约 20.05MB,deb 包覆盖 gcc-7、cpp-7、binutils 及 libasan、libgomp、libitm 等运行时与开发库依赖,sh 脚本用于批量安装,省去逐条 dpkg 的繁琐操作。目前已有 3205 人学习下载,说明该离线方案在同类需求中具备一定参考价值。借助这份资源,读者可一次性补齐 GCC 7 所需的编译器、链接器与底层库,避免因依赖缺失导致安装中断,同时便于在无网络机器上快速复现一致的编译环境,降低版本不一致带来的构建风险。
1. 从一台离线机器说起:为什么我坚持手动装 gcc7
上周帮一个做嵌入式的朋友处理一台内网 Ubuntu 18.04 机器,系统自带的 gcc 是 7.5.0,但项目里有个老模块死活编不过,报错指向std::filesystem链接失败。他第一反应是apt install gcc-7,结果那台机器压根连不上外网源,apt update直接卡死。这种场景其实特别常见——Ubuntu 18.04 默认就是 gcc 7 系列,但很多人拿到的是一个被裁剪过的镜像,或者需要在一个完全隔离的环境里补齐编译链。ubuntu18.04gcc.zip这类资源包解决的就是这个问题:把 gcc7 相关的 deb 包和依赖一次性备齐,用 dpkg 本地安装,不依赖网络。如果你也卡在“系统里有 gcc 但版本不对”“apt 装不上”“离线环境没法补包”这几个坑里,下面这套流程可以直接抄。
2. 装之前先对账:gcc7 在 Ubuntu 18.04 上的依赖清单
2.1 为什么不能只丢一个 gcc-7 的 deb 进去
很多人拿到 zip 包,解压看到一堆.deb,第一反应是dpkg -i gcc-7*.deb,然后就是满屏的依赖错误。gcc 不是一个孤立的可执行文件,它依赖cpp-7、gcc-7-base、libgcc-7-dev、libisl、libmpc、libmpfr这一串。Ubuntu 18.04 的 gcc-7 包结构大致是这样的:
| 包名 | 作用 | 是否必须 |
|---|---|---|
| gcc-7-base | 基础文件,提供版本信息 | 是 |
| cpp-7 | 预处理器 | 是 |
| gcc-7 | 编译器主体 | 是 |
| libgcc-7-dev | 运行时库和头文件 | 是 |
| libgcc1 | GCC 底层运行时 | 通常系统已有 |
| libisl15 / libmpc3 / libmpfr4 | 优化和数学库 | 是 |
| binutils | 链接器 as、ld | 通常系统已有 |
我一般会先dpkg -l | grep gcc看一眼当前系统里已经有什么。如果gcc-7-base已经存在但版本是 7.3.0,而 zip 里是 7.5.0,那就得先升级 base 再装主体,顺序反了会触发dpkg的版本冲突。
2.2 版本对齐:7.3、7.4、7.5 到底选哪个
Ubuntu 18.04 的生命周期里,gcc-7 的小版本一直在动。7.3.0 是 18.04 初始镜像自带的,7.4.0 是 18.04.2 之后的更新,7.5.0 是最终稳定版。如果你只是要一个能编译 C/C++14 的环境,7.3.0 就够;但如果代码里用了 C++17 的某些特性,7.5.0 的修复更完整。ubuntu18.04gcc.zip里如果同时包含多个小版本,不要混装——dpkg不允许同一个包名存在两个版本。判断方法很简单:
# 查看当前已安装的 gcc 相关包版本 dpkg -l | grep -E 'gcc-7|cpp-7|libgcc-7' | awk '{print $2, $3}'输出里如果gcc-7显示7.5.0-3ubuntu1~18.04,而 zip 里是7.4.0-1ubuntu1~18.04,那就别降级,直接用系统已有的。降级需要--force-downgrade,风险高,除非有明确的回归测试需求。
2.3 离线安装前的环境检查清单
在动手dpkg之前,我习惯跑一遍这几条检查,避免装到一半发现缺东西:
# 1. 确认系统版本,必须是 18.04 lsb_release -a # 2. 确认架构,一般是 amd64 dpkg --print-architecture # 3. 确认 /usr/bin/gcc 当前指向 ls -l /usr/bin/gcc # 4. 确认磁盘空间,gcc 全套装完大概 200MB 左右 df -h /usr如果lsb_release显示的不是 18.04,比如是 20.04,那这套 deb 包大概率装不上,因为依赖的 libc 版本不匹配。架构如果是 arm64,那 amd64 的包直接不能用,得找对应的交叉编译版本。这些检查花不了两分钟,但能省掉后面半小时的排错。
3. 用 dpkg 本地安装 gcc7:顺序、参数和依赖修复
3.1 解压和包分类:先装 base 再装主体
拿到ubuntu18.04gcc.zip后,先解压到一个临时目录,比如/tmp/gcc7-offline:
# 创建临时目录并解压 mkdir -p /tmp/gcc7-offline unzip ubuntu18.04gcc.zip -d /tmp/gcc7-offline # 进入目录看看有哪些 deb cd /tmp/gcc7-offline ls -1 *.deb解压后不要急着dpkg -i *.deb,因为dpkg处理通配符时是按字母顺序来的,cpp-7会排在gcc-7前面,但gcc-7-base又排在cpp-7前面,顺序其实还行。但更稳妥的做法是手动分批:
# 第一批:基础包和依赖库 sudo dpkg -i gcc-7-base_*.deb libisl15_*.deb libmpc3_*.deb libmpfr4_*.deb # 第二批:预处理器和运行时开发包 sudo dpkg -i cpp-7_*.deb libgcc-7-dev_*.deb # 第三批:编译器主体 sudo dpkg -i gcc-7_*.deb这样分批的好处是,如果第一批就报错,你能立刻定位是基础依赖的问题,而不是被后面一堆错误淹没。dpkg -i的-i就是 install,后面跟包文件名,支持通配符但建议手动指定。
3.2 依赖修复:apt-get -f install 的正确用法
如果dpkg报出dependency problems,别慌,这是离线安装的常态。Ubuntu 的apt有一个修复模式:
# 修复缺失的依赖,-f 是 fix-broken sudo apt-get install -f但注意,这条命令会尝试从网络源下载缺失的包。如果机器完全离线,它会失败。这时候有两个选择:一是从 zip 包里找到对应的依赖 deb 手动补装;二是如果缺失的只是libc6这类系统基础包,而系统里已经有兼容版本,可以用dpkg --force-depends强行安装,但我不推荐——除非你清楚知道这个依赖在当前系统里已经被其他包满足了。
我一般会先跑apt-get install -f --no-download,让它只检查本地缓存,不联网。如果还缺,就dpkg -l | grep ^iU列出所有状态为iU(已解包未配置)的包,逐个看缺什么。
3.3 配置 alternatives:让 gcc 命令指向 gcc-7
装完gcc-7后,系统里可能同时存在gcc-7和默认的gcc(指向 gcc-7 或 gcc-8)。Ubuntu 用update-alternatives管理这个映射:
# 注册 gcc-7 到 alternatives sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 70 # 注册 g++-7(如果 zip 里有 g++-7 的包) sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 70 # 交互式选择默认版本 sudo update-alternatives --config gcc--install的最后一个参数是优先级,数字越大越优先。70 是我习惯给 gcc-7 的权重,如果系统里还有 gcc-8(优先级 80),那默认还是会走 gcc-8。--config会列出所有候选,手动选编号即可。这一步做完,gcc --version应该显示 7.5.0 或你装的对应小版本。
4. 避坑与排查:dpkg 装 gcc7 最常见的五个翻车现场
4.1 现象:dpkg 报 “trying to overwrite … which is also in package”
原因:系统里已经有一个不同版本的gcc-7-base或libgcc-7-dev,dpkg不允许两个包同时拥有同一个文件。常见于之前用apt装过一半,或者镜像里预装了旧版。
解决:先卸载冲突的旧包,但不要--purge,保留配置:
# 查看冲突包的具体版本 dpkg -l | grep gcc-7-base # 卸载旧版(保留配置文件) sudo dpkg -r gcc-7-base # 再重新安装 zip 里的版本 sudo dpkg -i gcc-7-base_*.deb如果dpkg -r也报依赖错误,加--force-depends先卸掉,再补装。
4.2 现象:装完后 gcc --version 还是旧版本
原因:/usr/bin/gcc是一个符号链接,指向/etc/alternatives/gcc,而 alternatives 的优先级没调对,或者gcc-7根本没注册进去。
解决:先确认/usr/bin/gcc-7存在,然后重新注册 alternatives:
# 确认 gcc-7 可执行文件存在 ls -l /usr/bin/gcc-7 # 强制重新注册,优先级设高一点 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 100 sudo update-alternatives --config gcc选完之后hash -r清一下 shell 的命令缓存,再gcc --version。
4.3 现象:编译时报 “cannot find -lstdc++”
原因:只装了gcc-7没装g++-7,或者libstdc++-7-dev缺失。C++ 编译需要额外的运行时库。
解决:从 zip 包里找g++-7和libstdc++-7-dev的 deb,按同样顺序装:
sudo dpkg -i libstdc++-7-dev_*.deb g++-7_*.deb sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 100如果 zip 里没有这两个包,那这个资源包只适合纯 C 项目,C++ 得另找。
4.4 现象:dpkg 卡在 “Setting up” 不动
原因:dpkg在配置阶段会触发ldconfig重建库缓存,如果/etc/ld.so.conf.d/下有指向不存在路径的配置,ldconfig会卡住或报错。
解决:另开一个终端,检查ldconfig是否在跑:
ps aux | grep ldconfig如果在跑但卡住,等一两分钟;如果已经僵死,kill掉再手动跑sudo ldconfig看报什么错。常见的是某个.conf文件里写了不存在的目录,注释掉即可。
4.5 现象:装完后 apt 命令报 “Unmet dependencies”
原因:dpkg安装的包版本和apt数据库里的记录不一致,apt认为有包没配置完。
解决:跑一次sudo apt-get check看具体是哪个包,然后:
# 重新配置所有未配置的包 sudo dpkg --configure -a # 再检查 sudo apt-get check如果apt仍然报错,但gcc已经能正常用,可以暂时忽略——离线环境下apt的状态不完美是常态,不影响编译。
5. 验证 gcc7 是否真正可用:三个必跑的编译测试
装完不验证,等于没装。我一般会跑三个测试,从简到繁,覆盖 C、C++ 和链接场景。
5.1 最小 C 程序:确认编译和运行链路
先写一个最简单的 C 文件:
// /tmp/test_c.c #include <stdio.h> int main(void) { printf("gcc7 c test ok\n"); return 0; }编译并运行:
gcc -o /tmp/test_c /tmp/test_c.c /tmp/test_c如果输出gcc7 c test ok,说明 C 编译链路通了。如果报stdio.h: No such file,那是libc6-dev没装,不是 gcc 的问题,得从系统包里补。
5.2 C++17 特性测试:确认 libstdc++ 版本
gcc7 对 C++17 的支持是部分可用,用std::filesystem测一下:
// /tmp/test_cpp.cpp #include <iostream> #include <filesystem> int main() { std::filesystem::path p = "/tmp"; std::cout << "gcc7 c++17 test ok: " << p.string() << std::endl; return 0; }编译时需要显式链接stdc++fs:
g++ -std=c++17 -o /tmp/test_cpp /tmp/test_cpp.cpp -lstdc++fs /tmp/test_cpp如果报undefined reference to std::filesystem::...,说明libstdc++-7-dev没装或版本不对。gcc7 的 filesystem 实现还在实验阶段,必须加-lstdc++fs,这是和 gcc8 之后最大的区别。
5.3 版本和路径核对:确认没有走错编译器
最后确认一下实际调用的编译器路径和版本:
# 查看 gcc 实际路径 which gcc # 查看版本详情 gcc -v # 查看 g++ 版本 g++ -vgcc -v的输出里会显示gcc version 7.5.0以及配置参数。如果which gcc显示的是/usr/bin/gcc,而gcc -v显示 7.5.0,那就对了。如果显示的是/usr/local/bin/gcc或其他路径,说明 PATH 里有别的编译器抢先,需要调整 PATH 或 alternatives。
提示:验证完这三个测试后,建议把
/tmp下的测试文件删掉,避免污染环境。如果是在生产机器上,编译测试最好在独立的临时目录里做。
从那以后我每次离线装 gcc,都会先把dpkg -l | grep gcc的输出存一份,装完再对比一次,确认没有多出奇怪的包。这套流程在 Ubuntu 18.04 上跑了不下二十台机器,只要 zip 包里的 deb 完整,基本不会翻车。希望帮到你。
本文还有配套的精品资源,点击获取