最近一个项目需要用libtorch部署深度学习的pytorch模型,开发环境做完了项目,想要把可执行文件和依赖库打包的时候遇到问题了,把ldd找到的所有.so文件和可执行文件打包转移到别的服务器后还是运行不了,提示还是缺少某个.so文件。
后来,以为是显卡驱动版本太低,把显卡驱动也更新到430了,还是不行。
之后在开发环境上使用pmap查看程序运行时装载的动态库,把这些库和之前的打包在一起了(shell脚本是个好东西),然后还是提示缺少.so,不过已经和原来缺少的不同了,说明还是有用的。
最后,实在没什么办法了,只能缺失了补什么了。从开发环境找到部署环境缺少的.so文件,把它和之前的打包在一起,结果刚复制完了一个就可以跑了,我还是很幸运的。。。
所以总结下,ldd找到的依赖库不一定是可执行文件的所有依赖库,只能说是直接依赖,还可能会有间接依赖的库,例如
可执行文件a依赖b.so,b.so依赖c.so,那么ldd a只会显示b.so,貌似是因为2.22版本以后的ld链接器默认不会递归查找依赖项了。
解决方法:查找可执行文件的所有依赖,首先ldd找到一部分,不行就让它在运行时用pmap再找到一部分,还不行就跟着提示缺啥补啥0.0