在Linux 下如何打包免安装的QT程序?

版权声明:嵌入式linux相关的文章是我的学习笔记,基于Exynos 4412开发板,一部分内容是总结,一部分是查资料所得,大家可以自由转载,但请注明出处! https://blog.csdn.net/z3512498/article/details/64922180

如题,近期因为项目需求,得打包QT程序,并将程序放到没有安装QT库的电脑上运行。网上索罗了下,打包QT程序的方式很多,主要分为以下几种: 
1. 打包成安装包形式; 
2. 打包成二进制文件,附带运行库的形式: 
- windows下,有很多工具,教程也比较多,运行库基本是dll文件 
- linux下,需要靠脚本协助,很多教程都不完整,运行库基本是so文件

笔者这里只演示如何在linux下打包免安装程序,程序名称为giptables,QT版本是5.7.1,以下如出现这个名称,则一律替换成读者自己的应用程序名称。 
0、找个地方,比如桌面,创建空文件夹Giptables,这个将用来存放giptables程序的运行文件 
1、先将工程使用Release模式编译 
2、打开编译输出文件的文件夹(带二进制文件giptables的那个)

笔者的文件夹名称是build-giptables-Desktop_Qt_5_7_1_GCC_64bit-Release

3、在上一步的文件夹中新建文件copylib.sh,通过指令设置权限chmod 777 copylib.sh 
4、在 copylib.sh 中加入内容

#!/bin/bash

LibDir=$PWD"/lib"
Target=$ lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*")) $(mkdir $LibDir) for Variable in ${lib_array[@]}
do
cp "$Variable" $LibDir
done

5、打开终端并进入到当前文件夹,输入./copylib.sh giptables

其中, giptables 是运行copylib.sh 脚本的参数,脚本实际上是调用了 ldd giptables指令获得giptables运行时需要哪些库,并将库都复制放到当前目录的lib文件夹中。

运行完上述指令后,同目录下会生成lib文件夹,这里我们将其称作giptables的库文件夹,避免与下文内容混淆

6、将giptables的二进制文件和 giptables的库文件夹里所有的文件复制到Giptables文件夹中,注意:这里是把lib里的所有文件复制出来,不用复制lib文件夹

7、进入QT的安装目录,找到platforms文件夹,笔者的路径是

~/Qt5.7.1/5.7/gcc_64/plugins/platforms
将整个platforms文件夹复制到Giptables文件夹中,注意:这时复制的是整个文件夹,这使得Giptables文件夹中会多出一个platforms文件夹

8、将上文的copylib.sh放到Giptables/platforms/中,并运行./copylib.sh libqxcb.so,这时会得到lib文件夹——libqxcb.so的库文件夹 
ps:为什么是libqxcb.so呢?具体看文末的参考资料,这个跟你要运行的程序有关,需要用到哪些QT的库,就再打包对应的东西。

9、将libqxcb.so的库文件夹中的所有文件复制Giptables文件夹中,然后删除掉Giptables/platforms/lib文件夹

10、在Giptables文件夹中新建脚本giptables.sh,执行chmod 777 giptables.sh,并在其中加入

#!/bin/sh
appname=`basename $ | sed s,\.sh$,,` dirname=`dirname $`
tmp="${dirname#?}" if [ "${dirname%$tmp}" != "/" ]; then
dirname=$PWD/$dirname
fi
LD_LIBRARY_PATH=$dirname
export LD_LIBRARY_PATH
$dirname/$appname "$@"

到这里就基本完成了,将Giptables文件夹复制到需要运行程序的目标主机即可,在目标主机中,运行程序,都采用 ./giptables.sh而不是./giptables,即运行程序的sh脚本,而不是二进制文件


过程中遇到的问题: 
1、运行copylib.sh时报找不到库的错误:必须保证在源文件夹中运行copylib.sh,而不能先将文件复制出来,然后再运行copylib.sh生成lib 
2、在目标主机中提示

This application failed to start because it could not find or load the Qt platform plugin “xcb”

这是因为没有生成libqxcb.so的库文件夹,或者没有将生成的文件夹中所有的文件放到giptables.sh同一级目录下,笔者最后生成的目录结构如下

Giptables(文件夹) -- platforms(文件夹) -- libqxcb.so
| \__ *.so
|
\__ giptables.sh
\__ *.so

参考资料 http://doc.qt.io/qt-5/linux-deployment.html

【最详细最完整】在Linux 下如何打包免安装的QT程序?的更多相关文章

  1. Linux打包免安装的Qt程序(编写导出依赖包的脚本copylib.sh,程序启动脚本MyApp.sh)

    本文介绍如何打包Qt程序,使其在没有安装Qt的系统可以运行. 默认前提:另外一个系统和本系统是同一个系统版本. 1,编写导出依赖包的脚本copylib.sh #!/bin/bash LibDir=$P ...

  2. Linux下同时运行不同版本的qt程序

    因项目需要,可能有不同版本的qt程序要运行到同一台机器上,本次实验是qt4.8.5和qt5.3.1开发的程序同时运行在同一台机器上,此机器可以不按照qt的任何版本,当然,两个版本开发的qt与机器的位数 ...

  3. linux下使用命令模式去编译Qt程序

    1.打开终端输入,qmake -v ,如果提示版本信息正,就可以编译程序了. 2.当前目录切换到程序源代码目录,cd /home/likewei/untitled2 3.生成untitled2.pro ...

  4. linux下mysql-5.5.15安装详细步骤

    linux下mysql-5.5.15安装详细步骤 注:该文档中用到的目录路径以及一些实际的值都是作为例子来用,具体的目录路径以各自安装时的环境为准 mysql运行时需要一个启动目录.一个安装目录和一个 ...

  5. Linux下rar unrar的安装

    Linux下rar unrar的安装: 以3.8.0版本为例,如果是64位平台,执行以下命令,也可以去官方网站:)下载最新版: wget http://www.rarlab.com/rar/rarli ...

  6. linux下python3源码安装及卸载

    Linux下Python3的源码编译安装和卸载方法 [日期:2019-06-21] 来源:博客园  作者:wuli潇萧 [字体:大 中 小]     (一)Linux下软件的源码编译安装和卸载方法 L ...

  7. 在linux下,查看一个运行中的程序, 占用了多少内存

    1. 在linux下,查看一个运行中的程序, 占用了多少内存, 一般的命令有 (1). ps aux: 其中  VSZ(或VSS)列 表示,程序占用了多少虚拟内存. RSS列 表示, 程序占用了多少物 ...

  8. Linux下Memcache服务器端的安装

    最近在研究怎么让Discuz!去应用Memcache去做一些事情,记录下Memcache安装的过程. Linux下Memcache服务器端的安装服务器端主要是安装memcache服务器端,目前的最新版 ...

  9. ElasticSearch概述及Linux下的单机ElasticSearch安装

    原文链接:http://blog.csdn.net/w12345_ww/article/details/52182264 这两天在项目中要涉及到ElasticSearch的使用,就上网去搜索了一些这方 ...

随机推荐

  1. 犀牛Rhino教程合集37部

    犀牛Rhino教程合集37部 教程说明:英文视频教程,部分有中文字幕,大部分有工程文件 教程格式:Flv.MP4格式,大部分高清,确保能看清软件上的文字 发货方式:百度网盘下载链接(教程较多,可转存到 ...

  2. go语言练习:结构体

    package main import "fmt" type book struct { title string author string page int } func ma ...

  3. Java语法基础(四)----循环结构语句

    一.循环结构: 循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则 ...

  4. beego快速入门

    beego的官方网址:https://beego.me 参考文档:https://beego.me/quickstart 1:安装 您需要安装 Go 1.1+ 以确保所有功能的正常使用. 需要已经设置 ...

  5. java网页数据抓取实例

    在很多行业中,要对行业数据进行分类汇总,及时分析行业数据,对于公司未来的发展,有很好的参照和横向对比.所以,在实际工作,我们可能要遇到数据采集这个概念,数据采集的最终目的就是要获得数据,提取有用的数据 ...

  6. jquery 比较全面的API中文版地址

    jquery中文API地址 里面有对各个版本的jquery的属性.方法等都有全面的介绍加例子,值得拥有!

  7. HTTP的cookie

    HTTP cookies,通常又称作"cookies",已经存在了很长时间,但是仍旧没有被予以充分的理解.首要的问题是存在了诸多误区,认为cookies是后门程序或病毒,或压根不知 ...

  8. orcl 中upper()和lower()和initcap()的用法

    upper(字符串 | 列):输入的字符串变为大写返回: 将 bqh4表里的zym字段信息中含有字母的全部转成大写的方法: select * from bqh4 select upper(zym) f ...

  9. ConcurrentModificationException探究

    modCount ? 在ArrayList,LinkedList,HashMap等等的内部实现增,删,改中我们总能看到modCount的身影,modCount字面意思就是修改次数 // HashMap ...

  10. Dalvik指令备忘

    跳转指令 if-eq vx, vy, 目标 如果vx == vy注2,跳转到目标.if-ne vx,vy, 目标 如果vx != vy注2,跳转到目标. if-lt vx,vy, 目标 如果vx &l ...