|
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
|
|