如何编译libxml2避免include目录下出现libxml2/libxml两级结构?
解决libxml2编译后头文件嵌套导致php-xml无法找到头文件的问题
你遇到的问题根源是:libxml2默认会将头文件安装到${prefix}/include/libxml2/libxml目录下,而php-xml编译脚本通过#include <libxml/parser.h>查找头文件时,需要编译器能访问到libxml2这个父目录,而非直接指向libxml子目录。以下是几种可行的解决方法:
方案1:修正php-xml编译时的LIBXML_CFLAGS参数(无需重新编译libxml2)
你之前错误地将LIBXML_CFLAGS指向了$LIB_INCLUDE/libxml2/libxml,正确的做法是指向libxml2目录,让编译器能在该目录下找到libxml子文件夹里的头文件:
LIBXML_CFLAGS="-I$PHPEXT_DIR_PACKAGES/include/libxml2" LIBXML_LIBS="-L$PHPEXT_DIR_PACKAGES/lib -lxml2" ./configure [你的php-xml其他编译参数]
执行上述命令后重新编译安装php-xml即可。
方案2:创建软链接简化头文件路径(快速临时修复)
如果不想修改编译参数,可以直接在include目录下创建软链接,将嵌套的libxml目录映射到include根目录:
ln -s $PHPEXT_DIR_PACKAGES/include/libxml2/libxml $PHPEXT_DIR_PACKAGES/include/libxml
这样php-xml编译时就能直接通过#include <libxml/parser.h>找到头文件。
方案3:重新编译libxml2调整安装路径(彻底解决)
如果希望从根源避免嵌套结构,可以重新编译libxml2时,通过--includedir参数指定头文件的安装根目录,让libxml文件夹直接放在include下:
function libxml() { wget -O - https://download.gnome.org/sources/libxml2/2.11/libxml2-2.11.5.tar.xz | tar --strip-components 1 -xJ ./configure CPPFLAGS="-I$LIB_INCLUDE" LDFLAGS="-L$LIB_LIBRARY" \ --prefix=$PHPEXT_DIR_PACKAGES \ --includedir=$PHPEXT_DIR_PACKAGES/include \ --with-reader --with-regexps --with-schemas --with-threads --with-tree --with-writer --with-output --with-iconv --with-zlib --with-html --with-http --with-lzma --without-python --with-minimum make && make install }
重新执行这个函数编译安装后,头文件会直接出现在$PHPEXT_DIR_PACKAGES/include/libxml目录下,后续编译php-xml时无需额外设置路径参数。
内容的提问来源于stack exchange,提问作者Walddys E. Dorrejo Céspedes
相关产品推荐
相关产品推荐

