Apache APR 安装指南
Ubuntu 22.04 源码编译安装 Apache APR 1.7.6 与 apr-util 1.6.5:前置依赖、双组件源码编译安装、共享库注册与 apr-1-config/apu-1-config 安装验证,附 apt 仓库备用方案、多方案对比、常见问题与卸载方式;APR 为 C 语言库组件,无守护进程,systemd 服务托管不适用,全程实测。
Apache APR 安装指南
目标:在 Ubuntu 22.04 服务器上完成 Apache APR(Apache Portable Runtime)1.7.6 与 apr-util 1.6.5 的源码编译安装与验证。APR 是 C 语言可移植运行库,以「库 + 开发头文件」形态提供,无守护进程、无监听端口,systemd 服务托管不适用;安装完成的标志是 apr-1-config / apu-1-config 可用且共享库完成系统注册。本文给出源码编译(官方推荐)与 apt 仓库两种安装方案、多方案对比、常见问题与卸载方式。所有命令与回显均在 Ubuntu 22.04.5 实测通过。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS(VERSION_CODENAME=jammy)
- 架构:x86_64(内核 6.8.0-138-generic)
- 编译工具链:gcc 11.4.0、GNU Make 4.3、GNU libtool 2.4.6、pkg-config 0.29.2
- APR 版本:apr-1.7.6(1.7.x 最新)+ apr-util-1.6.5(1.6.x 最新)
- 安装前缀:
/usr/local/apr - 演示账号:root
💡 说明:APR 与 apr-util 是两个独立发布的源码包。apr-util 编译时依赖已安装好的 APR(configure 阶段通过
--with-apr指向 apr-1-config),因此两者必须先装 APR、再装 apr-util。
二、前置条件
2.1 更新软件源
apt-get update
实测回显(尾部):
Get:18 http://archive.ubuntu.com/ubuntu jammy-backports/universe amd64 Packages [35.6 kB]
Fetched 49.0 MB in 6s (8095 kB/s)
Reading package lists...
2.2 安装编译工具与基础依赖
最小化系统初始只有 tar,gcc、make、wget、curl、pkg-config 均缺失,需一次性装齐:
DEBIAN_FRONTEND=noninteractive apt-get install -y build-essential libtool-bin wget curl pkg-config
实测回显(尾部):
Processing triggers for ca-certificates (20260601~22.04.1) ...
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
验证工具链版本:
# gcc --version | head -1
gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0
# make --version | head -1
GNU Make 4.3
# libtool --version | head -1
libtool (GNU libtool) 2.4.6
# pkg-config --version
0.29.2
⚠️ 注意:apr-util 需要 expat 开发头文件(
libexpat1-dev),若跳过会导致 apr-util 的 configure 失败。该依赖在第四章 apr-util 安装步骤中安装。
三、版本选型说明
通过 Apache 官方下载目录探测当前可用的 APR 系列版本:
wget -qO- https://dlcdn.apache.org/apr/ | grep -oE "(apr|apr-util|apr-iconv)-[0-9.]+\.tar\.gz" | sort -uV
实测回显:
apr-1.0.1.tar.gz
apr-1.6.5.tar.gz
apr-1.7.6.tar.gz
apr-iconv-1.2.2.tar.gz
apr-util-1.6.5.tar.gz
选型结论:
| 组件 | 选择版本 | 说明 |
|---|---|---|
| apr | 1.7.6 | 1.7.x 系列最新,核心运行库 |
| apr-util | 1.6.5 | 1.6.x 系列最新,配套工具库(UUID、DBD、DBM、XML 等) |
💡 说明:apr 与 apr-util 版本号相互独立(APR 1.7.x 对应 apr-util 1.6.x),两者均为 1.x API(头文件目录
apr-1、配置工具apr-1-config/apu-1-config)。
四、方案 A:源码编译安装(官方推荐)
4.1 下载源码包并校验 sha256
cd /tmp && wget -q https://dlcdn.apache.org/apr/apr-1.7.6.tar.gz https://dlcdn.apache.org/apr/apr-util-1.6.5.tar.gz https://dlcdn.apache.org/apr/apr-1.7.6.tar.gz.sha256 https://dlcdn.apache.org/apr/apr-util-1.6.5.tar.gz.sha256
sha256sum -c apr-1.7.6.tar.gz.sha256
sha256sum -c apr-util-1.6.5.tar.gz.sha256
ls -lh apr-1.7.6.tar.gz apr-util-1.6.5.tar.gz
实测回显:
# sha256sum -c apr-1.7.6.tar.gz.sha256
apr-1.7.6.tar.gz: OK
# sha256sum -c apr-util-1.6.5.tar.gz.sha256
apr-util-1.6.5.tar.gz: OK
# ls -lh apr-1.7.6.tar.gz apr-util-1.6.5.tar.gz
-rw-r--r-- 1 root root 1.1M May 16 2025 apr-1.7.6.tar.gz
-rw-r--r-- 1 root root 555K Aug 10 11:22 apr-util-1.6.5.tar.gz
4.2 编译安装 APR 1.7.6
解压、配置、编译、安装:
tar -xzf apr-1.7.6.tar.gz && tar -xzf apr-util-1.6.5.tar.gz
cd apr-1.7.6
./configure --prefix=/usr/local/apr
make -j4
make install
configure 阶段关键探测回显:
checking whether we are cross compiling... no
checking whether to enable -D_LARGEFILE64_SOURCE... no
Checking for Threads...
Checking for IPv6 Networking support...
checking if APR supports IPv6... yes
configure 尾部回显:
config.status: creating apr-1-config
config.status: creating apr.pc
config.status: creating test/Makefile
config.status: creating test/internal/Makefile
config.status: creating include/arch/unix/apr_private.h
config.status: executing libtool commands
rm: cannot remove 'libtoolT': No such file or directory
config.status: executing default commands
⚠️ 注意:
rm: cannot remove 'libtoolT'是 1.7.6 configure 脚本自身的已知无害提示(rm 变量为空所致),configure 退出码为 0,编译安装均正常,可直接忽略(老版本 1.7.0 曾有同类问题需改 configure 文件,1.7.6 实测无需处理,详见「九、常见问题」)。
make 阶段退出码 0,尾部为 libtool 链接 libapr-1.la(含 -version-info 7:6:7,链接 -lcrypt -lpthread):
make[1]: Leaving directory '/tmp/apr-1.7.6'
make install 尾部回显(build 辅助脚本装入 build-1,apr-1-config 装入 bin):
/usr/bin/install -c -m 755 /tmp/apr-1.7.6/build/mkdir.sh /usr/local/apr/build-1
/usr/bin/install -c -m 644 build/apr_rules.out /usr/local/apr/build-1/apr_rules.mk
/usr/bin/install -c -m 755 apr-config.out /usr/local/apr/bin/apr-1-config
4.3 安装 expat 开发头并编译安装 APR-util 1.6.5
apr-util 的 XML 解析依赖 expat 头文件,先安装 libexpat1-dev,再以 --with-apr 指向已装好的 apr-1-config:
apt-get install -y libexpat1-dev
cd /tmp/apr-util-1.6.5
./configure --prefix=/usr/local/apr --with-apr=/usr/local/apr/bin/apr-1-config
make -j4
make install
libexpat1-dev 安装回显:
Unpacking libexpat1-dev:amd64 (2.4.7-1ubuntu0.9) ...
Setting up libexpat1-dev:amd64 (2.4.7-1ubuntu0.9) ...
apr-util configure 关键探测回显:
checking for APR... yes
checking whether APR has DSO support... yes
configure 尾部回显:
config.status: creating include/apu_want.h
config.status: creating test/Makefile
config.status: creating include/private/apu_config.h
config.status: executing default commands
make install 回显(libtool 提示库已装入 /usr/local/apr/lib,并给出运行期共享库路径提示):
libtool: install: ranlib /usr/local/apr/lib/libaprutil-1.a
----------------------------------------------------------------------
Libraries have been installed in:
/usr/local/apr/lib
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the 'LD_RUN_PATH' environment variable
during linking
安装收尾关键行:
/usr/bin/install -c -m 644 aprutil.exp /usr/local/apr/lib
/usr/bin/install -c -m 755 apu-config.out /usr/local/apr/bin/apu-1-config
4.4 注册共享库搜索路径
/usr/local/apr/lib 不在系统默认共享库搜索路径中,写入 ld.so 配置并刷新缓存:
echo "/usr/local/apr/lib" > /etc/ld.so.conf.d/apr.conf
ldconfig
ldconfig -p | grep -E "apr(u?)util|libapr-1"
实测回显:
libaprutil-1.so.0 (libc6,x86-64) => /usr/local/apr/lib/libaprutil-1.so.0
libaprutil-1.so (libc6,x86-64) => /usr/local/apr/lib/libaprutil-1.so
libapr-1.so.0 (libc6,x86-64) => /usr/local/apr/lib/libapr-1.so.0
libapr-1.so (libc6,x86-64) => /usr/local/apr/lib/libapr-1.so
⚠️ 注意:若跳过本步,编译能通过但运行时将报
error while loading shared libraries: libapr-1.so.0,排障过程详见「九、常见问题」。
4.5 安装产物布局
安装完成后 /usr/local/apr 目录结构:
# ls /usr/local/apr
bin
build-1
include
lib
# ls /usr/local/apr/bin
apr-1-config
apu-1-config
# ls /usr/local/apr/lib
apr.exp
aprutil.exp
libapr-1.a
libapr-1.la
libapr-1.so
libapr-1.so.0
libapr-1.so.0.7.6
libaprutil-1.a
libaprutil-1.la
libaprutil-1.so
libaprutil-1.so.0
libaprutil-1.so.0.6.5
pkgconfig
# ls /usr/local/apr/build-1
apr_rules.mk
libtool
make_exports.awk
make_var_export.awk
mkdir.sh
# ls /usr/local/apr/lib/pkgconfig
apr-1.pc
apr-util-1.pc
# ls /usr/local/apr/include/apr-1 | head -12
apr.h
apr_allocator.h
apr_anylock.h
apr_atomic.h
apr_base64.h
apr_buckets.h
apr_crypto.h
apr_cstr.h
apr_date.h
apr_dbd.h
apr_dbm.h
apr_dso.h
头文件目录 include/apr-1 共 76 个头文件。各目录用途:
| 目录 | 用途 |
|---|---|
bin/ | apr-1-config、apu-1-config 编译参数查询工具 |
include/apr-1/ | 全部 C 头文件(76 个) |
lib/ | 动态库 .so、静态库 .a、libtool .la、pkgconfig 元数据 |
build-1/ | apr_rules.mk 等编译辅助文件(供其他项目复用 APR 编译规则) |
4.6 安装验证(apr-1-config / apu-1-config / pkg-config)
验证两个配置工具的版本与关键输出:
apr-1-config --version: 1.7.6
apr-1-config --cflags: -g -O2
apr-1-config --cppflags: -DLINUX -D_REENTRANT -D_GNU_SOURCE
apr-1-config --includes: -I/usr/local/apr/include/apr-1
apr-1-config --libs: -lcrypt -lpthread
apr-1-config --link-ld: -L/usr/local/apr/lib -lapr-1
apu-1-config --version: 1.6.5
apu-1-config --libs: -lexpat
apu-1-config --link-ld: -L/usr/local/apr/lib -laprutil-1
再以 pkg-config 双重验证(需先把 pkgconfig 目录加入搜索路径):
export PKG_CONFIG_PATH=/usr/local/apr/lib/pkgconfig
pkg-config --modversion apr-1
pkg-config --modversion apr-util-1
pkg-config --cflags --libs apr-util-1
实测回显:
# pkg-config --modversion apr-1
1.7.6
# pkg-config --modversion apr-util-1
1.6.5
# pkg-config --cflags --libs apr-util-1
-DLINUX -D_REENTRANT -D_GNU_SOURCE -g -O2 -I/usr/local/apr/include/apr-1 -L/usr/local/apr/lib -laprutil-1 -lexpat -lapr-1 -lcrypt -lpthread
五、方案 B:Ubuntu 仓库 apt 包安装(备用)
5.1 查看仓库候选版本
apt-cache policy libapr1-dev libaprutil1-dev
实测回显:
libapr1-dev:
Installed: (none)
Candidate: 1.7.0-8ubuntu0.22.04.2
Version table:
1.7.0-8ubuntu0.22.04.2 500
500 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
500 http://security.ubuntu.com/ubuntu jammy-security/main amd64 Packages
1.7.0-8build1 500
500 http://archive.ubuntu.com/ubuntu jammy/main amd64 Packages
libaprutil1-dev:
Installed: (none)
Candidate: 1.6.1-5ubuntu4.22.04.3
Version table:
1.6.1-5ubuntu4.22.04.3 500
5.2 安装开发包
apt-get install -y libapr1-dev libaprutil1-dev
实测回显(尾部):
Setting up libapr1-dev (1.7.0-8ubuntu0.22.04.2) ...
Setting up libaprutil1-dev (1.6.1-5ubuntu4.22.04.3) ...
Processing triggers for libc-bin (2.35-0ubuntu3.15) ...
5.3 安装验证
apt 方式把配置工具装到 /usr/bin、库装到 /usr/lib/x86_64-linux-gnu,共享库路径由系统自动管理,无需手工 ldconfig 注册:
# /usr/bin/apr-1-config --version
1.7.0
# /usr/bin/apu-1-config --version
1.6.1
# ls /usr/lib/x86_64-linux-gnu/ | grep -E "^libapr"
libapr-1.a
libapr-1.la
libapr-1.so
libapr-1.so.0
libapr-1.so.0.7.0
libaprutil-1.a
libaprutil-1.la
libaprutil-1.so
libaprutil-1.so.0
libaprutil-1.so.0.6.1
六、多方案对比与选择建议
| 维度 | 方案 A:源码编译 | 方案 B:apt 仓库 |
|---|---|---|
| 版本 | apr 1.7.6 + apr-util 1.6.5(官方最新) | libapr1-dev 1.7.0 / libaprutil1-dev 1.6.1(仓库快照) |
| 安装位置 | /usr/local/apr(独立前缀) | /usr/bin 与 /usr/lib/x86_64-linux-gnu(系统路径) |
| 是否需联网 | 需访问 dlcdn.apache.org | 需访问 Ubuntu 软件源 |
| 共享库注册 | 需手工写 ld.so.conf.d 并 ldconfig | 自动完成 |
| 版本灵活性 | 可选官方任意发布版本 | 受仓库版本限制 |
| 卸载方式 | 删除前缀目录与 ld.so 配置 | apt-get remove 即可 |
选择建议:需要最新版本、自定义 configure 特性(如 --with-crypto、私有前缀)时选方案 A;追求快速起步、交给 apt 统一管理升级时选方案 B。两方案可并存,用配置工具的绝对路径区分版本(见「九、常见问题」9.4)。
七、配置说明
7.1 共享库路径配置
方案 A 的共享库注册由 /etc/ld.so.conf.d/apr.conf 承担,内容为一行:
/usr/local/apr/lib
任何修改(新增、删除该文件)后必须执行 ldconfig 刷新 /etc/ld.so.cache,否则不生效。
7.2 PATH 配置(可选)
源码安装版的 apr-1-config / apu-1-config 位于 /usr/local/apr/bin,默认不在 PATH 中,编译命令里需要写绝对路径。如希望登录后直接使用裸命令,可写入 profile.d:
echo 'export PATH=/usr/local/apr/bin:$PATH' > /etc/profile.d/apr.sh
实测验证(重新登录 shell 后):
# which apr-1-config && apr-1-config --version
/usr/local/apr/bin/apr-1-config
1.7.6
💡 说明:
/etc/profile.d/*.sh只对登录 shell 生效;未配置 PATH 时,建议编译命令直接使用绝对路径/usr/local/apr/bin/apr-1-config,不受 shell 环境影响。
7.3 pkg-config 搜索路径
pkg-config 元数据位于 /usr/local/apr/lib/pkgconfig(apr-1.pc、apr-util-1.pc)。按会话临时启用:
export PKG_CONFIG_PATH=/usr/local/apr/lib/pkgconfig
7.4 与 systemd 的关系
APR 是纯库组件:安装后只产出头文件、静态/动态库与配置查询工具,不产生任何守护进程、监听端口或服务单元,因此不存在也不需要 systemd 服务托管;「安装成功」的判据是 apr-1-config/apu-1-config 输出正确版本、共享库完成注册,而非 systemctl status。
八、注意事项
- apr 与 apr-util 必须按「先 APR 后 apr-util」顺序安装,apr-util configure 必须携带
--with-apr=/usr/local/apr/bin/apr-1-config。 - 编译 apr-util 前必须安装
libexpat1-dev,否则 configure 阶段因缺少 expat 头文件失败。 - 方案 A 安装后必须执行 4.4 的 ld.so 注册,否则编译产物运行时报共享库找不到。
- 同机并存 apt 版与源码版时,
apr-1-config裸命令默认解析到/usr/bin(apt 版),源码版需用绝对路径或配置 PATH(见 7.2)。 - configure 打印的
rm: cannot remove 'libtoolT'为无害提示,无需处理(见 9.1)。
九、常见问题(FAQ)
9.1 configure 提示 rm: cannot remove 'libtoolT' 需要处理吗
Q: 执行 ./configure --prefix=/usr/local/apr 时尾部出现 rm: cannot remove 'libtoolT': No such file or directory,是否安装失败?
A: 不需要处理。这是 1.7.6 configure 脚本自身的已知无害提示(脚本中 rm 的变量为空所致),随后 config.status: executing default commands 正常结束,configure 退出码为 0,make 与 make install 均正常。实测老版本 1.7.0 曾有同类问题需要手工修改 configure 文件,1.7.6 已无需任何处理,直接继续 make -j4 即可。
9.2 apr-util configure 报 APR could not be located
Q: 编译 apr-util 时报 configure: error: APR could not be located. Please use the --with-apr option. 如何解决?
A: 该报错是因为 apr-util 找不到已安装的 APR。复现(/usr/local/apr/bin 不在 PATH 时,不带 --with-apr 配置):
# ./configure --prefix=/usr/local/apr
Applying apr-util hints file rules for x86_64-pc-linux-gnu
checking for APR... no
configure: error: APR could not be located. Please use the --with-apr option.
(退出码 1)
解决方法:configure 显式携带 --with-apr 指向 apr-1-config 的绝对路径:
./configure --prefix=/usr/local/apr --with-apr=/usr/local/apr/bin/apr-1-config
配置成功时会出现 checking for APR... yes。
9.3 程序运行报 error while loading shared libraries: libapr-1.so.0
Q: 编译通过的程序一运行就报 error while loading shared libraries: libapr-1.so.0: cannot open shared object file 怎么办?
A: 这是编译期链接与运行期查找分离导致的:编译时 -L/usr/local/apr/lib 只对链接器生效,运行时动态加载器只认 ld.so.cache 与默认路径。实测排障过程:
先用 ldd 确认缺口(未注册共享库路径时):
# ldd /root/apr-demo/demo_pool
linux-vdso.so.1 (0x00007fff8f1c1000)
libapr-1.so.0 => not found
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007cb86c52b000)
/lib64/ld-linux-x86-64.so.2 (0x00007cb86c75e000)
# /root/apr-demo/demo_pool
/root/apr-demo/demo_pool: error while loading shared libraries: libapr-1.so.0: cannot open shared object file: No such file or directory
(退出码 127)
解决方法:把 /usr/local/apr/lib 写入 ld.so 配置并刷新缓存:
echo "/usr/local/apr/lib" > /etc/ld.so.conf.d/apr.conf
ldconfig
恢复后再运行 demo_pool、demo_uuid 均正常,ldd 中 libapr-1.so.0 解析为 /usr/local/apr/lib/libapr-1.so.0。
9.4 which apr-1-config 找到的是 apt 版本而非源码安装版本
Q: 同时装了 apt 版(/usr/bin/apr-1-config,1.7.0)与源码版(/usr/local/apr/bin/apr-1-config,1.7.6),裸命令 apr-1-config 输出的却是 1.7.0?
A: 默认 PATH 不含 /usr/local/apr/bin,裸命令按 PATH 顺序解析到 apt 包的 /usr/bin/apr-1-config(实测 which apr-1-config 返回 /usr/bin/apr-1-config)。区分方法任选其一:
- 编译命令直接用绝对路径
/usr/local/apr/bin/apr-1-config(推荐,不依赖 shell 环境); - 按 7.2 写入
/etc/profile.d/apr.sh并重新登录,让源码版优先。
可用 which apr-1-config && apr-1-config --version 随时确认当前解析到的版本。
十、卸载方式
10.1 卸载源码安装版(方案 A)
APR 1.7.6 的 Makefile 未提供 make uninstall 目标,卸载即删除安装前缀与共享库注册:
rm -rf /usr/local/apr
rm -f /etc/ld.so.conf.d/apr.conf
ldconfig
如需清理源码目录,一并删除 /tmp/apr-1.7.6、/tmp/apr-util-1.6.5 与下载的 tar 包。卸载后验证:/usr/local/apr/bin/apr-1-config --version 将提示 No such file or directory,ldconfig -p | grep "libapr-1" 中不再出现 /usr/local/apr/lib 路径(实测均如此)。
10.2 卸载 apt 安装版(方案 B)
apt-get remove --purge -y libapr1-dev libaprutil1-dev
实测回显(尾部):
libapr1-dev* libaprutil1-dev*
0 upgraded, 0 newly installed, 2 to remove and 1 not upgraded.
After this operation, 14.5 MB disk space will be freed.
(Reading database ... 17709 files and directories currently installed.)
Removing libaprutil1-dev (1.6.1-5ubuntu4.22.04.3) ...
Removing libapr1-dev (1.7.0-8ubuntu0.22.04.2) ...
卸载后 /usr/bin/apr-1-config 不再存在(实测 ls /usr/bin/apr-1-config 提示 No such file or directory)。若源码版与 apt 版并存,卸载 apt 版不影响 /usr/local/apr 下的源码版。
十一、参考链接
- APR 官方主页:https://apr.apache.org/
- APR 下载页:https://apr.apache.org/download.cgi
- 官方下载目录(版本探测):https://dlcdn.apache.org/apr/
- APR 官方文档(API 参考):https://apr.apache.org/docs/apr/1.7/
- apr-util 官方文档(API 参考):https://apr.apache.org/docs/apr-util/1.6/