1. Hello World 的 Autotools 化

Hello World 的 Autotools 化 学习卡片

任务说明

本案例将一个最简单的 C 语言 Hello World 程序改造为使用 GNU Autotools 构建的项目。完成目标后,用户可以通过标准的 ./configure && make 流程编译程序,并通过 make install 安装到指定目录,最终在命令行执行 hello 命令输出问候语。

项目结构

在空目录 hello-autotools/ 中创建以下三个文件:

hello-autotools/
├── configure.ac
├── Makefile.am
└── src/
    ├── Makefile.am
    └── main.c

源文件实现

src/main.c — 程序入口,打印问候语:

#include <stdio.h>

int main(void) {
    printf("Hello, Autotools World!\n");
    return 0;
}

configure.ac — Autoconf 配置脚本模板,声明项目信息并启用 Automake:

AC_INIT([hello-autotools], [1.0], [your@email.com])
AM_INIT_AUTOMAKE([foreign])
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([Makefile src/Makefile])
AC_OUTPUT

Makefile.am(顶层)— 声明子目录:

SUBDIRS = src

src/Makefile.am — 声明可执行文件的构建规则:

bin_PROGRAMS = hello
hello_SOURCES = main.c

构建与安装

在项目根目录依次执行以下命令:

autoreconf --install
./configure
make
sudo make install

说明:autoreconf --install 会依次调用 autoconf、automake 并生成缺失的辅助文件(如 configure 脚本、Makefile.in 模板)。--foreign 选项放宽了 GNU 编码标准检查,避免因缺少 NEWS、AUTHORS 等文件而报错。

验证方法与判定标准

完成安装后,在任意目录执行:

hello

若终端输出 Hello, Autotools World! 且退出码为 0,则判定案例通过。若未执行 make install,也可在 src/ 目录下直接运行 ./hello 验证编译产物。

Autotools 工具链数据流

输入文件 configure.ac Makefile.am src/Makefile.am src/main.c Autotools 工具链 autoreconf autoconf automake 生成文件 configure Makefile.in src/Makefile.in hello (可执行文件) gcc (make) ./configure 生成 Makefile → make 调用 gcc 编译 src/main.c → 生成 hello

关键点说明

  • AC_CONFIG_HEADERS([config.h]) 会生成 config.h,本案例虽未直接引用,但保留该宏可为后续添加平台特性检测预留标准接口。
  • bin_PROGRAMS 是 Automake 约定的变量名,表示安装到 bindir(默认为 /usr/local/bin)的可执行程序。
  • 若系统缺少 autoreconf,需先安装 autoconf 与 automake 软件包(Debian/Ubuntu 下执行 sudo apt install autoconf automake)。