Ubuntu 搭建 APUE 环境:从源码编译到第一个示例跑通

1. 引言

《UNIX 环境高级编程》(Advanced Programming in the UNIX Environment,简称 APUE)是学习 Unix/Linux 系统编程的经典书籍。书中所有示例代码都依赖作者提供的 libapue 库,因此动手实践的第一步,就是在自己的机器上把这本书的配套环境搭建起来。

本文以 Ubuntu 为例,从安装依赖、获取源码、编译库,到跑通第一个示例,一步步带你完成 APUE 环境的搭建。

2. 准备工作

2.1 确认系统版本

建议使用 Ubuntu 20.04 或更高版本。可以通过以下命令查看系统信息:

bash 复制代码
lsb_release -a

2.2 安装编译工具链

APUE 源码需要 gcc、make 等工具,以及 libbsd-dev(部分版本需要)。执行:

bash 复制代码
sudo apt update
sudo apt install -y build-essential libbsd-dev

如果后续编译报缺少头文件,再按提示补充安装对应开发包。

3. 获取 APUE 源码

APUE 第三版(对应书中的 apue.3e)源码托管在 GitHub 上,克隆到本地:

bash 复制代码
git clone https://github.com/stevenschmidt/apue.3e.git
cd apue.3e

说明:仓库名中的 stevenschmidt 是社区维护的镜像,与官方源码一致。你也可以使用其他可信镜像。

4. 编译 libapue 库

APUE 的示例代码都链接到 libapue.a 静态库,需要先编译它。

4.1 修改 Make.defines

进入源码目录后,先查看 Make.defines 文件,确认平台相关配置:

bash 复制代码
cat Make.defines

通常无需修改即可直接编译。若编译报错,检查 WKDIR 是否指向当前源码目录。

4.2 编译库

在源码根目录执行:

bash 复制代码
make

该命令会编译 libapue.a 以及各章节的示例程序。编译完成后,确认库文件已生成:

bash 复制代码
ls lib/

应能看到 libapue.a。

5. 编译并运行第一个示例

以第一章的 ls 示例为例,验证环境是否可用。

5.1 进入示例目录

bash 复制代码
cd intro

5.2 编译示例

bash 复制代码
make ls1

5.3 运行

bash 复制代码
./ls1 /

如果能看到根目录的文件列表,说明 APUE 环境搭建成功。

6. 常见问题排查

6.1 编译报错:apue.h: No such file or directory

说明头文件路径未配置。检查 Make.defines 中的 INCDIR 是否指向源码根目录,必要时手动指定:

bash 复制代码
gcc -I../include -L../lib -lapue -o ls1 ls1.c

6.2 链接报错:undefined reference to 'err_quit'

说明 libapue.a 未正确链接。确认编译命令中包含 -L../lib -lapue。

6.3 缺少 libbsd 相关符号

安装 libbsd-dev 后重新编译:

bash 复制代码
sudo apt install -y libbsd-dev
make clean && make

7. 小结

至此,你已经在 Ubuntu 上完成了 APUE 环境的搭建:

  • 安装了编译工具链与依赖;
  • 获取了 APUE 第三版源码;
  • 编译生成了 libapue.a 静态库;
  • 成功编译并运行了第一个示例程序。

接下来就可以对照书中章节,逐个编译运行示例,深入理解 Unix 系统编程的各个主题了。

相关推荐
张小姐的猫4 分钟前
【MySQL】数据类型
android·linux·数据库·c++·mysql·adb·php
金色熊族7 分钟前
ebpf程序开发(一)--ubuntu20.04
linux·ebpf
‎ദ്ദിᵔ.˛.ᵔ₎11 分钟前
Linux 线程控制
linux
红姐跨境书31 分钟前
Facebook账号频繁被要求验证怎么办?从登录异常到浏览器环境排查
运维·服务器
叼烟扛炮37 分钟前
Linux 学习笔记(八):GCC 编译器的四大阶段与链接原理
linux·笔记·学习
月落汀兰1 小时前
服务器出问题没人告警?Zabbix6.0 LNMP 部署,MySQL 监控 + 邮件告警保姆级实战
运维·服务器·zabbix
运维踩坑日记1 小时前
【无标题】
linux·运维·windows
xiaoyunxuexibiji1 小时前
供应商绩效评价体系如何建立?从评价指标到自动化考核
运维·人工智能·自动化
Z21-X1 小时前
云原生运维学习笔记:从云计算概念到服务器硬件的入门之旅
运维·笔记·学习·云原生
虚无的纽扣1 小时前
【Linux】线程(下):怎么创建、终止与分离一个线程
linux·运维·服务器