动态链接库问题_20170309
2017-03-09 本文已影响0人
SOUL_CY
动态链接库原理
- 用时查找
- 查找路径:
- 默认去/usr/lib /lib 下查找
- 可以设置自定义路径:
- export=LD_LIBRARY_PATH:yourpath
- path多于一个要用‘:’隔开
- 排在前面的path优先级高,在这里找到lib后不再往后找
动态库冲突场景
- 环境主要有以下几种:
- 开发环境
- 编译环境
- 测试发布环境
- 线上发布环境
- 对于动态库而言,由于是用时查找,所以程序在这几个环境的动态库不一定一致,这可能会出问题
- 例如,某服务在开发环境时编译依赖了libcrfpp,服务正常,但发布环境的libcrfpp与开发环境不一致,服务就会异常
问题如何发现
- 这种问题在编译阶段很难发现,因为动态库是用时加载
- 可以在项目首次部署在机器上时检查编好的lib包
- 命令:
- cd your lib package
- ls -lt | awk ‘{print $9}’| xargs ldd -r | grep 'undefine symbol'
- 如果没结果,恭喜你lib包在该环境没有依赖问题,否则,会看到有未定义的符号错误
- 根据该错误信息猜测是哪个lib库,找到合适的lib库替换。
更好的解决方法
- 最好能整理出项目依赖的关键基础库,打成包放在项目中管理
- 在项目启动时将该包路径export,这样就能避免动态库版本不一致问题