编译成功但运行时报“error while loading shared libraries”,说明链接阶段正常而运行时动态库路径未生效;需用ldd检查依赖、readelf验证rpath是否写入、并配置LD_LIBRARY_PATH或/etc/ld.so.conf.d/确保系统能找到库。

编译成功但运行时报 error while loading shared libraries,说明链接时用了正确路径,但系统启动时找不到动态库。这不是编译失败,而是运行时环境没配好。
看 nginx 二进制实际依赖了哪些库
用 ldd 检查 nginx 主程序或模块是否链接到了目标库:
-
ldd /usr/local/nginx/sbin/nginx | grep pcre—— 查 PCRE 是否指向你指定的/opt/pcre/lib/libpcre.so -
ldd /usr/local/nginx/modules/ngx_http_brotli_filter_module.so | grep brotli—— 查 Brotli 模块是否链接到libbrotlidec.so - 如果显示
not found,说明 configure 阶段虽指定了路径,但链接器最终没把库打进二进制,或 -rpath 没生效
确认 -rpath 是否写进了二进制
-Wl,-rpath,xxx 是让运行时搜索路径固化进可执行文件的关键。验证方法:
-
readelf -d /usr/local/nginx/sbin/nginx | grep rpath—— 应看到类似0x000000000000000f (RPATH) Library rpath: [/opt/openssl/lib:/opt/pcre/lib] - 若无输出,说明
--with-ld-opt="-Wl,-rpath,..."没生效,常见原因是参数拼写错误(比如漏了-Wl,)或被其他选项覆盖
检查系统级库搜索路径是否包含你的目录
即使有 rpath,系统仍会按顺序查找:rpath → runpath → LD_LIBRARY_PATH → /etc/ld.so.cache → 默认路径。排查步骤:
- 临时测试:
LD_LIBRARY_PATH="/opt/pcre/lib:/opt/openssl/lib" /usr/local/nginx/sbin/nginx -t - 永久配置:在
/etc/ld.so.conf.d/nginx-deps.conf中逐行写入各 lib 路径,再运行sudo ldconfig -v | grep -E "(pcre|ssl|zlib)"确认已加载 - 注意:某些容器或最小化系统默认不启用
/etc/ld.so.conf.d/,需手动执行ldconfig
查 config.log 看 configure 实际用了哪个路径
编译前 configure 会探测所有依赖。打开当前目录下的 config.log,搜索关键词:
-
checking for PCRE library—— 看它最终 pick 的是哪个libpcre.so路径 -
checking for OpenSSL library—— 看头文件和库是否来自同一安装树(混用/usr/include+/opt/openssl/lib必出问题) - 若发现 configure 自动 fallback 到了系统路径,说明你传的
--with-pcre-lib等参数未被识别,可能拼错或版本不支持该参数


















