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 系统编程的各个主题了。

相关推荐
StarsGreen1 小时前
libva在intel平台上的前端流程简介
linux
坤坤子吖4 小时前
Linux网络编程:自定义应用层协议与 JSON 序列化
linux·服务器·网络·c++·笔记·json
Sayai4 小时前
Neo4j 图数据质量检查实战:环路检测、孤立节点与连通分量,两条 Cypher 引出的数据体检清单(含变长路径性能陷阱)
运维·neo4j·图数据库·数据质量·cypher
Elastic 中国社区官方博客5 小时前
更少的位数,相同的召回率:DiskBBQ 更保守的自动校准扫描
大数据·运维·开发语言·人工智能·elasticsearch·搜索引擎
方便面不加香菜5 小时前
Docker Volume -- 管理卷Volume详解
运维·docker·容器
沫璃染墨5 小时前
从零入门计算机网络系列(十八):TCP连接管理详解——从三次握手与四次挥手到TIME_WAIT机制
运维·服务器·网络·c++·网络协议·tcp/ip·tcp
Felven5 小时前
华为鲲鹏920s芯片serdestool工具使用说明
linux·运维·服务器·华为·鲲鹏920·serdestool
江湖有缘6 小时前
Docker实战 | 使用Docker部署lemonitor镜像站点列表程序
运维·docker·容器
莫晓燚6 小时前
mall 电商项目完整部署---实战
linux·运维·docker·容器
咋的啥名都用不了呢~6 小时前
Linux项目部署5(安装Nginx的插件)
linux