ubuntu中C++工程打包所有依赖的so文件

1. 方法介绍

工程中已经通过CMakeLists.txt编译好了可执行文件并且能够顺利运行,build下内容如图
在这里插入图片描述
其中demo是编译好的可执行文件,我们要查看它依赖的库的so文件,在该路径下运行命令为:ldd ./demo
在这里插入图片描述
终端上输出的信息,就是demo可执行文件所有依赖的so文件。我们只需要将 “=>” 后面路径下的so文件拷贝出来;某些库没有"=>"这本很少,一般不用拷贝,如果打包好运行报这些库缺失的话,再拷贝。

2. 具体实现

当依赖库变得很多的时候,就需要编写代码自动完成上述功能。

  • 这里用python实现命令终端打印信息的捕获、解析,以及文件的拷贝。copy_lib.py

    
    import shutil
    import os
    
    outpath = "../export_lib"
    os.makedirs(outpath) if not os.path.exists(outpath) else None
    
    commod = "ldd ./demo"
    out_string = os.popen(commod)  # 捕获终端的打印信息
    data = out_string.readlines()
    data = [[data_.split()[0], data_.split()[2]] for data_ in data if len(data_.split())==4 ] # 解析命令,保留需要拷贝的库的信息
    print(data)
    
    for data_ in data:
     shutil.copy(data_[1], os.path.join(outpath, data_[0]))  # 拷贝
    
  • copy_lib.py放到与可执行文件demo同路径下,然后打开终端运行 python copy_lib.py,然后就会在上一级文件夹下生成 【export_lib】,里面存放着工程所需的依赖文件。

  • 我们需要的文件就是【build下的可执行文件demo】+【export_lib下的所以依赖库】。

    • 最简单的是,将 build 下除demo 的文件全部删除,将 export_lib 下所有依赖库 拷贝到 build 路径下,也就是将依赖库和可执行文件放置同一路径下,然后打包放置其他电脑上,成功运行demo。
    • 如果工程比较复杂,并不想将可执行文件和依赖库放置同一文件,就可以创建个 run.sh ,里面临时性将 export_lib 添加到环境变量:
      export LD_LIBRARY_PATH= ../export_lib/
      ./demo
      
      然后运行 sh ./run.sh 即可。
      这里需要注意文件之间的相对路径。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值