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
相关产品推荐
相关产品推荐

