Qter 发表于 2023-10-23 14:04:50

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

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

./untitled &
1
lsof查看qt库加载

linsz@ky:~/build-untitled-unknown-u8c03u8bd5$ lsof -c untitled | grep -i qt
untitled 2528 linszmem       REG                8,2    113952274696 /usr/lib/x86_64-linux-gnu/libFcitxQt5DBusAddons.so.1.0
untitled 2528 linszmem       REG                8,2   81528655559 /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so
untitled 2528 linszmem       REG                8,2   5784864274782 /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.6.1
untitled 2528 linszmem       REG                8,2   5032440274761 /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.6.1
untitled 2528 linszmem       REG                8,2   6824896274856 /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5.6.1
untitled 2528 linszmem       REG                8,2    562872274766 /usr/lib/x86_64-linux-gnu/libQt5DBus.so.5.6.1
untitled 2528 linszmem       REG                8,2   1055448274864 /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5.6.1
untitled 2528 linszmem       REG                8,2   70256655578 /usr/lib/x86_64-linux-gnu/qt5/plugins/xcbglintegrations/libqxcb-glx-integration.so
untitled 2528 linszmem       REG                8,2   10856655566 /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqxcb.so

1
2
3
4
5
6
7
8
9
10
11
把这些库拷贝发布出去一般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
1
2
3
4
5
6
7
8
9
另外别忘记还有qt的plugins也一起拷贝发布

cp -rf /usr/lib/x86_64-linux-gnu/qt5/plugins ./
1
其他so依赖也一起拷贝

#!/bin/sh

for var in `lsof -c unt |grep -v plu|grep .so|grep -vQt | awk'{print $9}'`
do
d=${var%so*} 
dd=`echo $d| awk '{gsub(/^\s+|\s+$/, "");print}'`
cp -d$dd*./
done
1
2
3
4
5
6
7
8
则我们的启动脚本如下

#!/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

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

-Wl,--dynamic-linker=./ld-linux-x86-64.so.2
1
指定了相对路径,每次就必须在当前位置运行,运行脚本里别忘记了cd到当前路径下

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

麻烦的linux程序发布啊,头疼
————————————————
版权声明:本文为CSDN博主「但行技术」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43333380/article/details/109323391

页: [1]
查看完整版本: linux随记:实用,linux下qt依赖库的拷贝发布,不同linux版本兼容打包方法