Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1031|回复: 0
打印 上一主题 下一主题

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

[复制链接]

1265

主题

2054

帖子

7899

积分

认证用户组

Rank: 5Rank: 5

积分
7899
跳转到指定楼层
楼主
发表于 2023-10-23 14:04:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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 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

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 -v  Qt | 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=$SHELLPATHLD_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

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-11-1 09:29 , Processed in 0.059273 second(s), 20 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表