源码编译nginx时“链接库找不到”分configure阶段报错和运行时报错两类:前者因缺开发包(如pcre-devel)或路径未显式指定(需--with-pcre-include/--lib),应查config.log确认实际探测路径;后者因运行时动态库路径未生效,需用ldd和readelf验证依赖及rpath,并配置ld_library_path或/etc/ld.so.conf.d/。

源码编译 Nginx 时提示“链接库找不到”,通常分两种情况:一种是 configure 阶段报错,比如 “PCRE library not found”;另一种是 编译成功但运行时报错,比如 “error while loading shared libraries: libpcre.so.3: cannot open shared object file”。解决思路完全不同,得先区分清楚。
看 configure 报错内容,确认是检测阶段失败
这个阶段出错,说明 Nginx 构建系统压根没找到头文件(如 pcre.h、openssl/ssl.h)或库文件(如 libpcre.so、libssl.so)。不是 Nginx 有问题,而是环境缺东西或路径没对上。
- 检查是否装了开发包,不是运行时包:CentOS 用
yum install pcre-devel openssl-devel zlib-devel,Ubuntu 用apt install libpcre3-dev libssl-dev zlib1g-dev - 验证头文件是否存在:
find /usr -name "pcre.h" 2>/dev/null;查库文件:ls /usr/lib64/libpcre.so* 2>/dev/null - 如果库装在自定义路径(比如
/opt/openssl-1.1.1w/install),必须显式告诉 configure:--with-openssl-include=/opt/openssl-1.1.1w/install/include --with-openssl-lib=/opt/openssl-1.1.1w/install/lib
切忌混用--with-openssl=/path(那是给源码目录用的) - 最后打开
config.log,搜索checking for PCRE library或OpenSSL library,看它实际用了哪个路径——这是最准的依据
运行时报“找不到共享库”,重点查动态链接
make 和 make install 都成功了,但一执行 nginx -t 就报 error while loading shared libraries,说明编译时链上了,运行时却找不到。核心是动态链接器没搜到库。
- 先用
ldd /usr/local/nginx/sbin/nginx | grep pcre看输出是不是not found,确认具体缺哪个库 - 再查二进制里有没有固化搜索路径:
readelf -d /usr/local/nginx/sbin/nginx | grep rpath,应该能看到类似RPATH [/opt/pcre/lib:/opt/openssl/lib] - 如果没 rpath,说明
--with-ld-opt="-Wl,-rpath,/opt/pcre/lib"没生效,常见原因是漏了-Wl,前缀或参数被覆盖 - 临时测试可加环境变量:
LD_LIBRARY_PATH="/opt/pcre/lib:/opt/openssl/lib" nginx -t - 永久生效就写进
/etc/ld.so.conf.d/nginx-deps.conf,每行一个路径,然后运行sudo ldconfig -v
遇到 version XXX not found 类报错,别乱打软链
比如报 libssl.so.1.1: version OPENSSL_1_1_1 not found,意思是库文件存在,但内部缺少 Nginx 编译时依赖的那个符号版本。这不是路径问题,是版本不兼容。
- 典型场景:把别人编译好的 Nginx 二进制拷到新系统、或系统 OpenSSL 升级后旧库被覆盖
- 不能简单
ln -s /usr/lib64/libssl.so.3 /usr/lib64/libssl.so.1.1—— 这会骗过加载器,但函数接口不匹配,后续可能崩溃 - 正确做法:统一用同一套 OpenSSL 源码重新编译 Nginx,或者降级系统 OpenSSL(不推荐),或换用静态链接
- 验证方式:
objdump -T /usr/lib64/libssl.so.1.1 | grep OPENSSL_1_1_1,看有没有导出该符号
其他容易踩的坑
有些报错看着像库问题,其实是别的原因,排查时别被带偏。
-
cc: command not found或no acceptable C compiler found:缺 GCC 工具链,CentOS 装"Development Tools",Ubuntu 装build-essential -
Permission denied在进入 pcre/openssl 子目录时:子模块 configure 文件没执行权限,进对应目录执行chmod +x configure - 启用 XSLT 模块报
libxml2/libxslt libraries not found:额外装libxml2-devel和libxslt-devel(RHEL)或libxml2-dev和libxslt-dev(Debian) - configure 输出 summary 里某模块显示
disabled,但你明明想开:回头检查参数拼写,比如--with-http_ssl_module不是--enable-ssl











