• 【Qt高阶】Linux安装了多个版本的Qt 部署Qt程序,出包【2023.10.17】


    在这里插入图片描述

    简介

      linux系统下可执行程序运行时会加载一些动态库so,有一些是Qt的库,Qt的库会加载其他更基础的库。最后出包的时候需要把依赖的包整理到一个文件夹,来制作安装包。近期遇到已经将依赖的so文件拷贝至程序目录下,但还是调系统路径下的动态库的问题。对问题排查过程中的技术手段进行整理备忘。

    排查用到的命令工具

    (1)ldd 命令

    对一个Qt 窗口程序testDependSo进行ldd查看依赖的库,发现会依赖到系统路径/lib/usr/lib/,也会依赖到Qt安装路径下的库 /home/myb/Qt5.6.3/5.6.3/gcc_64/lib/0x00007f52b9427000 这个十六进制数字是 ldd 输出中各动态库的加载的基地址。

    myb@myb-kylinV10:~/build-testDependSo-Desktop_Qt_5_6_3_GCC_64bit-Debug$ ldd testDependSo 
    	linux-vdso.so.1 =>  (0x00007fff635d8000)
    	libQt5Widgets.so.5 => /home/myb/Qt5.6.3/5.6.3/gcc_64/lib/libQt5Widgets.so.5 (0x00007f857069b000)
    	libQt5Core.so.5 => /home/myb/Qt5.6.3/5.6.3/gcc_64/lib/libQt5Core.so.5 (0x00007f856ff81000)
    	libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f856fbff000)
    	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f856f9e9000)
    	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f856f61f000)
    	libQt5Gui.so.5 => /home/myb/Qt5.6.3/5.6.3/gcc_64/lib/libQt5Gui.so.5 (0x00007f856ee2a000)
    	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f856ec0d000)
    	libgobject-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 (0x00007f856e9ba000)
    	libgthread-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0 (0x00007f856e7b8000)
    	librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f856e5b0000)
    	libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f856e29f000)
    	libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f856e08d000)
    	libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f856dd53000)
    	libGL.so.1 => /usr/lib/x86_64-linux-gnu/libGL.so.1 (0x00007f856dadf000)
    	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f856d7d6000)
    	libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f856d5bc000)
    	libicui18n.so.56 => /home/myb/Qt5.6.3/5.6.3/gcc_64/lib/libicui18n.so.56 (0x00007f856d122000)
    	libicuuc.so.56 => /home/myb/Qt5.6.3/5.6.3/gcc_64/lib/libicuuc.so.56 (0x00007f856cd6a000)
    	libicudata.so.56 => /home/myb/Qt5.6.3/5.6.3/gcc_64/lib/libicudata.so.56 (0x00007f856b387000)
    	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f856b183000)
    	/lib64/ld-linux-x86-64.so.2 (0x00007f8570f15000)
    	libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007f856af7b000)
    	libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f856ad0b000)
    	libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f856aae9000)
    	libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f856a8c0000)
    	libxcb-dri3.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-dri3.so.0 (0x00007f856a6bd000)
    	libxcb-present.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-present.so.0 (0x00007f856a4ba000)
    	libxcb-sync.so.1 => /usr/lib/x86_64-linux-gnu/libxcb-sync.so.1 (0x00007f856a2b3000)
    	libxshmfence.so.1 => /usr/lib/x86_64-linux-gnu/libxshmfence.so.1 (0x00007f856a0b1000)
    	libglapi.so.0 => /usr/lib/x86_64-linux-gnu/libglapi.so.0 (0x00007f8569e80000)
    	libXdamage.so.1 => /usr/lib/x86_64-linux-gnu/libXdamage.so.1 (0x00007f8569c7d000)
    	libXfixes.so.3 => /usr/lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007f8569a77000)
    	libX11-xcb.so.1 => /usr/lib/x86_64-linux-gnu/libX11-xcb.so.1 (0x00007f8569875000)
    	libxcb-glx.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-glx.so.0 (0x00007f856965c000)
    	libxcb-dri2.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-dri2.so.0 (0x00007f8569457000)
    	libXxf86vm.so.1 => /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1 (0x00007f8569251000)
    	libdrm.so.2 => /usr/lib/x86_64-linux-gnu/libdrm.so.2 (0x00007f8569040000)
    	libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f8568e3c000)
    	libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f8568c36000)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    (2)chrpath -c application,这个命令是查看程序的RPATHRPATH就是指定程序运行时从哪个路径加载依赖的动态库。如下代表程序依赖的库是在Qt的安装目录。

    myb@myb-kylinV10:~/build-testDependSo-Desktop_Qt_5_6_3_GCC_64bit-Debug$ chrpath -c testDependSo 
    testDependSo: RPATH converted to RUNPATH
    testDependSo: RUNPATH=/home/myb/Qt5.6.3/5.6.3/gcc_64/lib
    
    
    • 1
    • 2
    • 3
    • 4

    (3) chrpath(change run path),改变运行库的查找位置。下面的命令将运行库的查找位置改为可执行程序目录下的lib目录。

    myb@myb-kylinV10:~/build-testDependSo-Desktop_Qt_5_6_3_GCC_64bit-Debug$ chrpath -r $ORIGIN/lib
    
    • 1

    linuxdeployqt 工具(个性化修改针对安装多个版本的QT版本)

    (1)找到自己的qmake程序的安装路径,将路径写到linuxdeployqt目录下的qmakePath.txt文件中。

    (2)执行命令:

    ./linuxdeployqt MyApp -appimage
    
    • 1

    KylinV10 X86版本的工具已上传至资源

  • 相关阅读:
    怎么实现在微信公众号预约挂号功能呢
    区块链备案
    学透这份 300 页的 2022 最新 java 面试题及答案,让你成功定位阿里 P8
    冰冰学习笔记:快速排序
    JAVA:实现将位置 i 处的字符与位置 j 处的字符交换的函数算法(附完整源码)
    Python150题day19
    RabbitMQ工作模式——PubSub生产者及消费者
    数智随行 | 财务数字化转型的抓手:业务能力标准化
    docker openjdk:8-jdk-alpine 修改时区、添加字体
    使用 Wireshark 抓包工具快速分析 IoT 物联网终端设备的网络通信行为
  • 原文地址:https://blog.csdn.net/qq_25231249/article/details/133886192