QT程序打包并部署在docker内

这篇具有很好参考价值的文章主要介绍了QT程序打包并部署在docker内。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

QT程序打包并部署在docker内

最进尝试写qt的界面程序,想将qt程序打出一个独立的包,并运行在docker内,网上的教程都存在部分问题(或者是不满足我的使用场景)

参考网址

  • 获取gl库的拷贝
  • 下载linuxdeployqt
  • 将qt程序打包成deb
  • 打包的几种指导方向

一. 安装 linuxdeployqt

1.1 下载 linuxdeployqt

在 linuxdeployqt 下载 , 下载的包是一个静态程序可以直接使用

1.2 安装 linuxdeployqt

即将下载的程序重命名,并放在合适的位置

mv linuxdeployqt-6-x86_64.AppImage linuxdeployqt
chmod 777 linuxdeployqt
mv linuxdeployqt /usr/local/bin

测试是否安装成功

linuxdeployqt --version

二. 使用 linuxdeployqt 找寻依赖库

运行打包指令(Test是我的qt程序,且是 release 版本的,假定我们的qt程序放在 ~/data/目录下,当前命令也在~/data/目录执行)

linuxdeployqt Test -appimage

此时的包都放在当前目录的 lib/ 目录下.

注意: 当前只是找寻了所需的Qt依赖,但是Qt环境需要的基础依赖库没有找齐,将其放在docker下仍然跑不起来

当报错 .desktop file is missing a Categories= key 时, 在当前目录下的 default.desktop 文件末尾添加

Categories=Application;

QT程序打包并部署在docker内,qt,docker,linux,qt,docker,linux

然后重新运行

linuxdeployqt Test -appimage

三. 补齐 libqxcb.so 依赖的库

也可以在docker内直接安装 libfontconfig1 libgl1 libxcb1 这三个库来补齐,就可以省略这一步骤了.

3.1 编写脚本 lib_qt_copy.sh

这个脚本的目的是为了找寻依赖的xcb库

#!/bin/bash
if [ $# != 1 ]
then
    echo "传参数顺序: ./脚本.sh  <要发布的可执行文件文件>"
    exit 0
fi

LibDir=$PWD/xcblib
mkdir $LibDir

Target=$1

lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))

for Variable in ${lib_array[@]}
do
    cp "$Variable" $LibDir
done

3.2 执行脚本

libqxcb.so 在 plugins/platforms/ 目录下

bash ./lib_qt_copy.sh plugins/platforms/libqxcb.so

那么 依赖的Qt库和Qt依赖的库分别放在 lib/ 和 xcblib/ 目录下,它们之间有些库是重复的,可以将它们合成一个目录.

四. 给予 docker 访问 gui 的权限.

在 /etc/profile 末尾添加

if [ "$DISPLAY" != "" ]
then
 xhost +
fi

然后在当前终端执行

source /etc/profile

此后所有的操作都需要在当前终端上执行,因为当前终端开启了x11权限.重启后就不会有这些顾虑了,因为已经应用到了全局.

4.1 进入docker终端

有两种方式,第一种就是编写 docker compose 的配置文件,第二种就是直接在 docker run 后面接参数.

两种方式使用一个就行

方式一. 使用 docker compose 进入终端

创建 docker-compose.yml 文件,并添加以下内容

注意: 我们添加了一个docker目录的映射,所以将前面打包的qt程序放在当前目录下的docker目录下,这样就不用后续拷贝到docker里面的.

version: '3.9'
name: code-develop
services:
  ubuntu:
    environment:
     - DISPLAY
    tty: true
    image: ubuntu:18.04
    profiles: ["ubuntu"]
    network_mode: host
    privileged: true
    volumes: 
     - /tmp/.X11-unix:/tmp/.X11-unix
     - ~/data:/data

如果没有 docker 镜像,记得先拉取 ubuntu:18.04 镜像

执行 docker 容器的生成

docker compose up ubuntu -d

进入 docker 容器

docker compose exec ubuntu bash
方式二. 使用 docker run 命令进入终端

执行命令

docker run -itd -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY -e GDK_SCALE -e GDK_DPI_SCALE  --name test-gui --privileged  -v ./data:/data --network host ubuntu:18.04 bash
docker exec -it test-gui bash

4.2 测试 gui 权限是否开放成功

在docker容器内运行下面指令,如果 apt 比较慢的话,可以自己手动更改镜像源(推荐华为镜像源和清华镜像源)

apt update
apt install xarclock
xarclock

如果 xarclock 运行起来的话,就说话gui权限已经开放,若报错 can't open display,则重启电脑,并重新进入docker ,看能否执行成功.

五. 运行 qt 程序

进入docker后,开始测试我们的Qt程序能否执行.

设置依赖库的环境变量和Qt调试环境变量

cd /data/
# 这一步是为了报错的时候,可以看到报错的地方
export QT_DEBUG_PLUGINS=1
# 这一步是给出依赖的库路径,请根据实际情况调整
export LD_LIBRARY_PATH=./lib/:./xcblib
./Test

如果中间报错缺少库,设置 QT_DEBUG_PLUGINS 为 1 后可以看到缺少库的名称,可以在主机中找到对应的库并拷贝到 docker 中.
也可以通过 apt-file search libxx.so 来查找属于哪个包,然后安装对应的包.



要写的东西比较多,所以有些混乱,有不同见解的地方可以沟通,我也会持续更新和改善这篇文章.文章来源地址https://www.toymoban.com/news/detail-619961.html

到了这里,关于QT程序打包并部署在docker内的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux 打包Qt程序到无Qt环境Linux系统下运行,问题记录

    Linux 环境下Qt开发的摄像头程序用到了opencv的库,需要跟Qt环境一起打包。 1.打包所有关联库用的是脚本程序。 2.新建空文件夹放入编译好的release qt程序,比如摄像头程序 camera,新建打包脚本copylib.sh放在文件夹下。   3.终端执行 ./copylib.sh camera 会打包 camera程序所需的关联库。

    2024年02月16日
    浏览(44)
  • Qt Linux 环境中应用程序打包

    系统环境:Ubuntu20.04LTS 开发环境:Qt5.14.1 在进入程序部署打包之前,阅读官方的部署文档Deploy,通常情况下,我们在开发的时候,Qt Creator 的左下角构建模式为Debug,便于我们调试编写程序。Qt的三个构建模式Debug、Profile、Release的区别是: debug可以调试程序,而release不可以。在

    2024年02月01日
    浏览(43)
  • Linux 下使用 linuxdeployqt 打包QT程序

    当别人需要使用我们的 Qt 程序时,我们可以用打包工具将程序打包发给他,这样就不用发送整个 Qt 工程。由于 Qt 跨平台的特性,可以用不同的工具打包它。本篇文章是在 Linux 下使用 linuxdeployqt 将 Qt 程序打包成 .AppImage 应用程序。 环境介绍: Ubuntu 16.04 QT 5.12.12 linuxdeployqt(

    2024年02月03日
    浏览(45)
  • Linux下打包发布QT程序,并运行在其他没有安装QT环境的linux系统上

    一、Linux下打包发布步骤如下 编译应用程序环境:ubuntu18.04版本 开发环境:Qt5.14.2 编译环境:gcc_64 要移植的电脑:ubuntu18.04版本,没有开发环境 第一步:打包依赖库 1、创建一个打包目录,把生成的可执行文件拷贝放在创建的打包目录下,这里我是创建了一个打包目录名称为

    2024年02月12日
    浏览(40)
  • 实测好用的Linux下打包发布Qt程序的方法(使用linuxdeployqt)

    自己试过能够打包好Qt程序,然后发给别人也能正常使用。 需要在github上下载编译好的 linuxdeployqt-x86_64.AppImage 应用程序文件。 下载后将其改名为linuxdeployqt(方便使用),在终端对其chmod +x 加权限,然后复制到 /usr/local/bin/中(终端能识别该路径下的执行文件) 终端输入 lin

    2024年02月13日
    浏览(40)
  • linux平台下qt程序的编译以及使用linuxdeployqt打包可执行程序和在高版本22.04ubuntu下使用linuxdeployqt打包文件的问题

    写于2023.10.20 最近遇到了一个问题,需要把在windows下面写好的qt程序打包成linux可以运行的文件进行发布,而且最终目标和windows一样,要在一个近乎于纯净环境的机器上进行运行,故而有了这个博客,记录了我们小组攻克的一系列问题 由于是已经攻克过后才有的这一篇博客,

    2024年02月04日
    浏览(47)
  • Qt程序打包成一个单独exe的方法 Qt程序打包成一个单独exe的方法

    目录 Qt程序打包成一个单独exe的方法 程序发布 程序打包 问题 Qt程序发布及打包,同时修改可执行文件的图标。本教程使用Qt自带的  windeployqt  工具外加 Enigma Virtual Box 打包工具。首先需要知道的是,Qt程序发布需要的程序是用  Release  方式编译的。下面看一下具体的操作。

    2024年02月11日
    浏览(45)
  • <QT开发> QT开发工具-之-QT应用程序打包

    <QT开发> QT开发工具-之-QT应用程序打包 笔者为什么会写这篇文章呢?这是因为,笔者使用windows QT开发了一个测试工具。目的是通过TCP/IP测试其它应用程序。首先这个QT程序是笔者自己开发的,所以笔者的电脑当然是可以运行这个QT程序的,但是想要这个QT程序在其它同事的

    2024年02月12日
    浏览(152)
  • Qt的程序打包

    设置应用程序的图标,在Qt的pro中加入 RC_ICONS = 图标名.ico,到网上找个在线转换ico的工具即可, 1.qt的编译模式切换到release版本  2.编译运行后找到自己放代码的位置,release版本的  3.新建一个空文件夹,把exe程序单独拷出来放到空文件夹中 4. 打开Qt的命令行窗口,windeployq

    2024年02月07日
    浏览(52)
  • Qt程序打包exe

    步骤一:Release编译 步骤二:将步骤一生成的Release文件夹中的exe文件单独拷贝到另一个文件夹,如 D:Program FilesUI 步骤三:打开命令行工具 步骤四:在命令行中首先将路径定位到步骤二中存放exe文件的文件夹: cd D:Program FilesUI ,然后使用 windeployqt 工具命令: D:Qt25.14.1m

    2024年02月13日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包