有时为了打包自己的编译好的程序,如ffmpeg到其它机子上运行,需要打包
参考博主文章ubuntu linux 环境下的QT程序打包_王者之路001的博客-CSDN博客后做了些修改,完成以下的打包脚本 pkg.sh:
- #!/bin/sh
-
- src="ffmpeg" #发布的程序名称,想要打包的可执行文件
- des="./out1" #程序打包路径,这是最终生成打包文件路径,不要先mkdir $des
-
- if [ -d $des ]; then
- echo "$des is exists"
- echo "exit"
- exit 1
- fi
- mkdir $des
- lstdep=$(ldd $src| awk '{if (match($3,"/")){ printf("%s "),$3 } }')
- cp $lstdep $des
- cp $src $des
-
- echo "如果执行目标机子的glibc(libc.so.0、libm.so.0、libpthread.so.0)库小于编译机子"
- echo "需要处理, Y to patchelf"
- read ch
- if [ $ch = "Y" ]; then
- echo "start patchelf them..."
- cd $des
- mv libc.so.6 libc_1.so.6
- mv libm.so.6 libm_1.so.6
- mv libpthread.so.0 libpthread_1.so.0
- patchelf --remove-needed libc.so.6 $src
- patchelf --add-needed libc_1.so.6 $src
- patchelf --remove-needed libm.so.6 $src
- patchelf --add-needed libm_1.so.6 $src
- patchelf --remove-needed libpthread.so.0 $src
- patchelf --add-needed libpthread_1.so.0 $src
- cp /lib64/ld-linux-x86-64.so.2 .
- patchelf --set-interpreter ld-linux-x86-64.so.2 --set-rpath ./ $src
- cd -
- echo "end patchelf"
- fi
-
- exit 0
-
执行 bash pkg.sh
测试:
cd $des
export LD_LIBRARY_PATH=`pwd`
执行程序,如:./ffmpeg
ldd ffmpeg
OK
在此感谢王者之路001!