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
即可。
这里需要注意文件之间的相对路径。