linux平台下qt程序的编译以及使用linuxdeployqt打包可执行程序和在高版本22.04ubuntu下使用linuxdeployqt打包文件的问题

Apathy丿灬寒羽 2024-06-22 14:07:18 阅读 57

写于2023.10.20

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

由于是已经攻克过后才有的这一篇博客,所以可能有些细节我已经想不起来了,但大体过程已经写在了下面

首先说一下我们的环境,用的是ubuntu 22.04.3LTS,下面附上官网的连接

https://cn.ubuntu.com/download/desktop

之后给ubuntu配置源,这里我配置的是科大的源

首先打开中国科学技术大学镜像网站

USTC Open Source Software Mirror

点击网页右

侧“配置软件源”按键。如下图所示,在弹出的界面中,发行版镜像选择“Ubuntu

源使用帮助”。

进入 Ubuntu 源使用帮助后,如下图所示,在手动更改配置文件部分复制选

框中的源配置信息。

注意不同的 Ubuntu 版本需要对应不同的源,Ubuntu 版本有对应代号,替换

源中代号即可跟换版本。

复制号源配置信息后,使用 CTRL+ALT+T 快捷键打开 Terminal,输入如下图所

示命令, 备份源配置文件,并使用 gedit 软件打开该文件,然后将复制的信息覆

盖源信息并保存

使用科大源配置信息覆盖/etc/apt/sources.list 文件信息后,保存文件内容,然

后再终端中输入 sudo apt-get update 命令并执行,系统会自动更新索引信息,使

配置生效。运行 sudo apt-get upgrade 命令,可以对系统安装软件进行更新

上面的图片都是我使用的教程截下来的,因为我已经解决这个问题了,请原谅懒惰的我不再用一个新机给大家演示(其实这个帖子我也鸽了好几天)

之后安装vim,gcc

在终端输入并运行 sudo apt-get install vim 指令,系统即可自动安装 vim 编辑

器。vim 软件安装过程如下图所示:

同 vim 编辑器安装类似,早终端输入并运行 sudo apt-get install gcc,系统即

可自动完成 gcc 编译器的安装。

至此完成部分准备工作,之后我们开始安装qt

Qt6的话,请到下面这个网址下载在线安装器

Index of /qt/official_releases/online_installers/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

安装完了之后进入这个下载出来的文件的文件夹,右键,在终端打开,然后输入代码,首先赋予可执行权限,也可以直接右键然后在属性里勾选

sudo 777 chmod qt-xxxxxx.run

./ qt-xxxxxx.run

这个chmod后面是你下载下来的文件名,不需要我多说吧,不能理解我也没办法

然后运行,之后创建文件,我这里下的是qt6.4.2,

Additional libraries里面的组件尽量勾选,但webengine一定不能少,如果你没选也可以在qt的目录下面找到这个文件双击,补全一下

之后打开你的程序,记得一定要用qmake,打开.pro,然后在里面添加这么一行

QMAKE_LFAGS += -no-pie

添加进你的.pro文件里面

之后进行release的构建,这里需要注意的是如果你的windows程序源码用到了Qactive里面的东西,例如axcontainer,那么会报错,这个模块是只有windows才会有的,所以只能够把相关代码屏蔽或者删除,这一点我无能为力

之后配置qt环境,在命令行输入这一句

之后打开了文件,可以看到是这样的

Qt的配置是这几行

Qt的配置大家根据自身的路径来修改就好,我的用户名是pacific,大家要改成自己的用户名才行

之后也加上这一行,后面有用

之后在控制台输入

source ~/.bashrc

让环境立即生效

到这里我们就把qt的问题解决了,之后我们开始正式进入打包环节,打包呢,需要很多很多东西的加持,其中遇到的坑我也会给大家一一说明,首先大家知道windows下面有一个命令叫做windeployqt,但很遗憾,linux下面没有这个命令,但所幸github上面有工具,所以我们来下载一下

下面附上github网址

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

打开过后大家可以看到是这样的

这里我们要看自己的ubuntu版本,如果你用的是18.04还是16.04以下的话,可以直接下载工具,就是这个

而如果你和我一样是比较新的ubuntu,我们需要下载源码,大家看到这里不要急,觉得麻烦,很多博客天天说的很简单,但其中很多问题他们都没有提到过,例如这个打包过程中会报错什么的,我是一步一步走下来的,所以自然知道该怎么做,而不是没头没尾的抄袭,网上的博客说自己是20.04的ubuntu,居然没报错,这显然是不可能的

至于为什么要下载源码是因为自带的工具在高版本ubuntu会报错显示the host system is too new,我想从网上找个截图但没找到,我自己的已经解决问题了,但我确实亲身经历过,以下是找到的报错

ERROR: The host system is too new.

Please run on a system with a glibc version no newer than what comes with the oldest.

still-supported mainstream distribution, which currently is glibc 2.20.

This is so that the resulting bundle will work on most still-supported Linux distributions.

For more information, please see

https://github.com/probonopd/linuxdeployqt/issues/340

回归正题,我们下载源码

之后解压到ubuntu桌面并且打开.pro

如果你不是这样的,而是只有一个.pro文件没有下面的src tests还有tools,那么很遗憾,你可能需要换一个版本或者自行解决了,我之前用的是6.5.2,就是会打不开

之后进到这个文件里面

看到这串蓝色代码了吗?注释掉

然后调整成release,右键linuxdeployqt那个文件夹然后右键点击构建

构建完成就会像上面这样,然后到生成的文件夹里面的bin文件夹下面可以看到这

右键在终端运行,然后输入

chmod 777 linuxdeployqt

sudo mv linuxdeployqt  /usr/local/bin

然后可以在控制台输入

linuxdeployqt -appimage

正常情况下就可以输出这个了

如果不是的话,检查一下之前export的qt路径,

如果正常之后大家可以测试一下,把你要打包的那个可执行文件放到文件夹下面然后再终端打开并且输入linuxdeployqt xxxx ,这里的xxxx是你的文件名,那么大概率会出现下图的错误,这个错误是我截图的,我本身遇到过这个错但是解决了

这个是缺少patchelf导致的,大家可以点击下面的连接,

Channels for NixOS project(s)

然后按照域名索引进行选择patchelf下载就可以

下载后解压进入文件夹执行如下命令

./configure

make

sudo make install

之后还需要下载最后一个包

Appimagetool

下载地址

https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage

下载完成后执行如下命令:

sudo mv appimagetool-x86_64.AppImage appimagetool

chmod 777 appimagetool

sudo mv ./appimagetool /usr/local/bin

之后进入/usr/local/bin ,你会看到以上的三个文件,linuxdeployqt,patchelf,appimagetool

之后把编译生成的包放到文件夹下面,然后输入

Linuxdeployqt xxx -appimage即可开始打包

期间也会有其他错误,例如没有fuse运行不了之类的,这种错误直接

Sudo apt-get install fuse

这样获取fuse能解决百分之九十九的问题

其他的可以自行查阅,问题不是很大的,

但打包任然会报一个错误

别慌,一切尽在掌握,打开打包生成的这个文件

修改成这样

然后再次执行,就可以打包成功并且得到这个文件

这个就是我们最后的打包啦,到别人的电脑上的话别人要首先赋予他可执行权限然后在命令行,注意是命令行,输入./xxxx xxxx是打包出来的.appimage的全称,包括后缀,虽然linux不看后缀,就可以在其他电脑上运行了,当然实测也需要新电脑安装fuse

之间还有一些问题就是高版本的ubuntu打包出来的程序在低版本上面运行会报错,显示glibc版本缺失,这个问题我还没有解决,只能够说尽量在同版本甚至更高版本上面运行打包的程序吧,或者降低打包的电脑的版本也不失为一种解决方案,但仍然有待测试

最后,看在我是个本科生的份上,各位哥哥姐姐能不能给我点一个赞呢?真的是本科生啊!



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。