曹紅明 發表於 2022-10-24 09:02:00

麒麟系统开发笔记(八):在国产麒麟系统上使用linuxdeployqt发布qt程序

<div class="cl-preview-section">
<h1>前言</h1>
</div>
<div class="cl-preview-section">
<p>  在ubuntu上发布qt程序相对还好,使用脚本,但是在麒麟上发布的时候,因为银河麒麟等不同版本,使用脚本就不太兼容,同时为了实现直接点击应用可以启动应用的效果,使用linuxdeployqt发布qt程序。</p>
</div>
<div class="cl-preview-section">&nbsp;</div>
<div class="cl-preview-section">
<h1>补充</h1>
</div>
<div class="cl-preview-section">
<p>  在ubuntu上发布程序遇到xcb问题,当我们将其部署到另外同样环境但是未装qt的环境下,运行起来一部分是xcb文件,有一部分解决后可以正常运行启用,另一部分直接段错误,程序宕掉(提示,段核心错误,已转存什么的),使用linuxdeployqt能解决此问题,也就是使用脚本打包的升级版本。</p>
</div>
<div class="cl-preview-section">&nbsp;</div>
<div class="cl-preview-section">
<h1>linuxdeployqt</h1>
</div>
<div class="cl-preview-section">
<p>  Linux部署工具linuxdeployqt将应用程序作为输入,并通过将应用程序使用的资源(如库、图形和插件)复制到一个包中使其自包含。结果包可以作为AppDir或AppImage分发给用户,也可以放入交叉分发包中。它可以作为构建过程的一部分,在CMake、qmake和make等系统中部署用C、C++和其他编译语言编写的应用程序。当用于基于Qt的应用程序时,它可以绑定运行应用程序所需的Qt的特定最小子集。</p>
</div>
<div class="cl-preview-section">
<h2>源码下载地址</h2>
</div>
<div class="cl-preview-section">
<p>  gitcode地址:https://gitcode.net/mirrors/probonopd/linuxdeployqt</p>
</div>
<div class="cl-preview-section">&nbsp;</div>
<div class="cl-preview-section">
<h1>linuxdeployqt编译(麒麟系统,ubuntu)</h1>
</div>
<div class="cl-preview-section">
<h2>步骤一:下载解压</h2>
</div>
<div class="cl-preview-section">
<p>  <img src="https://img-blog.csdnimg.cn/12dfbb01a56d41da8e653474fd139318.png"></p>
</div>
<div class="cl-preview-section">
<h2>步骤二:修改源码,去掉版本检查</h2>
</div>
<div class="cl-preview-section">
<p>  找到main.cpp源码,将这一段(在192行左右)注释掉:</p>
</div>
<div class="cl-preview-section">
<pre><code class="prism language-shell">gedit tools/linuxdeployqt/main.cpp
</code></pre>
</div>
<div class="cl-preview-section">
<p>  <img src="https://img-blog.csdnimg.cn/f41f38d3658e4d8c9e277d6c2fb08c79.png"><br>  (注意:这一步不做会导致打包输出错误信息,具体看“入坑一”)</p>

</div>
<div class="cl-preview-section">
<h2>步骤三:安装依赖第三方库</h2>

</div>
<div class="cl-preview-section">
<pre><code class="prism language-shell"><span class="token function">sudo <span class="token function">apt-get <span class="token function">install cmake
<span class="token function">sudo <span class="token function">apt-get <span class="token function">install patchelf
</span></span></span></span></span></span></code></pre>
</div>
<div class="cl-preview-section">
<h2>步骤四:使用cmake配置</h2>
</div>
<div class="cl-preview-section">
<pre><code class="prism language-shell">cmake CMakeList.txt
</code></pre>
</div>
<div class="cl-preview-section">
<p>  <img src="https://img-blog.csdnimg.cn/c80e6d373b1749578e748ad2d746c27f.png"></p>
</div>
<div class="cl-preview-section">
<p>  因为安装了git与这个工程可能不对,我们直接使用源码修改大法,直接定位到代码给删掉:<br>  <img src="https://img-blog.csdnimg.cn/ce3d158b52de4ee893d2fd03282f8f43.png"><br>  直接删掉目录下的缓存文件:CMakeCache.txt,然后继续:<br>  <img src="https://img-blog.csdnimg.cn/0281c6067a244912b014ce02b32f06c6.png"></p>

</div>
<div class="cl-preview-section">
<h2>步骤五:配置Qt的依赖环境</h2>

</div>
<div class="cl-preview-section">
<p>  麒麟系统本身自带了qt5,而我们使用了另外安装的qt5,所以依赖需要引入我们自己安装的qt5上。<br>  为了方便配置,也不影响系统我们装上cmake的gui版本:</p>

</div>
<div class="cl-preview-section">
<pre><code class="prism language-shell"><span class="token function">sudo <span class="token function">apt-get <span class="token function">install cmake-gui
</span></span></span></code></pre>
</div>
<div class="cl-preview-section">
<p>  <img src="https://img-blog.csdnimg.cn/f66543edd8714bc6b1b62a1127390106.png"></p>
</div>
<div class="cl-preview-section">
<pre><code class="prism language-shell">cmake-gui
</code></pre>
</div>
<div class="cl-preview-section">
<p>  选择对应的路径,然后使用默认unix makefile方式配置:<br>  <img src="https://img-blog.csdnimg.cn/1a85966049a74861ae18d955c394eead.png"><br>  错误如下:<br>  <img src="https://img-blog.csdnimg.cn/b2e8b79814be46ad824228e9ac4bc63c.png"><br>  添加环境变量路径:<br>  <img src="https://img-blog.csdnimg.cn/c2264a07f1574c928bd70fd1e3b8716d.png"><br>  继续配置成功:<br>  <img src="https://img-blog.csdnimg.cn/5dc5400cf3514ced8ee143d3f1274670.png"></p>

</div>
<div class="cl-preview-section">
<h2>步骤六:生成generate</h2>

</div>
<div class="cl-preview-section">
<p>  <img src="https://img-blog.csdnimg.cn/edcbabee47204823a17121d4cce69ea6.png"></p>

</div>
<div class="cl-preview-section">
<h2>步骤七:编译make</h2>

</div>
<div class="cl-preview-section">
<p>  切入build目录,并且使用make命令即可:</p>

</div>
<div class="cl-preview-section">
<pre><code class="prism language-shell"><span class="token function">make
</span></code></pre>
</div>
<div class="cl-preview-section">
<p>  <img src="https://img-blog.csdnimg.cn/aede45290aa5455e993897a64b5286f4.png"></p>
</div>
<div class="cl-preview-section">
<h2>步骤八:安装到系统目录</h2>
</div>
<div class="cl-preview-section">
<p>  没有make install这个,手动移动到/usr/local/bin</p>
</div>
<div class="cl-preview-section">
<pre><code class="prism language-shell"><span class="token function">sudo <span class="token function">mv linuxdeployqt /usr/local/bin/
</span></span></code></pre>
</div>
<div class="cl-preview-section">
<p>  <img src="https://img-blog.csdnimg.cn/f8a560ab2ef54554a55d2142f2de9763.png"></p>
</div>
<div class="cl-preview-section">
<h2>步骤九:测试是否编译成功</h2>
</div>
<div class="cl-preview-section">
<p>  <img src="https://img-blog.csdnimg.cn/9040831cbfa44fa4a7f95b0316b5c7cd.png"></p>
</div>
<div class="cl-preview-section">&nbsp;</div>
<div class="cl-preview-section">
<h1>linuxdeployqt打包流程</h1>
</div>
<div class="cl-preview-section">
<p>  新建一个工程<br>  <img src="https://img-blog.csdnimg.cn/1b8ffb1aac514c2ba2cf6e98b29687fe.png"><br>  然后找个空目录:<br>  <img src="https://img-blog.csdnimg.cn/dbfaa697b6ca41299a4ed415faea029e.png"><br>  开始打包:<br>  <img src="https://img-blog.csdnimg.cn/9367354fd1b34bc195eb0c00be694682.png"><br>  错误“QDir::exists: Empty or null file name”,需要调整打包命令:<br>  <img src="https://img-blog.csdnimg.cn/362b936d08274dad8dc60dd720213b14.png"><br>  错误“qmake not fount on the&nbsp;<span class="katex--inline"><span class="katex"><span class="katex-mathml">PATH”,qmake要引入<span class="katex-html"><span class="base"><span class="strut"><span class="mord mathnormal">P<span class="mord mathnormal">A<span class="mord mathnormal">T<span class="mord mathnormal">H<span class="mord">”<span class="mord cjk_fallback">,<span class="mord mathnormal">q<span class="mord mathnormal">mak<span class="mord mathnormal">e<span class="mord cjk_fallback">要引入PATH中:</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>

</div>
<div class="cl-preview-section">
<pre><code class="prism language-shell"><span class="token builtin class-name">export <span class="token assign-left variable"><span class="token environment constant">PATH<span class="token operator">=<span class="token environment constant">$PATH:/home/hdgx/Qt5.12.1/5.12.1/gcc_64/bin
</span></span></span></span></span></code></pre>
</div>
<div class="cl-preview-section">
<p>  这里要将Qt引入环境,为了不影响系统,使用脚本引入,每次使用之前使用source env.sh引入即可。</p>
</div>
<div class="cl-preview-section">
<pre><code class="prism language-bash"><span class="token shebang important">#!/bin/sh
<span class="token assign-left variable">QT_DIR<span class="token operator">=/home/hdgx/Qt5.12.1/5.12.1/gcc_64
<span class="token builtin class-name">export <span class="token assign-left variable"><span class="token environment constant">PATH<span class="token operator">=<span class="token variable">${QT_DIR}/bin:<span class="token environment constant">$PATH
<span class="token builtin class-name">export <span class="token assign-left variable">LIB_PATH<span class="token operator">=<span class="token variable">${QT_DIR}/lib:<span class="token variable">$LIB_PATH
<span class="token builtin class-name">export <span class="token assign-left variable">PLUGIN_PATH<span class="token operator">=<span class="token variable">${QT_DIR}/plugins:<span class="token variable">$PLUGIN_PATH
<span class="token builtin class-name">export <span class="token assign-left variable">QML2_PATH<span class="token operator">=<span class="token variable">${QT_DIR}/qml:<span class="token variable">$QML2_PATH
<span class="token builtin class-name">export <span class="token assign-left variable">LD_LIBRARY_PATH<span class="token operator">=<span class="token variable">${QT_DIR}/lib:<span class="token variable">$LD_LIBRARY_PATH

<span class="token builtin class-name">echo <span class="token environment constant">$PATH
<span class="token builtin class-name">echo <span class="token variable">$LIB_PATH
<span class="token builtin class-name">echo <span class="token variable">$PLUGIN_PATH
<span class="token builtin class-name">echo <span class="token variable">$QML2_PATH
<span class="token builtin class-name">echo <span class="token variable">$LD_LIBRARY_PATH
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<div class="cl-preview-section">
<p>  &nbsp;<img src="https://img-blog.csdnimg.cn/34e589a087074c11bf16fddeecc67264.png"><br>  <img src="https://img-blog.csdnimg.cn/76cffd036e2543cd836c5b80ab36e5f5.png"><br>  下次打包遵循此流程即可,继续打包:<br>  <img src="https://img-blog.csdnimg.cn/66e975ab8ee54b5589dd24a5556d79fe.png"><br>  发现已经打包成功(ERROR:Could not parse verbose level忽略):<br>  <img src="https://img-blog.csdnimg.cn/dc66719d065a45cca2adbcc650e5b7d7.png"><br>  <img src="https://img-blog.csdnimg.cn/8d4ce50483824808afc488c9a81ac37f.png"></p>

</div>
<div class="cl-preview-section">&nbsp;</div>
<div class="cl-preview-section">
<h1>入坑</h1>

</div>
<div class="cl-preview-section">
<h2>入坑一:运行报错“ERROR:The host system is tool new.”</h2>

</div>
<div class="cl-preview-section">
<h3>问题</h3>

</div>
<div class="cl-preview-section">
<p>  <img src="https://img-blog.csdnimg.cn/5bddc7878fd042f6b8eab88c320cfa44.png"></p>

</div>
<div class="cl-preview-section">
<h3>原因</h3>

</div>
<div class="cl-preview-section">
<p>  源码中做了判断,不是源码编译问题,所以要修改源码。</p>

</div>
<div class="cl-preview-section">
<h3>解决</h3>

</div>
<div class="cl-preview-section">
<p>  找到main.cpp源码,将这一段(在第190行左右)注释掉:<br>  <img src="https://img-blog.csdnimg.cn/4be9f5d947834494b9f62f062aaf6af1.png"></p>

</div>
<div class="cl-preview-section">
<pre><code class="prism language-shell">gedit tools/linuxdeployqt/main.cpp
</code></pre>
</div>
<div class="cl-preview-section">
<p>  <img src="https://img-blog.csdnimg.cn/67db2a5e287140adb39c36e87c715cb3.png"><br>  然后重新make:<br>  <img src="https://img-blog.csdnimg.cn/bc564d02df0f4cd69e2730b89cd62b9f.png"></p>

</div><br><br>
来源:https://www.cnblogs.com/qq21497936/p/16820371.html
頁: [1]
查看完整版本: 麒麟系统开发笔记(八):在国产麒麟系统上使用linuxdeployqt发布qt程序