在 Linux 系统中,通过源码编译安装软件是一项基本技能。无论是安装一个普通的命令行工具,还是定制 Linux 内核,编译过程的第一步通常是 配置(Configuration)。配置阶段用于检查系统环境、设定功能开关、指定安装路径,并最终生成适用于当前系统的 Makefile,为后续的 make 编译做好准备。本文将系统梳理 Linux 下常见的配置方法,涵盖 Autotools、内核配置、CMake 等主流方式,并总结常见问题与解决方案。

博主博客

1. 为什么需要配置?

编译源代码并不是简单的“一键运行”。源代码通常需要适配不同的操作系统、硬件架构、库版本以及用户需求。配置脚本或工具的作用包括:

  • 环境检测:检查编译器(如 gcc)、头文件、依赖库是否存在,版本是否满足要求。
  • 功能选择:允许用户启用或禁用某些特性(例如支持图形界面、启用调试信息)。
  • 路径设定:指定软件最终安装的目录(如 /usr/local 或自定义路径)。
  • 生成 Makefile:根据检测结果生成适合当前系统的构建规则。

良好的配置过程可以确保软件正确编译,并符合用户的个性化需求。

2. 传统 Autotools 项目:三步安装法

绝大多数历史悠久的开源项目(如 bash、coreutils、很多网络服务软件)使用 GNU Autotools 构建系统。其典型安装流程为:

./configure
make
sudo make install

2.1 配置脚本 ./configure

运行 ./configure 会执行一系列检查,并生成 Makefile。常用选项包括:

  • --prefix=PREFIX:指定安装根目录,默认为 /usr/local。例如 --prefix=/opt/myapp 可将软件安装到 /opt/myapp/bin/opt/myapp/lib 等子目录。
  • --enable-FEATURE / --disable-FEATURE:启用或禁用某个特性。例如 --enable-shared 表示构建共享库。
  • --with-PACKAGE[=ARG] / --without-PACKAGE:指定依赖包的路径或禁用某个可选依赖。例如 --with-ssl=/usr/local/ssl
  • CCCFLAGS 等环境变量:可在命令行中指定编译器或编译选项,如 ./configure CC=clang CFLAGS="-O2 -march=native"

查看所有选项./configure --help 会列出所有可用参数,并简要说明每个选项的作用。

示例:编译安装 nginx 并指定安装路径及模块

./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_v2_module
make
sudo make install

2.2 编译 make

配置成功后,直接执行 make 即可开始编译。若系统为多核 CPU,可使用 make -j$(nproc) 加速编译。

2.3 安装 make install

编译完成后,通常需要超级用户权限将文件复制到系统目录(如 /usr/local/bin)。执行 sudo make install。如果 --prefix 指定了用户有写权限的目录,则无需 sudo

3. Linux 内核编译配置

内核编译的配置更为复杂,因为它需要针对特定硬件和功能需求进行精细调整。配置结果保存在源码根目录的 .config 文件中。

3.1 常用配置命令

  • make menuconfig:基于 ncurse 的文本图形界面,最常用的配置方式。可通过方向键导航、空格键切换选项。
  • make config:纯命令行交互式配置,会逐一询问每个选项,不推荐用于大型内核。
  • make oldconfig:基于现有 .config 文件,仅对新出现的内核选项进行询问。适合升级内核时保留原有配置。
  • make defconfig:根据当前体系结构生成默认配置(通常来自 arch/*/configs/ 下的默认文件)。
  • make localmodconfig:根据当前正在运行的内核模块列表生成配置,只编译需要的模块,可大幅缩小内核体积。
  • make xconfig(需要 Qt 库)或 make gconfig(需要 GTK 库):图形化配置界面。

3.2 配置技巧

  • 搜索符号:在 menuconfig 中按 / 键可以搜索配置选项名称(如 CONFIG_SMP),快速定位。
  • 保存与加载:配置完成后保存退出,会自动生成 .config。也可以手动备份该文件供以后使用。
  • 模块与内置:选项通常有三种状态:未选择、编译为模块(M)、编译进内核(*)。模块可动态加载,有助于减小内核镜像大小。

示例:编译一个精简内核

make defconfig          # 生成默认配置
make menuconfig         # 根据需求调整(例如去掉不需要的驱动)
make -j$(nproc)         # 编译内核及模块
sudo make modules_install  # 安装模块
sudo make install       # 安装内核及 System.map

4. 基于 CMake 的项目配置

现代 C/C++ 项目越来越多地使用 CMake 作为构建系统(如 LLVM、MySQL、CMake 本身)。CMake 采用两步式构建(通常使用外部构建,避免污染源码目录):

mkdir build && cd build
cmake [选项] ..
make

4.1 常用 cmake 选项

  • -DCMAKE_INSTALL_PREFIX=<path>:等价于 Autotools 的 --prefix,指定安装路径。
  • -DCMAKE_BUILD_TYPE=<type>:设置构建类型,如 ReleaseDebugRelWithDebInfo
  • -DBUILD_SHARED_LIBS=ON:构建共享库而非静态库。
  • -DWITH_<FEATURE>=ON/OFF:许多项目使用此类变量控制特性。

示例:编译安装 CMake 本身

tar xf cmake-3.25.0.tar.gz
cd cmake-3.25.0
mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=/opt/cmake -DCMAKE_BUILD_TYPE=Release ..
make -j$(nproc)
sudo make install

4.2 查看所有可用选项

在 build 目录下运行 cmake -LAH .. 可以列出所有缓存变量及其帮助信息。

5. 其他构建系统简介

  • Meson:新兴构建系统,配置命令为 meson setup builddir,然后 ninja -C builddir。常见于 GNOME 项目(如 GTK)。
  • Python setuptools:Python 包使用 python setup.py buildpython setup.py install,现代多用 pip install .
  • Rust Cargo:Rust 项目通过 cargo build --release 直接编译,配置在 Cargo.toml 中。

6. 常见问题与解决方法

6.1 依赖缺失

现象./configurecmake 报错,提示找不到某个头文件或库,例如 error: curses.h: No such file or directory

解决:安装对应的开发包。在 Debian/Ubuntu 上通常为 lib<name>-dev,在 RHEL/CentOS/Fedora 上为 <name>-devel。例如:

# Debian/Ubuntu
sudo apt install libncurses-dev

# RHEL/CentOS
sudo yum install ncurses-devel

6.2 编译器问题

现象configure: error: C compiler cannot create executables

解决:安装基础编译工具链。Debian/Ubuntu 执行 sudo apt install build-essential,RHEL/CentOS 执行 sudo yum groupinstall "Development Tools"

6.3 配置缓存与环境变量

有时为了复用检测结果,可以创建 config.cache 文件。但若系统环境变化,需清除缓存重新配置。Autotools 项目可用 make distclean 清除所有生成文件;CMake 项目直接删除 build 目录即可。

6.4 路径与权限

如果普通用户没有目标安装目录的写权限,make install 会失败。解决方法:

  • 使用 sudo 安装。
  • 重新配置,指定 --prefix=$HOME/local 等用户目录,并将 ~/local/bin 加入 PATH。

7. 高级场景:从 autogen.sh 开始

有些源码包没有提供 configure 脚本,而是包含 autogen.shbootstrap 脚本。这通常意味着项目使用了 Autotools,但开发者未将生成的脚本打包,用户需要自己生成。

./autogen.sh          # 生成 configure 脚本
./configure           # 正常配置
make
sudo make install

执行 autogen.sh 可能需要安装 autoconf、automake、libtool 等工具。其作用类似于运行一系列 autoreconf -i 命令。

8. 配置最佳实践总结

  1. 阅读文档:源码包中的 READMEINSTALL 文件通常会说明配置方法和特殊要求。
  2. 使用 --help:任何时候不确定可用选项,先运行 ./configure --helpcmake -LAH
  3. 保持源码清洁:对于 CMake 项目,务必使用独立构建目录;对于 Autotools,也可以创建 build/ 目录并在其中运行 ../configure 实现外部构建。
  4. 记录配置命令:将完整的配置命令写入脚本或笔记,方便日后重新编译或升级。
  5. 利用并行编译make -jN 能大幅缩短编译时间,N 通常取 CPU 核心数+1。