You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arch Linux编译PHP-8.2.12源码报错:xmlSaveNoEmptyTags未定义求助

在Arch Linux编译PHP-8.2.12源码失败的解决方案

问题描述

我在Arch Linux系统上从源码编译PHP-8.2.12版本时遇到错误,查阅的教程大多针对Ubuntu/Debian系统,想知道是缺少依赖还是需要调整编译参数?

安装流程

pacman -S --needed --noconfirm base base-devel libpqxx libsodium tidy libxml2 libxslt libxmlb libzip re2c libgccjit libzip autoconf bison

yay --noconfirm c-client imap

git clone -b "PHP-8.2.12" --single-branch https://github.com/php/php-src.git

cd php-src/

./buildconf --force

./configure --prefix=/usr/local --enable-fpm --with-fpm-systemd --with-fpm-acl --with-fpm-apparmor --enable-debug --enable-zts --with-openssl \
        --with-system-ciphers --with-pcre-jit --with-zlib --enable-bcmath --enable-calendar --with-curl --with-lmdb --enable-exif --with-ffi --enable-ftp \
        --with-webp --with-jpeg --with-xpm --with-freetype --with-imap --with-imap-ssl --enable-intl --with-ldap --enable-mbstring --with-mysqli --with-mysql-sock \
        --with-pgsql --with-readline --enable-soap --enable-sockets --with-sodium --with-tidy --with-xsl --with-zip --enable-mysqlnd --with-pear --with-kerberos

make -j$(nproc)

编译错误信息

...

/bin/sh /root/php-src/libtool --silent --preserve-dup-deps --tag CC --mode=compile cc -Iext/dom/ -I/root/php-src/ext/dom/ -I/root/php-src/include -I/root/php-src/main -I/root/php-src -I/root/php-src/ext/date/lib -I/usr/include/libxml2 -I/usr/include/imap -I/root/php-src/ext/mbstring/libmbfl -I/root/php-src/ext/mbstring/libmbfl/mbfl -I/root/php-src/TSRM -I/root/php-src/Zend  -D_GNU_SOURCE -D_REENTRANT -I/usr/include/imap -pthread  -fno-common -Wstrict-prototypes -Wformat-truncation -Wlogical-op -Wduplicated-cond -Wno-clobbered -Wall -Wextra -Wno-strict-aliasing -Wno-unused-parameter -Wno-sign-compare -g -fvisibility=hidden -pthread -O0 -Wimplicit-fallthrough=1 -DZTS -DZEND_SIGNALS    -c /root/php-src/ext/dom/domexception.c -o ext/dom/domexception.lo  -MMD -MF ext/dom/domexception.dep -MT ext/dom/domexception.lo
/bin/sh /root/php-src/libtool --silent --preserve-dup-deps --tag CC --mode=compile cc -Iext/dom/ -I/root/php-src/ext/dom/ -I/root/php-src/include -I/root/php-src/main -I/root/php-src -I/root/php-src/ext/date/lib -I/usr/include/libxml2 -I/usr/include/imap -I/root/php-src/ext/mbstring/libmbfl -I/root/php-src/ext/mbstring/libmbfl/mbfl -I/root/php-src/TSRM -I/root/php-src/Zend  -D_GNU_SOURCE -D_REENTRANT -I/usr/include/imap -pthread  -fno-common -Wstrict-prototypes -Wformat-truncation -Wlogical-op -Wduplicated-cond -Wno-clobbered -Wall -Wextra -Wno-strict-aliasing -Wno-unused-parameter -Wno-sign-compare -g -fvisibility=hidden -pthread -O0 -Wimplicit-fallthrough=1 -DZTS -DZEND_SIGNALS    -c /root/php-src/ext/dom/parentnode.c -o ext/dom/parentnode.lo  -MMD -MF ext/dom/parentnode.dep -MT ext/dom/parentnode.lo
/root/php-src/ext/dom/document.c: In function ‘zim_DOMDocument_save’:
/root/php-src/ext/dom/document.c:1434:29: error: ‘xmlSaveNoEmptyTags’ undeclared (first use in this function)
 1434 |                 saveempty = xmlSaveNoEmptyTags;
      |                             ^~~~~~~~~~~~~~~~~~
/root/php-src/ext/dom/document.c:1434:29: note: each undeclared identifier is reported only once for each function it appears in
/root/php-src/ext/dom/document.c: In function ‘zim_DOMDocument_saveXML’:
/root/php-src/ext/dom/document.c:1486:37: error: ‘xmlSaveNoEmptyTags’ undeclared (first use in this function)
 1486 |                         saveempty = xmlSaveNoEmptyTags;
      |                                     ^~~~~~~~~~~~~~~~~~
/root/php-src/ext/dom/document.c: In function ‘zim_DOMDocument_xinclude’:
/root/php-src/ext/dom/document.c:1582:9: warning: ‘__xmlLoadExtDtdDefaultValue’ is deprecated [-Wdeprecated-declarations]
 1582 |         PHP_LIBXML_SANITIZE_GLOBALS(xinclude);
      |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/libxml2/libxml/parser.h:13,
                 from /root/php-src/ext/dom/php_dom.h:29,
                 from /root/php-src/ext/dom/document.c:24:
/usr/include/libxml2/libxml/xmlversion.h:499:27: note: declared here
  499 |     attrs XMLPUBFUN type *__##name(void);
      |                           ^~
/usr/include/libxml2/libxml/parser.h:854:16: note: in expansion of macro ‘XML_DECLARE_GLOBAL’
  854 | #define XML_OP XML_DECLARE_GLOBAL
      |                ^~~~~~~~~~~~~~~~~~

...
# grep -rl xmlSaveNoEmptyTags
ext/libxml/php_libxml2.def
ext/dom/document.c

# cat /proc/version 
Linux version 6.6.1-arch1-1 (linux@archlinux) (gcc (GCC) 13.2.1 20230801, GNU ld (GNU Binutils) 2.41.0) #1 SMP PREEMPT_DYNAMIC Wed, 08 Nov 2023 16:05:38 +0000

问题根源

编译错误提示xmlSaveNoEmptyTags未声明,这是因为Arch Linux当前的libxml2版本(2.12+)移除了该宏定义,而PHP-8.2.12的DOM扩展代码仍在引用这个已被废弃的符号。

解决步骤

方案1:应用PHP官方补丁(推荐)

PHP官方已经针对libxml2 2.12+的兼容性问题提交了补丁,直接在php-src目录下执行:

curl -s https://github.com/php/php-src/commit/0a9f0d3d.patch | git apply -

补丁会自动修改ext/dom/document.c中的代码,替换旧的宏定义为兼容版本。

方案2:手动修改代码

如果无法使用git apply,可直接编辑ext/dom/document.c文件:

  • 找到第1434行和第1486行的xmlSaveNoEmptyTags,替换为XML_SAVE_NO_EMPTY_TAGS
  • 保存文件后重新执行编译命令

方案3:降级libxml2(不推荐)

若暂时不想修改代码,可降级libxml2到2.11版本:

# 从归档仓库下载旧版本
pacman -U https://archive.archlinux.org/packages/l/libxml2/libxml2-2.11.6-1-x86_64.pkg.tar.zst
# 临时锁定版本避免自动更新
echo "libxml2" >> /etc/pacman.conf.d/ignore.pacman

注意:降级可能会影响其他依赖libxml2的软件,不建议长期使用。

验证修复

应用补丁或修改代码后,重新执行编译:

make clean
./configure [你的编译参数]
make -j$(nproc)

内容的提问来源于stack exchange,提问作者svarlitskiy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 15:45:09