Ubuntu 22.04 build-essential 安装与命令参数详解

详解 Ubuntu 22.04 中 build-essential 元包的在线与离线安装流程,以及 apt、apt-cache、dpkg 系列命令参数的真实回显。

Linux开发与编译工具链build-essential2026/10/06

Ubuntu 22.04 build-essential 安装与命令参数详解

目标:在 Ubuntu 22.04 x86_64 服务器上从 0 到 1 完成 build-essential 元包的在线安装与离线安装,并逐命令实测 apt、apt-cache、dpkg 系列命令及其参数的真实输入与输出。本文所有命令与回显均在 Ubuntu 22.04.5 LTS(x86_64)环境实测通过,输出逐行照抄,未作任何删改。

💡 说明:本文实测环境以 root 用户操作,命令直接执行;若使用普通用户,请在每条命令前添加 sudo 前缀。

一、环境信息

项目值
操作系统Ubuntu 22.04.5 LTS(Jammy Jellyfish)
内核版本6.8.0-138-generic
系统架构x86_64(amd64)
软件包管理器apt 2.4.14、dpkg 1.21.1
build-essential 版本12.9ubuntu3
组内成员工具版本gcc 11.4.0、g++ 11.4.0、make 4.3

二、工具概述

build-essential 是 Ubuntu(以及 Debian 系发行版)中的元包(meta package),它本身不包含任何编译器的二进制文件,只通过包管理器的 Depends(依赖)关系,把一套完整的 C/C++ 编译构建环境一次性拉取安装到位。

build-essential 12.9ubuntu3 的依赖清单为:

  • libc6-dev | libc-dev:ISO C 标准库开发文件(头文件与静态库),可满足替代;
  • gcc (>= 4:10.2):GNU C 编译器;
  • g++ (>= 4:10.2):GNU C++ 编译器;
  • make:GNU Make 构建工具;
  • dpkg-dev (>= 1.17.11):Debian 软件包构建辅助脚本(提供 dpkg-architecture、dpkg-genchanges 等)。

安装 build-essential 后,即获得 gcc(编译 C)、g++(编译 C++)、make(驱动构建)三大核心能力。它相当于 CentOS/RHEL 系统中 yum groupinstall "Development Tools" 软件组的作用,是 Linux 下编译源码、构建 C/C++ 项目、制作 Debian 软件包的最小标准环境。

典型使用场景:

  1. 编译安装源码包(./configure + make + make install);
  2. 构建并调试 C/C++ 工程项目;
  3. 参与 Debian/Ubuntu 软件包(deb)的打包与构建;
  4. 作为 gdb、valgrind 等调试分析工具的前置编译环境。

💡 说明:build-essential 只提供"编译所需的最小工具集",它不包含 gdb、cmake、git 等工具,这些需要按需单独安装。

三、在线安装方案

在线安装依赖 apt 软件源,前提是服务器能够访问 Ubuntu 官方源(archive.ubuntu.com 与 security.ubuntu.com)。以下步骤在联网服务器上完整执行。

3.1 确认系统版本

安装前先确认操作系统版本与版本代号(jammy 对应 Ubuntu 22.04)。

cat /etc/os-release

实测回显:

PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.5 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy

3.2 检查软件源配置

查看 /etc/apt/sources.list 中生效的软件源(过滤注释行与空行):

cat /etc/apt/sources.list | grep -v "^#" | grep -v "^$"

实测回显:

deb http://archive.ubuntu.com/ubuntu/ jammy main restricted
deb http://archive.ubuntu.com/ubuntu/ jammy-updates main restricted
deb http://archive.ubuntu.com/ubuntu/ jammy universe
deb http://archive.ubuntu.com/ubuntu/ jammy-updates universe
deb http://archive.ubuntu.com/ubuntu/ jammy multiverse
deb http://archive.ubuntu.com/ubuntu/ jammy-updates multiverse
deb http://archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted
deb http://security.ubuntu.com/ubuntu/ jammy-security universe
deb http://security.ubuntu.com/ubuntu/ jammy-security multiverse

💡 说明:软件源已配置好,无需重配。若执行安装命令时报 E: Unable to locate package build-essential,说明索引过期或源缺失,先执行 apt update 刷新索引。

3.3 更新软件包索引

安装前先刷新软件包列表,确保能拿到最新版本信息:

apt update

实测回显(尾部):

Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Hit:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease
Hit:3 http://archive.ubuntu.com/ubuntu jammy-backports InRelease
Hit:4 http://security.ubuntu.com/ubuntu jammy-security InRelease
Reading package lists...

3.4 安装 build-essential

执行在线安装命令:

apt install -y build-essential

实测回显(当前环境已安装最新版 12.9ubuntu3,apt 提示"已经是最新版本"):


WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

Reading package lists...
Building dependency tree...
Reading state information...
build-essential is already the newest version (12.9ubuntu3).
0 upgraded, 0 newly installed, 0 to remove and 8 not upgraded.

💡 说明:在全新的、尚未安装 build-essential 的 Ubuntu 22.04 服务器上执行同一条命令,apt 会自动安装 build-essential 及其全部依赖(gcc、g++、make、libc6-dev、dpkg-dev),末尾回显类似 Setting up gcc-11 ... 的安装过程,并以 done 收尾。

3.5 验证安装

确认包处于已安装状态:

dpkg -s build-essential | grep -E "Status|Version"

实测回显:

Status: install ok installed
Version: 12.9ubuntu3

再验证组内工具是否可用(详见"五、命令与参数详解"5.15 节):

gcc --version && make --version

实测回显:

gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

GNU Make 4.3
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

四、离线安装方案

离线安装适用于无法访问外网的内网服务器。思路是:在联网的 Ubuntu 22.04 机器上把 build-essential 及其依赖的 .deb 包下载好,拷贝到离线服务器后使用 dpkg -i 安装。

4.1 在有网机器上下载软件包

使用 --download-only 参数让 apt 只下载、不安装。加 --no-install-recommends 可避免拉取推荐(Recommends)级的非必需包:

apt install --download-only --no-install-recommends -y build-essential

实测回显(当前环境 build-essential 已安装且为最新版本,apt 判定无需下载):


WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

Reading package lists...
Building dependency tree...
Reading state information...
build-essential is already the newest version (12.9ubuntu3).
0 upgraded, 0 newly installed, 0 to remove and 8 not upgraded.

💡 说明:apt install --download-only 会把需要安装的 .deb 包下载到 /var/cache/apt/archives/。在尚未安装 build-essential 的机器上执行该命令,会下载 build-essential 以及 gcc、g++、make、libc6-dev、dpkg-dev 等全部依赖的 .deb;本机因已装齐且是最新版本,故不会产生下载。

4.2 检查下载缓存目录

查看 /var/cache/apt/archives/ 中已下载的 .deb 文件:

ls -lh /var/cache/apt/archives/*.deb

实测回显(因已安装且最新,缓存目录中没有 build-essential 的 deb):

ls: cannot access '/var/cache/apt/archives/*.deb': No such file or directory

4.3 使用 apt download 直接获取 deb 包

为了演示离线安装流程,使用 apt download 子命令把 build-essential 自身的 .deb 包下载到当前目录(该命令不依赖是否已安装,总是从软件源获取 .deb 文件):

cd /opt/devchain-demo/build-essential-ubuntu-test && apt download build-essential

实测回显:


WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

Get:1 http://archive.ubuntu.com/ubuntu jammy/main amd64 build-essential amd64 12.9ubuntu3 [4744 B]
Fetched 4744 B in 1s (9210 B/s)
W: Download is performed unsandboxed as root as file '/opt/devchain-demo/build-essential-ubuntu-test/build-essential_12.9ubuntu3_amd64.deb' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)

💡 说明:最后的 W: 警告是 root 用户下载、目录权限导致 _apt 用户无法访问文件时的提示,属于正常现象,不影响 .deb 文件的完整性。

⚠️ 注意:离线部署时,需要在联网机器上把 build-essential 及其所有依赖(gcc、g++、make、libc6-dev、dpkg-dev 等)一并下载并拷贝,仅拷 build-essential 一个包在目标机上会因依赖缺失而安装失败。

4.4 创建离线目录并拷贝 deb 包

创建离线软件包目录,并把下载好的 .deb 拷贝进去:

mkdir -p /opt/devchain-demo/build-essential-ubuntu-test/offline
cp /opt/devchain-demo/build-essential-ubuntu-test/build-essential_12.9ubuntu3_amd64.deb /opt/devchain-demo/build-essential-ubuntu-test/offline/

两条命令均无输出,表示执行成功。

4.5 查看 deb 包的元信息

使用 dpkg-deb -I(即 --info)查看 .deb 包内 control 文件携带的元信息(版本、架构、依赖、描述等):

dpkg-deb -I /opt/devchain-demo/build-essential-ubuntu-test/offline/build-essential_12.9ubuntu3_amd64.deb

实测回显:

 new Debian package, version 2.0.
 size 4744 bytes: control archive=971 bytes.
    1391 bytes,    30 lines      control
     372 bytes,     5 lines      md5sums
 Package: build-essential
 Version: 12.9ubuntu3
 Architecture: amd64
 Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
 Installed-Size: 21
 Depends: libc6-dev | libc-dev, gcc (>= 4:10.2), g++ (>= 4:10.2), make, dpkg-dev (>= 1.17.11)
 Section: devel
 Priority: optional
 Description: Informational list of build-essential packages
  If you do not plan to build Debian packages, you don't need this
  package.  Starting with dpkg (>= 1.14.18) this package is required
  for building Debian packages.
  .
  This package contains an informational list of packages which are
  considered essential for building Debian packages.  This package also
  depends on the packages on that list, to make it easy to have the
  build-essential packages installed.
  .
  If you have this package installed, you only need to install whatever
  a package specifies as its build-time dependencies to build the
  package.  Conversely, if you are determining what your package needs
  to build-depend on, you can always leave out the packages this
  package depends on.
  .
  This package is NOT the definition of what packages are
  build-essential; the real definition is in the Debian Policy Manual.
  This package contains merely an informational list, which is all
  most people need.   However, if this package and the manual disagree,
  the manual is correct.
 Original-Maintainer: Matthias Klose <doko@debian.org>

4.6 查看 deb 包内含文件

使用 dpkg-deb -c(即 --contents)列出 .deb 包会安装哪些文件,此处用 head 查看前 15 行:

dpkg-deb -c /opt/devchain-demo/build-essential-ubuntu-test/offline/build-essential_12.9ubuntu3_amd64.deb | head -15

实测回显:

drwxr-xr-x root/root         0 2022-03-23 09:45 ./
drwxr-xr-x root/root         0 2022-03-23 09:45 ./usr/
drwxr-xr-x root/root         0 2022-03-23 09:45 ./usr/share/
drwxr-xr-x root/root         0 2022-03-23 09:45 ./usr/share/build-essential/
-rw-r--r-- root/root       357 2022-03-23 09:45 ./usr/share/build-essential/essential-packages-list
-rw-r--r-- root/root      3616 2022-03-23 09:45 ./usr/share/build-essential/list
drwxr-xr-x root/root         0 2022-03-23 09:45 ./usr/share/doc/
drwxr-xr-x root/root         0 2022-03-23 09:45 ./usr/share/doc/build-essential/
-rw-r--r-- root/root       149 2021-01-03 15:50 ./usr/share/doc/build-essential/AUTHORS
-rw-r--r-- root/root       784 2022-03-23 09:45 ./usr/share/doc/build-essential/changelog.gz
-rw-r--r-- root/root       954 2021-01-03 15:50 ./usr/share/doc/build-essential/copyright
lrwxrwxrwx root/root         0 2022-03-23 09:45 ./usr/share/doc/build-essential/essential-packages-list -> ../../build-essential/essential-packages-list
lrwxrwxrwx root/root         0 2022-03-23 09:45 ./usr/share/doc/build-essential/list -> ../../build-essential/list

💡 说明:可以看到 build-essential 包本身只安装文档与两个清单文件(list、essential-packages-list),没有任何二进制程序,再次印证它"元包"的本质。

4.7 查看离线目录内容

ls -lh /opt/devchain-demo/build-essential-ubuntu-test/offline/

实测回显:

total 8.0K
-rw-r--r-- 1 root root 4.7K Oct  6 06:22 build-essential_12.9ubuntu3_amd64.deb

4.8 离线安装演练

在离线服务器上,把下载好的 .deb 拷贝到目标机后,用 dpkg -i 安装。正式执行前可先用 dpkg --dry-run -i 做一次模拟安装(--dry-run 只打印将要执行的动作,不真正安装):

dpkg --dry-run -i /opt/devchain-demo/build-essential-ubuntu-test/offline/build-essential_12.9ubuntu3_amd64.deb

实测回显:

(Reading database ... 24654 files and directories currently installed.)
Preparing to unpack .../build-essential_12.9ubuntu3_amd64.deb ...

💡 说明:--dry-run 执行到"准备解包"即停止,不会真正安装。确认无误后,把 --dry-run 去掉,执行 dpkg -i /opt/devchain-demo/build-essential-ubuntu-test/offline/build-essential_12.9ubuntu3_amd64.deb 即可完成离线安装。

⚠️ 注意:离线服务器若依赖未装齐,dpkg -i 可能报依赖错误,此时需按缺失项补齐对应 .deb,或安装全部依赖后执行 apt -f install 修复依赖关系。

五、命令与参数详解

build-essential 是一个元包,没有独立 CLI 程序,无法直接执行 build-essential 命令。对它的一切操作都通过包管理器完成,因此本节逐条详解与之相关的 apt、apt-cache、dpkg 系列命令及其参数,每条命令均给出"一行说明 + 真实命令 + 真实回显"。

5.1 元包概念与 Build-Essential 字段

元包自身不含可执行文件,仅在 dpkg 数据库中登记元信息,并通过 Depends 字段拉取真正的工具。apt show 的输出中 Build-Essential: yes 标记说明该包属于 Debian 定义的 build-essential 集合,APT-Manual-Installed: yes 表示它是用户手动安装(而非作为依赖被自动带入)。

元包内文件 /usr/share/build-essential/list 记录了"构建必需包"清单(BEGIN LIST OF PACKAGES ... END LIST OF PACKAGES),核心条目与 Depends 一一对应:

libc6-dev [!alpha !ia64 !hurd-i386] | libc0.3-dev [hurd-i386] | libc6.1-dev [alpha ia64] | libc-dev
gcc (>= 4:10.2)
g++ (>= 4:10.2)
make
dpkg-dev (>= 1.17.11)

另一个文件 /usr/share/build-essential/essential-packages-list 则列出所有 Essential: yes 的系统级必需包(base-files、bash、coreutils、dpkg 等 24 个)。

5.2 apt show —— 查看软件包详细信息

apt show 显示软件包的详细信息(版本、依赖、大小、描述等),是了解元包最快的方式:

apt show build-essential

实测回显:


WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

Package: build-essential
Version: 12.9ubuntu3
Priority: optional
Build-Essential: yes
Section: devel
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Matthias Klose <doko@debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 21.5 kB
Depends: libc6-dev | libc-dev, gcc (>= 4:10.2), g++ (>= 4:10.2), make, dpkg-dev (>= 1.17.11)
Task: ubuntustudio-video, ubuntu-mate-core, ubuntu-mate-desktop
Download-Size: 4744 B
APT-Manual-Installed: yes
APT-Sources: http://archive.ubuntu.com/ubuntu jammy/main amd64 Packages
Description: Informational list of build-essential packages

💡 说明:Depends 行中 | 表示"或"关系(libc6-dev | libc-dev 二选一),(>= 4:10.2) 是版本下限约束。Download-Size: 4744 B 说明整个元包仅 4.7 KB,再次印证其"空壳 + 依赖"的本质。

5.3 apt-cache depends —— 查看依赖树

apt-cache depends 以树形列出指定包的全部依赖,| 开头的行表示或依赖(可选项),<...> 内是备选包名:

apt-cache depends build-essential

实测回显:

build-essential
 |Depends: libc6-dev
  Depends: <libc-dev>
    libc6-dev
  Depends: gcc
  Depends: g++
  Depends: make
    make-guile
  Depends: dpkg-dev

💡 说明:Depends: make 下方的缩进 make-guile 表示 make 这一依赖可由 make 或 make-guile 满足;Depends: <libc-dev> 下的 libc6-dev 是备选包的实际提供者。

5.4 apt-cache policy —— 查看候选版本与优先级

apt-cache policy 显示包当前安装版本、候选版本及各版本来源与优先级(500 来自软件源,100 来自本地 dpkg 状态):

apt-cache policy build-essential

实测回显:

build-essential:
  Installed: 12.9ubuntu3
  Candidate: 12.9ubuntu3
  Version table:
 *** 12.9ubuntu3 500
        500 http://archive.ubuntu.com/ubuntu jammy/main amd64 Packages
        100 /var/lib/dpkg/status

💡 说明:*** 标记当前安装版本;Candidate 是默认安装/升级目标版本,本例安装版本与候选版本一致,因此"已经是最新版本"。

5.5 apt-cache show —— 查看仓库元数据

apt-cache show 显示软件源中登记的完整元数据,比 apt show 多出包文件位置与校验和(Filename、Size、SHA256 等),适合核对包来源:

apt-cache show build-essential | head -20

实测回显:

Package: build-essential
Architecture: amd64
Version: 12.9ubuntu3
Priority: optional
Section: devel
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Matthias Klose <doko@debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 21
Depends: libc6-dev | libc-dev, gcc (>= 4:10.2), g++ (>= 4:10.2), make, dpkg-dev (>= 1.17.11)
Filename: pool/main/b/build-essential/build-essential_12.9ubuntu3_amd64.deb
Size: 4744
MD5sum: 8f82837be1c86fc816b51ac9b519268a
SHA1: 3f4d2e9af10adff4b07c92df6b7b697bc0be8dd2
SHA256: 1e464c41488d154b9f5ca19d2e9ac8b18913ae16e3dca713c3ba0223fae2cccc
SHA512: 65452b51286fa167cb80ffbecbb9c4fb94324aefe19a792a3996a62c24cfefc937ddbcabaaab6f94c507aa0fabf20eb8e4a90e6f88a1ee89de90a4eb3f9cc65e
Description: Informational list of build-essential packages
Description-md5: 90ef0ef86cafda0bd16f746eb621d9da
Task: ubuntustudio-video, ubuntu-mate-core, ubuntu-mate-desktop

💡 说明:Filename 给出 deb 在软件源中的路径,配合 Size/SHA256 可用于校验离线下载的包是否完整一致。

5.6 dpkg -L —— 查看包安装的文件列表

dpkg -L 列出指定包已安装的全部文件路径:

dpkg -L build-essential

实测回显:

/.
/usr
/usr/share
/usr/share/build-essential
/usr/share/build-essential/essential-packages-list
/usr/share/build-essential/list
/usr/share/doc
/usr/share/doc/build-essential
/usr/share/doc/build-essential/AUTHORS
/usr/share/doc/build-essential/changelog.gz
/usr/share/doc/build-essential/copyright
/usr/share/doc/build-essential/essential-packages-list
/usr/share/doc/build-essential/list

💡 说明:整个包只装了 list、essential-packages-list 两个数据文件与若干文档,没有任何可执行程序,直观印证元包定义。

5.7 dpkg -s —— 查看包状态与详情

dpkg -s 显示包的详细状态信息,第一行 Status: install ok installed 表示已正确安装:

dpkg -s build-essential

实测回显:

Package: build-essential
Status: install ok installed
Priority: optional
Section: devel
Installed-Size: 21
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: amd64
Version: 12.9ubuntu3
Depends: libc6-dev | libc-dev, gcc (>= 4:10.2), g++ (>= 4:10.2), make, dpkg-dev (>= 1.17.11)
Description: Informational list of build-essential packages
 If you do not plan to build Debian packages, you don't need this
 package.  Starting with dpkg (>= 1.14.18) this package is required
 for building Debian packages.
 .
 This package contains an informational list of packages which are
 considered essential for building Debian packages.  This package also
 depends on the packages on that list, to make it easy to have the
 build-essential packages installed.
 .
 If you have this package installed, you only need to install whatever
 a package specifies as its build-time dependencies to build the
 package.  Conversely, if you are determining what your package needs
 to build-depend on, you can always leave out the packages this
 package depends on.
 .
 This package is NOT the definition of what packages are
 build-essential; the real definition is in the Debian Policy Manual.
 This package contains merely an informational list, which is all
 most people need.   However, if this package and the manual disagree,
 the manual is correct.
Original-Maintainer: Matthias Klose <doko@debian.org>

⚠️ 注意:Status 若显示 install ok unpacked 或 deinstall ok config-files,说明包未完成安装或已被移除,需重新安装。

5.8 apt list --installed —— 过滤已安装包

apt list --installed 列出所有已安装包,配合 grep 过滤出 build-essential:

apt list --installed | grep build-essential

实测回显:


WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

build-essential/jammy,now 12.9ubuntu3 amd64 [installed]

💡 说明:now 表示这是当前实际安装版本,[installed] 标记已安装状态。

5.9 apt-get install --dry-run —— 模拟安装

apt-get install --dry-run(简写 -s/--simulate)只模拟安装过程,展示将要执行的操作而不真正改动系统:

apt-get install --dry-run build-essential

实测回显:

Reading package lists...
Building dependency tree...
Reading state information...
build-essential is already the newest version (12.9ubuntu3).
0 upgraded, 0 newly installed, 0 to remove and 8 not upgraded.

💡 说明:在未安装 build-essential 的机器上执行,会打印 Inst build-essential ...、Inst gcc ... 等模拟安装行,可用于提前评估安装影响。

5.10 apt install --download-only —— 只下载不安装

--download-only 让 apt 仅把软件包下载到 /var/cache/apt/archives/,不执行安装,常用于离线部署前的打包(详见第四节):

apt install --download-only --no-install-recommends -y build-essential

实测回显:


WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

Reading package lists...
Building dependency tree...
Reading state information...
build-essential is already the newest version (12.9ubuntu3).
0 upgraded, 0 newly installed, 0 to remove and 8 not upgraded.

5.11 apt download —— 直接下载 deb 文件

apt download 将指定包的 .deb 文件下载到当前目录(不检查安装状态、不做依赖处理),适合单独获取包文件(详见 4.3 节):

apt download build-essential

实测回显:


WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

Get:1 http://archive.ubuntu.com/ubuntu jammy/main amd64 build-essential amd64 12.9ubuntu3 [4744 B]
Fetched 4744 B in 1s (9210 B/s)
W: Download is performed unsandboxed as root as file '/opt/devchain-demo/build-essential-ubuntu-test/build-essential_12.9ubuntu3_amd64.deb' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)

5.12 dpkg-deb -I / -c —— 解析 deb 包内容

  • dpkg-deb -I <包>:显示 deb 的 control 元信息(版本、依赖、描述),详见 4.5 节;
  • dpkg-deb -c <包>:列出 deb 内含文件清单,详见 4.6 节。

两条命令均不修改系统,是离线校验 deb 包的首选工具。

5.13 dpkg --dry-run -i —— 模拟安装本地 deb

dpkg --dry-run -i <deb> 模拟执行 dpkg -i,打印将要执行的动作而不实际安装(实测该参数受支持,详见 4.8 节):

dpkg --dry-run -i /opt/devchain-demo/build-essential-ubuntu-test/offline/build-essential_12.9ubuntu3_amd64.deb

实测回显:

(Reading database ... 24654 files and directories currently installed.)
Preparing to unpack .../build-essential_12.9ubuntu3_amd64.deb ...

5.14 dpkg -l —— 列出包状态(含状态符号含义)

dpkg -l 以表格列出包名、版本、架构与描述,首行前的两个字母是状态码(ii 表示期望安装且已安装):

dpkg -l build-essential

实测回显:

Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name            Version      Architecture Description
+++-===============-============-============-==============================================
ii  build-essential 12.9ubuntu3  amd64        Informational list of build-essential packages

💡 说明:首列 ii 中第一个 i 表示期望状态为安装(install),第二个 i 表示实际状态为已安装(installed);若显示 un(未安装)或 rc(已删除但保留配置),说明包不在可用状态。

5.15 组内成员工具版本验证

安装 build-essential 后验证组内工具 gcc、g++、make 的版本:

gcc --version

实测回显:

gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
g++ --version

实测回显:

g++ (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
make --version

实测回显:

GNU Make 4.3
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

快速获取纯版本号(供脚本判断版本用):

gcc -dumpversion

实测回显:

11
gcc -dumpfullversion

实测回显:

11.4.0

5.16 组内工具安装状态一览

使用 dpkg -l 配合 grep 过滤,一次性查看 build-essential 与 gcc、g++、make 相关包的安装状态:

dpkg -l | grep -E 'build-essential|gcc|g\+\+|make' | head

实测回显:

ii  build-essential             12.9ubuntu3                             amd64        Informational list of build-essential packages
ii  g++                         4:11.2.0-1ubuntu1                       amd64        GNU C++ compiler
ii  g++-11                      11.4.0-1ubuntu1~22.04.3                 amd64        GNU C++ compiler
ii  gcc                         4:11.2.0-1ubuntu1                       amd64        GNU C compiler
ii  gcc-11                      11.4.0-1ubuntu1~22.04.3                 amd64        GNU C compiler
ii  gcc-11-base:amd64           11.4.0-1ubuntu1~22.04.3                 amd64        GCC, the GNU Compiler Collection (base package)
ii  gcc-12-base:amd64           12.3.0-1ubuntu1~22.04.3                 amd64        GCC, the GNU Compiler Collection (base package)
ii  libgcc-11-dev:amd64         11.4.0-1ubuntu1~22.04.3                 amd64        GCC support library (development files)
ii  libgcc-s1:amd64             12.3.0-1ubuntu1~22.04.3                 amd64        GCC support library
ii  make                        4.3-4.1build1                           amd64        utility for directing compilation

💡 说明:可以看到 gcc、g++ 实际是过渡包(依赖具体版本包 gcc-11、g++-11),真正提供编译器二进制的是 gcc-11/g++-11;gcc-12-base 出现说明系统中还带有 GCC 12 的运行时基础库。

六、配置说明

6.1 无配置文件

build-essential 是纯元包,安装后不需要任何配置,不产生配置文件、不启动服务、不设置环境变量。安装完成即可直接使用 gcc、g++、make。

6.2 命令路径与符号链接

gcc、g++ 的命令路径由 dpkg 通过符号链接管理:

ls -l /usr/bin/gcc /usr/bin/g++ /usr/bin/make

实测回显:

lrwxrwxrwx 1 root root      6 Aug  5  2021 /usr/bin/g++ -> g++-11
lrwxrwxrwx 1 root root      6 Aug  5  2021 /usr/bin/gcc -> gcc-11
-rwxr-xr-x 1 root root 255696 Feb 15  2022 /usr/bin/make

💡 说明:/usr/bin/gcc 是指向 gcc-11 的符号链接,这是 Ubuntu 管理多版本编译器的默认方式(/usr/bin/<工具> -> <工具>-<版本>)。

6.3 多版本编译器共存

若需在同一台机器上同时使用多个 GCC 大版本(如 gcc-10、gcc-12),可安装对应版本包后手动切换符号链接,或使用 update-alternatives 注册管理。实测当前环境 gcc 未注册 alternatives:

update-alternatives --list gcc

实测回显:

update-alternatives: error: no alternatives for gcc

💡 说明:no alternatives for gcc 表示当前 gcc 完全由 dpkg 的符号链接机制管理,未纳入 alternatives 体系。如需用 update-alternatives --config gcc 交互切换版本,需先执行 update-alternatives --install 手动注册各版本。

七、常见问题(FAQ)

Q1:执行 apt install build-essential 报 E: Unable to locate package build-essential

原因:软件包索引过期,或软件源未包含 main 组件。解决:

apt update
apt install -y build-essential

若仍报错,检查 /etc/apt/sources.list 中是否包含 jammy main 行(详见 3.2 节)。

Q2:执行 gcc --version 报 gcc: command not found

原因:build-essential 未安装(gcc 由它带入)。解决:

apt install -y build-essential

Q3:如何确认当前 gcc 的实际版本

gcc --version

或取纯版本号:

gcc -dumpversion

Q4:apt install --download-only 下载的 deb 包存放在哪里

存放在 /var/cache/apt/archives/。注意:若包已安装且是最新版本,apt 不会重复下载(实测回显 build-essential is already the newest version,缓存目录为空)。需要强制获取包文件时可改用 apt download。

Q5:dpkg --dry-run -i 是否支持模拟安装

支持。实测 dpkg --dry-run -i xxx.deb 会打印 (Reading database ...) 与 Preparing to unpack ... 后停止,不真正安装。

Q6:普通用户执行 apt 提示权限不足

apt 安装类命令需要 root 权限。普通用户请在命令前加 sudo:

sudo apt install -y build-essential

Q7:离线服务器 dpkg -i 安装报依赖错误

离线安装必须把 build-essential 及其全部依赖(gcc、g++、make、libc6-dev、dpkg-dev)的 deb 一并下载拷贝。若仍报缺依赖,可在联网机器用 apt install --download-only --no-install-recommends -y build-essential 完整下载依赖树后整体拷贝,并在目标机执行:

dpkg -i /opt/offline/*.deb

若部分依赖已存在导致顺序问题,可随后执行:

apt -f install

修复未满足的依赖。

Q8:build-essential 和 gcc 有什么关系

build-essential 依赖 gcc(C 编译器)与 g++(C++ 编译器),安装 build-essential 会自动安装 gcc、g++、make 等工具;单独安装 gcc 则不会带入 g++ 与 make。

八、卸载与清理

⚠️ 注意:本节演示命令均为只读查询,不会真正卸载 build-essential;卸载命令仅作为参考给出,未在本环境执行。

8.1 查询当前安装状态

dpkg -l build-essential

实测回显:

Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name            Version      Architecture Description
+++-===============-============-============-==============================================
ii  build-essential 12.9ubuntu3  amd64        Informational list of build-essential packages

8.2 查询包仓库信息

apt-cache show build-essential | head

实测回显:

Package: build-essential
Architecture: amd64
Version: 12.9ubuntu3
Priority: optional
Section: devel
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Matthias Klose <doko@debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 21
Depends: libc6-dev | libc-dev, gcc (>= 4:10.2), g++ (>= 4:10.2), make, dpkg-dev (>= 1.17.11)

8.3 卸载命令(参考,未执行)

如需卸载 build-essential(保留 gcc/g++/make 等依赖):

apt remove -y build-essential

如需连依赖一并清理(谨慎使用):

apt remove -y build-essential && apt autoremove -y

⚠️ 注意:卸载 build-essential 本身不会删除 gcc、g++、make;apt autoremove 只清理因它而安装、且无其他包依赖的"孤儿"包。若服务器仍用于编译,建议保留 gcc/g++/make。

8.4 清理下载缓存

清理 /var/cache/apt/archives/ 中已下载的 deb 包:

apt clean

💡 说明:apt clean 删除缓存中的全部 deb 文件,释放磁盘空间;apt autoclean 则只删除已不再使用的部分。

九、参考链接

  1. Ubuntu 官方文档:https://ubuntu.com/server/docs
  2. Debian 软件包管理手册(dpkg/apt):https://www.debian.org/doc/manuals/debian-reference/
  3. Debian Policy Manual —— build-essential 定义(第 4 章"Package relationships"):https://www.debian.org/doc/debian-policy/
  4. apt 手册页:man apt、man apt-get、man apt-cache
  5. dpkg 手册页:man dpkg、man dpkg-deb
  6. Ubuntu Packages 仓库(jammy build-essential 页面):https://packages.ubuntu.com/jammy/build-essential