Windows编译带nginx-dav-ext-module的Nginx报libxslt not found
问题根因
这个报错有两个核心诱因:
- 你当前的configure参数里根本没有启用
http_xslt_module(没有加--with-http_xslt_module参数),触发libxslt检测大概率是之前配置失败留下的objs缓存文件没有清理,导致配置脚本错误加载了历史检测逻辑。 - 就算你需要用到XSLT模块,你安装的
mingw-w64-x86_64-libxslt是MinGW编译的二进制版本,和你正在使用的MSVC(cl.exe)编译工具链ABI不兼容,就算路径匹配也没法正常链接;同时如果你开的是默认的MSYS2 MSYS终端,默认PATH不会扫描mingw64目录下的库文件,自然检测不到。
排查解决步骤
步骤1:清理编译缓存重新配置(无XSLT需求时这步即可解决问题)
你当前的模块列表里没有XSLT相关需求,先执行命令清理残留配置文件:
# 进入nginx源码根目录 cd /d/source/nginx/nginx # 删除所有配置生成的中间缓存文件 rm -rf objs Makefile
清理完成后不要直接开MSYS2默认终端操作,按正确流程启动编译环境:
- 从开始菜单打开对应VC Build Tools版本的「x64 Native Tools Command Prompt for VS 20xx」
- 在该命令行中执行以下命令启动MSYS2,自动加载VC的编译环境变量:
C:\msys64\msys2_shell.cmd -use-full-path
- 在弹出的MSYS2终端中重新执行你之前写的configure脚本即可,不会再触发libxslt相关检测。
步骤2:需要启用XSLT模块时替换正确的依赖版本
如果后续需要添加XSLT功能,不要安装MinGW版本的libxslt,按以下流程操作:
- 下载libxslt、libxml2的源码,用当前的MSVC编译器提前编译出静态库版本
- 重新执行configure时追加以下参数,替换为你实际的编译输出路径:
--with-http_xslt_module \ --with-libxslt=inc=D:/source/libxslt/dist/include,lib=D:/source/libxslt/dist/lib \ --with-libxml2=inc=D:/source/libxml2/dist/include,lib=D:/source/libxml2/dist/lib
额外注意事项
- 执行configure前先跑
which cl确认能识别VC编译器,跑which perl确认调用的是MSYS2自带的perl(路径显示为/usr/bin/perl),不要让Strawberry Perl的路径优先级高于MSYS2自带perl,否则会导致配置脚本检测逻辑异常。 - 你加载的
nginx-dav-ext-module依赖expat库,需要提前用MSVC编译好expat静态库,执行configure时在--add-module参数旁追加--with-libexpat=inc=你的expat头文件路径,lib=你的expat库文件路径,否则后续检测WebDAV扩展模块依赖时会报错。
内容的提问来源于stack exchange,提问作者Doctor.Who.
相关产品推荐
相关产品推荐

