在 CentOS 7 上给 PHP 加模块,configure 跑到一半停住,最后一行是 libxml2 not found,让我检查 xml2-config 的位置。机器上明明装了 libxml2,rpm -qa 能查到,问题在于装的是运行库,不带头文件和配置脚本。

运行时包和开发包是两套

libxml2 提供的是 so 动态库,程序跑起来需要它。编译阶段需要头文件和 xml2-config 这个脚本,被单独拆到 libxml2-devel 里。只装前者,configure 一定找不到。

yum install -y libxml2-devel

装完执行 xml2-config --version,能输出版本号就说明路径通了。没有输出,检查 /usr/bin/xml2-config 是否存在,或者用 which 找。

换发行版名字就变了

  • CentOS 7、RHEL 7 用 yum,包名 libxml2-devel。
  • CentOS 8 之后和 Rocky、Alma 用 dnf,包名一样,但老源已迁到 vault,直接 yum 会 404,得先改 repo 地址。
  • Debian、Ubuntu 叫 libxml2-dev,不是 devel,照抄教程装不上,这是最常犯的错。
  • Alpine 用 apk add libxml2-dev,编译前还要装 build-base。

装了还是找不到的几种情况

同时存在多个版本时,configure 可能指到了旧路径。编译参数里显式加 --with-libxml-dir 指向正确前缀,通常写 /usr。还不行就给 PKG_CONFIG_PATH 加上对应的 pkgconfig 目录,再重新执行 configure。

自己源码编译过 libxml2 的机器更麻烦,装到 /usr/local 下,系统库和自编译库混着,configure 时容易链接错。要么统一用包管理器,要么在编译参数里把路径写死。

装完别忘刷新缓存

新装的库如果在非标准路径,执行一次 ldconfig,否则运行时报 cannot open shared object file,看着像没装。这个错和编译期那个错经常被混为一谈,其实一个发生在构建时,一个发生在启动时,排查方向完全不同。

顺手提醒:CentOS 7 已经停止维护,公网机器继续用它风险不小。迁移到 Rocky 或 Alma 之后,同样的包名和命令基本不用改,成本比想象中低。