动态链接库问题_20170309

动态链接库原理

  1. 用时查找
  2. 查找路径:
  • 默认去/usr/lib /lib 下查找
  • 可以设置自定义路径:
  • export=LD_LIBRARY_PATH:yourpath
  • path多于一个要用‘:’隔开
  • 排在前面的path优先级高,在这里找到lib后不再往后找

动态库冲突场景

  1. 环境主要有以下几种:
  • 开发环境
  • 编译环境
  • 测试发布环境
  • 线上发布环境
  1. 对于动态库而言,由于是用时查找,所以程序在这几个环境的动态库不一定一致,这可能会出问题
  2. 例如,某服务在开发环境时编译依赖了libcrfpp,服务正常,但发布环境的libcrfpp与开发环境不一致,服务就会异常

问题如何发现

  1. 这种问题在编译阶段很难发现,因为动态库是用时加载
  2. 可以在项目首次部署在机器上时检查编好的lib包
  3. 命令:
  • cd your lib package
  • ls -lt | awk ‘{print $9}’| xargs ldd -r | grep 'undefine symbol'
  1. 如果没结果,恭喜你lib包在该环境没有依赖问题,否则,会看到有未定义的符号错误
  2. 根据该错误信息猜测是哪个lib库,找到合适的lib库替换。

更好的解决方法

  1. 最好能整理出项目依赖的关键基础库,打成包放在项目中管理
  2. 在项目启动时将该包路径export,这样就能避免动态库版本不一致问题
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容