有时为了打包自己的编译好的程序,如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!