如何让libpng16.so.16调用本地目录libz.so.1(ZLIB_1.2.9版本问题)
问题结论
该问题和Anaconda的动态库路径设置直接相关。Linux动态链接器默认优先搜索/lib64、/usr/lib64这类系统级库路径,如果Anaconda的库目录没有被放到搜索优先级的最高位,就会出现Anaconda自带的高版本依赖库(此处为libpng16.so.16)错误加载系统低版本同名共享库(此处为系统路径下低版本libz.so.1)的问题,触发版本不匹配报错。
修复方案(按推荐优先级排序)
- 方案1:激活对应Anaconda环境后启动服务(无副作用,优先推荐)
正常通过conda activate <你的Django运行环境名>激活虚拟环境后,再执行Django启动命令,Anaconda会自动将当前环境的lib目录注入动态库搜索路径最前端,强制优先加载Anaconda自带的符合版本要求的libz.so.1,不会出现跨路径加载系统库的问题。
如果是用supervisor、systemd托管Django服务,需要在启动脚本中提前加载Anaconda环境激活逻辑,参考命令片段:# 替换为自身环境对应的实际路径 source /home/ec2-user/anaconda3/etc/profile.d/conda.sh conda activate <你的Django运行环境名> cd <你的Django项目根目录> # 替换为实际的服务启动命令,比如gunicorn、uwsgi等 gunicorn <你的项目名>.wsgi:application - 方案2:临时指定动态库搜索路径(适合临时调试场景)
启动Django前,手动将Anaconda的lib目录放到LD_LIBRARY_PATH变量的最前端,临时调整当前会话的动态库搜索优先级:
注意:该配置仅对当前终端会话生效,关闭终端后自动失效,不建议将该配置写入全局系统配置文件,避免引发其他系统程序的库版本冲突。export LD_LIBRARY_PATH=/home/ec2-user/anaconda3/lib:$LD_LIBRARY_PATH python manage.py runserver - 方案3:校验Anaconda内libz软链接有效性(兜底检查)
执行命令检查Anaconda库目录下的libz软链接是否正常:
正常输出需包含ls -l /home/ec2-user/anaconda3/lib/libz.so*libz.so.1 -> libz.so.1.2.11的指向关系,如果软链接损坏,执行以下命令重建即可:cd /home/ec2-user/anaconda3/lib ln -sf libz.so.1.2.11 libz.so.1
修复效果验证
配置完成后,在启动Django的同一会话内执行以下命令,检查libpng16实际加载的libz路径:
ldd /home/ec2-user/anaconda3/lib/libpng16.so.16 | grep libz
如果输出中libz.so.1的指向路径为/home/ec2-user/anaconda3/lib/libz.so.1,说明配置生效,此时启动Django不会再触发ZLIB版本缺失的报错。
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

