linux随记:实用,linux下qt依赖库的拷贝发布,不同linux版本兼容打包方法

linux下qt依赖库的拷贝发布
linux下发布软件时,常用的方法一般就是ldd后再拷贝,可是经常发布到别的电脑上还是各种报错,比如xcb什么的,其实lsof可以查看程序运行起来后比较完整的链接更新
下面以程序 untitled为例说明打包的一些过程
先把我们的程序跑起来

./untitled &

lsof查看qt库加载

linsz@ky:~/build-untitled-unknown-u8c03u8bd5$ lsof -c untitled | grep -i qt
untitled 2528 linsz  mem       REG                8,2    113952  274696 /usr/lib/x86_64-linux-gnu/libFcitxQt5DBusAddons.so.1.0
untitled 2528 linsz  mem       REG                8,2     81528  655559 /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so
untitled 2528 linsz  mem       REG                8,2   5784864  274782 /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.6.1
untitled 2528 linsz  mem       REG                8,2   5032440  274761 /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.6.1
untitled 2528 linsz  mem       REG                8,2   6824896  274856 /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5.6.1
untitled 2528 linsz  mem       REG                8,2    562872  274766 /usr/lib/x86_64-linux-gnu/libQt5DBus.so.5.6.1
untitled 2528 linsz  mem       REG                8,2   1055448  274864 /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5.6.1
untitled 2528 linsz  mem       REG                8,2     70256  655578 /usr/lib/x86_64-linux-gnu/qt5/plugins/xcbglintegrations/libqxcb-glx-integration.so
untitled 2528 linsz  mem       REG                8,2     10856  655566 /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqxcb.so

把这些库拷贝发布出去一般qt库就够了

#!/bin/bash

for var in `lsof -c untitled |grep -v plu|  grep -i qt | awk  '{print $9}'`
do
d=${var%so*} 
dd=`echo $d  | awk '{gsub(/^\s+|\s+$/, "");print}'`
cp -d  $dd*  ./
done
rm lib*.prl

另外别忘记还有qt的plugins也一起拷贝发布

cp -rf /usr/lib/x86_64-linux-gnu/qt5/plugins ./

其他so依赖也一起拷贝

#!/bin/sh

for var in `lsof -c unt |grep -v plu|grep .so  |  grep -v  Qt | awk  '{print $9}'`
do
d=${var%so*} 
dd=`echo $d  | awk '{gsub(/^\s+|\s+$/, "");print}'`
cp -d  $dd*  ./
done

则我们的启动脚本如下

#!/bin/bash

SHELLPATH=$(cd `dirname $0`; pwd)
cd $SHELLPATH
export LD_LIBRARY_PATH=$SHELLPATH:$LD_LIBRARY_PATH
export QT_PLUGIN_PATH=$SHELLPATH/plugins/ 
chmod a+x  $SHELLPATH/untitled 
$SHELLPATH/untitled 

一般到这程序就能发布运行了,但是不同的Linux ,gcc/g++版本 glibc等高低版本不兼容,还是会存在运行错误,即所谓的abi二进制接口不兼容,这时我们就要修改我们的编译参数了,指定我们的连接器为我们自己的

 -Wl,--dynamic-linker=./ld-linux-x86-64.so.2 

指定了相对路径,每次就必须在当前位置运行,运行脚本里别忘记了cd到当前路径下

cd $SHELLPATH

当然如果安装时能固定路径,编译路径就可以写固定了,如果发布的时rpm或者deb包,就可以按包最后安装的路径写死了。长征百万里,到此就可以顺利发布,一般就能给个版本运行,当然cpu架构,linux系统发行商还是要注意,如arm64 ,x86,ubuntu、red hat还有一堆的国产系统/cpu

麻烦的linux程序发布啊,头疼

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值