百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程文章 > 正文

如何打包一个QT程序(Windows和linux)

qiyuwang 2024-11-02 14:27 13 浏览 0 评论

如何打包一个QT程序

Windows系统下

通过windeployqt工具

1.以release模式运行程序

2.将release文件夹中的可执行文件复制到一个路径下,推荐桌面

3.在桌面新建一个文件夹,并将刚刚的可执行文件放进去

4.运行windeployqt.exe程序

5.进入到刚刚新建的文件夹路径中

6.执行命令windeployqt test.exe,其中test为可执行文件的文件名

7.等待执行完毕后,可以发现文件夹中多了运行程序所需要的dll

8.该文件夹打包,可以在其他电脑下运行

Linux系统下

通过linuxdeployqt工具

1.以release模式运行

同Windows一样以release模式运行QT程序,以生成可执行文件,即可以直接双击打开的文件,也可以通过右键属性来查看

shared library文件

executable文件

注意图标也是不一样的,如果是executable文件,则不需要下面一步的操作

2.针对release模式下编译出的文件是shared library文件,进行如下操作

在.pro文件中添加如下代码

TEMPLATE = app #这生成一个exe
QMAKE_LFLAGS += -no-pies

添加好后记得执行qmake

3.新建一个文件夹,并将生成的可执行文件复制进去

这里文件夹的名字可以与可执行文件名字相同,方便辨认,我这里不做演示。

4.安装linuxdeployqt

针对Qt,linuxdeployqt这个工具可以帮助我们快速打包Qt项目。在windows下对应的软件叫windowsdeployqt。

linuxdeployqt的github网址:

https://github.com/probonopd/linuxdeployqt/releases

github上提供了两种安装linuxdeployqt的方法,分别是直接下载编译好的安装包安装,或者从源代码安装。两种方式都不难。 但是由于linuxdeployqt还没有发布Ubuntu18.04相应的版本,因此,Ubuntu18.04的用户最好是编译源代码安装,不然在用linuxdeployqt打包Qt项目的时候会报类似于操作系统版本过高的错误。

4.1下载linuxdeployqt可执行程序,上图第一项

  • 建议下载后修改文件名,将文件名修改为 linuxdeployqt。
  • 修改linuxdeployqt的权限,可以使用以下命令:
sudo chmod a+x linuxdeployqt
  • 然后可以考虑将该文件拷贝到目录 /usr/local/bin/ 下,方便之后直接使用命令 linuxdeployqt。拷贝命令如下:
sudo cp linuxdeployqt /usr/local/bin/

4.2编译源代码安装linuxdeployqt

针对操作系统是Ubuntu18.04及以上,目前需要通过源代码编译安装linuxdeployqt,否则执行linuxdeployqt会出现一些报错信息:如主机系统过高等。

  • 编译源代码安装的参考网址:参考网址

https://github.com/probonopd/linuxdeployqt/blob/master/BUILDING.md

  • 我们默认已经安装好了g++、git等工具,如果没有的话得先安装。
  • 还需要安装 patchelf 工具。

示例命令如下:

sudo apt-get -y install git g++ libgl1-mesa-dev
git clone https://github.com/probonopd/linuxdeployqt.git
sudo apt install patchelf

依次执行上面命令,即可

  • 进入linuxdeployqt文件夹,命令如下:
cd linuxdeployqt
  • 修改 tools/linuxdeployqt/main.cpp 源代码,注释掉源码中版本判断的语句,可以通过指令 gedit tools/linuxdeployqt/main.cpp 来修改源码:
gedit tools/linuxdeployqt/main.cpp

需要注释的代码如下:

// openSUSE Leap 15.0 uses glibc 2.26 and is used on OBS
        /*if (strverscmp (glcv, "2.27") >= 0) {
            qInfo() << "ERROR: The host system is too new.";
            qInfo() << "Please run on a system with a glibc version no newer than what comes with the oldest";
            qInfo() << "currently still-supported mainstream distribution (xenial), which is glibc 2.23.";
            qInfo() << "This is so that the resulting bundle will work on most still-supported Linux distributions.";
            qInfo() << "For more information, please see";
            qInfo() << "https://github.com/probonopd/linuxdeployqt/issues/340";
            return 1;
        }*/
  • 当前目录中有一个 CMAKELIST 文件,执行cmake命令:
cmake CMakeLists.txt
  • 执行make命令编译源代码:
make
  • 编译完成后,在目录 tools/linuxdeployqt/linuxdeployqt 下会生成一个可执行文件 linuxdeployqt,修改其权限:
cd ./tools/linuxdeployqt
sudo chmod a+x linuxdeployqt
  • 为了方便之后使用,可以将该可执行文件复制到 /usr/local/bin 目录下:
sudo cp linuxdeployqt /usr/local/bin/
  • linuxdeployqt命令可能要用到选项 -appImage(实际上我就用到了),因此需要安装一下 appimagetool,下载和安装命令如下:
sudo wget -c "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage" -O /usr/local/bin/appimagetool
sudo chmod a+x /usr/local/bin/appimagetool

5.添加环境变量

这时候如果执行qmake -v命令操作的话,说明没有找到路径,需要添加环境变量。

终端输入gedit ~/.bashrc命令,修改 .bashrc 文件,在文件末尾追加以下内容,其中/opt/Qt5.9.9/5.9.9是我的Qt安装路径,大家要用自己的路径代替:

#add QT ENV
export PATH=/opt/Qt5.9.9/5.9.9/gcc_64/bin:$PATH
export LD_LIBRARY_PATH=/opt/Qt5.9.9/5.9.9/gcc_64/lib:$LD_LIBRARY_PATH
export QT_PLUGIN_PATH=/opt/Qt5.9.9/5.9.9/gcc_64/plugins:$QT_PLUGIN_PATH
export QML2_IMPORT_PATH=/opt/Qt5.9.9/5.9.9/gcc_64/qml:$QML2_IMPORT_PATH

经测试只添加第一行命令也是可以的

双引号可以加也可以不加

最后要source一下使 ~/.bashrc 这个shell文件立即生效,而不必注销并重新登录。

$ source ~/.bashrc

然后执行qmake -v

6.使用方法

  • 命令

linuxdeployqt ~/path/to/project/application -appimage

示例:进入到之前用于存放可执行文件的新建文件夹中

cd /home/li/Desktop.qttest
linuxdeployqt untitled -appimage

其中untitled为可执行文件,执行完就可以自动打包程序了。

AppRun相当于一个快捷方式。

在执行这条命令时可能会报如下错误:

Categories entry not found in desktop file
.desktop file is missing a Categories= key
12

说的是在.desktop文件中少了一个属性Categories,所以我们需要在desktop文件中手动加入一行:

Categories=Application;

7.在ubuntu 中添加qt 应用程序图标

修改qt 目录下的desktop 文件。可以按照ubuntu 官方提示修改。 ubuntu desktop文件使用

https://help.ubuntu.com/community/UnityLaunchersAndDesktopFiles

#-- 全局安装(所有用户可用),将xxx.desktop 复制到/usr/share/applications  
#-- 当前用户可用, 将xxx.desktop 复制到 ~/.local/share/applications 目录即可
#--appName.desktop
[Desktop Entry]
Version=1.0 #app的版本
Name=myQtApp #app的名字
Comment= this app use for xxx #说明信息 
Exec=/path/to/your/QtApp/myQtApp #app的执行路径,绝对路径
Icon=/path/to/your/app_icon/myQtApp.png #icon 路径,绝对路径
Terminal=false #是否在终端启动,效果自己试一下就知道了
Type=Application
Categories=Utility;Application;

脚本

1.新建文件

在新建的文件夹中新建两个文件

  • pack.sh
  • untitled.sh 该文件的文件名必须与可执行文件的文件名一样

2.添加脚本

  • 向pack.sh文件里添加以下内容:
#!/bin/sh  
exe="untitled" #你需要发布的程序名称
des="/home/li/Desktop/qttest2" #创建文件夹的位置
deplist=$(ldd $exe | awk  '{if (match($3,"/")){ printf("%s "),$3 } }')  
cp $deplist $des
  • 然后向untitled.sh文件里添加以下内容(内容不需要更改):
#!/bin/sh  
appname=`basename $0 | sed s,\.sh$,,`  
dirname=`dirname $0`  
tmp="${dirname#?}"  
if [ "${dirname%$tmp}" != "/" ]; then  
dirname=$PWD/$dirname  
fi  
LD_LIBRARY_PATH=$dirname  
export LD_LIBRARY_PATH  
$dirname/$appname "$@"

3.执行脚本

通过终端进入文件夹目录,运行:

sudo ./pack.sh

会出现命令未找到的错误信息,可执行以下命令,使用文件为可执行文件

chmod a+x pack.sh

然后重新执行sudo ./pack.sh命令即可。

接着可执行文件的依赖的链接库都会拷贝到所在的目录。

最后

但是要注意的一点,最好使用非 Linux FHS (文件系统层次结构标准)

就是创建文件夹的时候,结构如下

.
├── build
├── CI
│   ├── build.sh
│   ├── exe
├── include
│   ├── bchartdir.h
├── lib
│   ├── libchartdir.so
│   ├── libchartdir.so.6.0
│   └── libchartdir.so.6.0.0
├── src
│   ├── ubuntuapp.pro
│   ├── main.cpp
│   ├── mainwindow.cpp
│   ├── mainwindow.h
└── tool
    └── deployqt

build.sh里的内容如下

# /bin/bash
cd /home/wu/workspace/ubuntuapp/CI/exe
cp /home/wu/workspace/ubuntuapp/tool/deployqt ./
cd /home/wu/workspace/ubuntuapp/src
/home/wu/Qt5.10.1/5.10.1/gcc_64/bin/qmake /home/wu/workspace/ubuntuapp/src/ubuntuapp.pro -o /home/wu/workspace/ubuntuapp/build -spec linux-g++ CONFIG+=debug
make clean -C /home/wu/workspace/ubuntuapp/build
make -C /home/wu/workspace/ubuntuapp/build
cd /home/wu/workspace/ubuntuapp/CI/exe
cp /home/wu/workspace/ubuntuapp/build/UbuntuApp ./
./deployqt UbuntuApp -qmake="/home/wu/Qt5.10.1/5.10.1/gcc_64/bin/qmake"
rm deployqt

写完后,添加权限

sudo chmod 777 build.sh

ubuntuapp.pro里的内容如下

QT += core gui
TARGET = UbuntuApp
TEMPLATE = app
CONFIG += C++11
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += main.cpp \
    mainwindow.cpp
HEADERS += mainwindow.h
INCLUDEPATH += ../include
LIBS += -L../lib -lchartdir
unix:MOC_DIR = ../build/moc
unix:OBJECTS_DIR = ../build/obj

这样,执行完 build.sh 后,就能在 exe 文件夹里得到 一些文件和文件夹

里面的 AppRun 的超链接可以双击后 打开 UbuntuApp 程序

然后,把 exe 文件夹改个名字,压缩成 zip 格式,就可以拷贝到其他机器上用了

1.关于qt.conf

这个文件指定了qt 程序的运行环境,即我们可以使用qt.conf 指定qt程序的运行路径和库路径。内容如下所示:

# Generated by linuxdeployqt
# https://github.com/probonopd/linuxdeployqt/
[Paths]
Prefix = ./     #程序的运行路径
Libraries =  ./lib  #程序的库路径
Plugins = plugins   #插件路径
Imports = qml
Qml2Imports = qml

相关推荐

在Word中分栏设置页码一页两个页码的技巧!

施老师:在正常情况下,Word文档中一页只会出现一个页码。但在某种情况下,比如说:用了分栏后,我们希望一页中出现两个页码,那应该如何实现呢?今天,就由宁双学好网施老师来为大家讲一下,利用域来实现一页两...

如何在关键时刻向上自荐(如何在关键时刻做出正确选择)

抓住机会,挺身而出有种时刻叫“关键时刻”,关键时刻,作为一个认为自己有能力的、训练有素的人,应该考虑挺身而出,甚至应该不考虑就挺身而出。...

WPS Word:跨页的文档表格,快速调整为一页。#Excel

如何快速将跨页的文档表格调整为一页?需要根据两种情况分别处理。如果表格所有行的行高相同,调整为一页的方法有两种。第一种方法是将光标移动到表格内,然后将鼠标移动到表格右下角的方框处,按住鼠标左键向上拖动...

word文档插入下一页分节符(word下一页分页符)

在word文档中,对文档页面进行分页是特别常见的操作,其中的下一页分节符也是用得比较多的,但是一些人不太清楚在哪里设置,也不知道它具体能实现的功能是什么。接下来看看如何在word文档中插入下一页分节符...

word文档如何设置某一页纸张的方向

word文档页面方向有横向和纵向,纵向是默认的纸张方向,有时我们需要将页面设置为横向,或只设置其中某一页方向,应该怎么操作呢?一起来看看下面的详细介绍第一步:...

word怎么单独设置一页为横向(word2019怎样设置单独一页为横向)

word里面其中一页可以改为横向的吗?经过实际操作发现是完全可以的。...

Word如何设置分栏,如何一页内容同时显示一栏和两栏

我们使用Word文档,有时需要用到两栏的排版,甚至一页内容同时包含一栏和两栏的排版,这种格式怎么设置呢?具体步骤如下:首先是两栏排版的设置,直接点击Word文件上方工具栏【布局】,选择【分栏】下面的【...

Word怎么分页?这三个方法可以帮到你

我们不仅可以利用Word编辑文档,还可以编辑文集呢。但是有时候会出现两个部分的文章长短不一,我们需要对文档进行分页处理。这样可以方便我们对文档进行其他操作。那么Word怎么分页呢?大家可以采用下面这...

Word内容稍超一页,如何优化至单页打印?

如何将两页纸的内容,缩到一页打印呢?有时候一页纸多一点内容,我们完全可以缩一下,放到一页来打印。...

[word] word 表格如何跨行显示表头、标题

word表格如何跨行显示表头、标题在Word中的表格如果过长的话,会跨行显示在另一页,如果想要在其它页面上也显示表头,更直观的查看数据。难道要一个个复制表头吗?当然不是,教你简单的方法操作设置Wo...

Word表格跨页如何续上表?(word如何让表格跨页不断掉)

长文档的表格跨页时,你会发现页末空白太多了,这时要怎么调整?选中整张表格,右击【表格属性】,点击【行】选项,之后勾选【允许跨页断行】,点击确定即可解决空白问题。...

Word怎么连续自动生成页码,操作步骤来了!

Word怎么连续自动生成页码,操作步骤来了!...

word文档怎么把两页合并成一页内容?教你4种方法

word怎么把两页合并成一页?word怎么把两页合并成一页?用四种方法演示一下。·方法一:把这一个文档合并成一页,按ctrl加a全选文档,然后右键点击段落,弹出的界面行距改成固定值,磅值可以改小一点,...

如何将Word中的一页的纸张方向设置为横向?这里提供详细步骤

默认情况下,MicrosoftWord将页面定向为纵向视图。虽然这在大多数情况下都很好,但你可能拥有在横向视图中看起来更好的页面或页面组。以下是实现这一目标的两种方法。无论使用哪种方法,请注意,如果...

Word横竖混排你会玩吗?(word横排竖排混合)

我们在用Word排版的时候,一般都是竖版格式,但偶尔会需要到一些特殊的版式要求,比如文档中插入的一个表格,横向的内容比较多,这时就需要用到横版,否则表格显示不全。这种横竖版混排的要求,在Word20...

取消回复欢迎 发表评论: