最近,公司要求开发一个Linux上的有画面的程序,记得上学时,开发过嵌入式QT的程序,这是我对QT程序唯一的一点儿经验。这次开发我还是选择了QT。开发环境如下:

  • PC系统版本:ubuntu14.04
  • QTCreator:5.8.0

之前做过几个windows上 程序,使用的时VS、MFC之类的,商用的集成开发环境一切都是那么方便,由于是首次正式开发Linux上的界面程序,在发布的时候遇到了一些问题,现记录下来。

Linux QT程序要想在没有QT环境的目标机运行,可以采用静态编译,也可以采用动态编译,但是发布的时候需要把QT要使用到的库文件带上。静态编译需要把QT的源码编译成静态库(*.lib),网络上有人反应说是编译很困难,为了不陷入环境搭建的困境,也为了节约时间,更为了开发界面方便使用QTCreator。

QT发布首先要编译出release版的应用程序,并且把程序的用到的库(*.so)与应用程序一起打包发布。找到应用程序使用的库可以使用下面的脚本copylib.sh:

#!/bin/sh
LibDir=$PWD/lib
LibXcb=$HOME/Qt5.8.0/5.8/gcc_64/lib/libQt5XcbQpa.so.5
mkdir $LibDir
Target=$1
lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))
for Variable in ${lib_array[@]}
docp "$Variable" $LibDir
done
cp $LibXcb $LibDir

这类脚本在网上比比皆是,就是利用ldd命令找到应用程序或者是库等需要的库。使用方法,先新建一个发布的目录,将release的程序放到目录下,copylib.sh一并放入,然后执行:./copylib.sh Appname(应用程序的名字),就会在这个目录下生成一个lib目录,里面就包含了所有用到的库。然后在这个目录下在新建一个与应用同名的脚本文件Appname.sh,内容如下:

 #!/bin/shappname=`basename $0 | sed s/.sh$//g`dirname=`dirname $0`tmp="${dirname#?}"if [ "${dirname%$tmp}" != "/" ]; thendirname=$PWD/$dirnamefiLD_LIBRARY_PATH=$dirname:$dirname/libexport LD_LIBRARY_PATHchmod +x $appname$dirname/$appname "$@"

这个文件是对所有的程序都通用的,最重要的就是export LD_LIBRARY_PATH这句话,声明动态链接库的路径。这样应用程序才能找到库。还可以把库文件都拷贝到/lib 或者/usr/lib目录下,但是需要root权限,不可取。在终端下执行./Appname.sh就可以执行应用程序了,且不可双击应用程序运行,因为双击没有声明库,运行也会提示找不到QT相关的库。还可以在用户目录的.bashrc文件按中声明 LD_LIBRARY_PATH,但是还是麻烦。

别以为这样就完事大吉了,运行了程序还会提示关于“XCB找不到不能加载的错误”,我们还需要把做一下三个步骤:

1、Qt5.8.0/5.8/gcc-64/plugings/platforms/libqxcb.so文件,放到我们发布路径的plugings/platforms目录下。

2、把libqxcb.so需要的库libQt5DBus.so.5.8.0和libQt5XcbQpa.so.5.8.0,放到发布路径的lib目录下,这两个文件在Qt5.8.0/5.8/gcc-64/lib下。我把他们该了名字libQt5DBus.so.5和libQt5XcbQpa.so.5,不改名字没验证好不好用。

3、还要声明export QT_QPA_PLATFOEM_PLUGIN_PATH=发布路径/plugings/platforms。

这样就可以运行了。但是,我说但是(电视剧《情满四合院》里“三大爷”的台词),客户是“傻子与白痴”(我不是贬低客户,只有抱着这种思想,才能开发出好的程序来。“傻子与白痴”是乐队的名字,不过我还是喜欢“新裤子”乐队,就喜欢彭磊“贱贱”的样子,还有“刺猬”子健那程序员颓废的样子),不能在终端执行命令,只能双击图标启动程序(这样的客户用windows就好了,非要用Linux)。上面的内容网上比较多,下面的内容不太好找,双击图标启动程序,不用声明库的路径,还不用声明XCB插件路径。

不用声明库路径,我们只需在QTCreator的工程文件Appname.pro中添加下面一行:

QMAKE_RPATHDIR = ./lib

这句话意思就是程序在目标及运行的时候找当前路径下的lib路径,为不用去找系统的路径。

不用声明XCB插件路径,我们需要修改main.cpp文件:

#include "mainwindow.h"
#include <QApplication>
#include <QDir>
#include <QDebug>void registerPluginsDir(QDir& exeDir)
{QString pluginsRelPath = "plugins";QString platformsRelPath = "platforms";QString pluginsPath = exeDir.absoluteFilePath(pluginsRelPath);QString platformsPath = QDir(pluginsPath).absoluteFilePath(platformsRelPath);QStringList pathes = QCoreApplication::libraryPaths();pathes << pluginsPath;pathes << platformsPath;QCoreApplication::setLibraryPaths(pathes);for (auto i : pathes)qDebug() << i << "\n";
}int main(int argc, char *argv[])
{QString exePath = QString::fromUtf8(argv[0]);QFileInfo exeInfo(exePath);QDir exeDir(exeInfo.absolutePath());registerPluginsDir(exeDir);QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

这个文件的意思很好理解,实在不好理解就调试一下就知道了。这样就大功告成了。

程序运行了,但是在ubuntu的左侧边条里程序显示了一个问好的图标,再说一下修改这个图标吧,就不上图了,麻烦,完全文字描述QTCreator下,工程文件上右键,选择Add New..,左侧选Qt,右侧选Qt Resource File,然后随便输入个名字,也别太随便了,随便起来不是人,然后,Next, Finish, 然后Add下选择Add Prefix,再Prefix下随便输入名字,在Add下选择Add Files,选择一个png的图片进去。最后,双击mainwindow.ui,选择窗口,在右侧windowIcon中选择Resource中的文件。具体的自己发掘吧。

以上

Linux下QT程序的发布及相关问题相关推荐

  1. Linux 下qt 程序打包发布(使用linuxdelpoyqt ,shell 脚本)

    Linux 下qt 程序打包发布(使用linuxdelpoyqt ,shell 脚本) 转载于:https://www.cnblogs.com/zhehan54/p/9549017.html

  2. qt调用linux 进程,Linux 下qt 程序打包发布(使用linuxdelpoyqt ,shell 脚本)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/u014746574/article/d ...

  3. Linux下Qt程序运行时找不到so的解决办法

    一.全局性设置 将so放入相应的系统lib目录: 修改环境变量,在环境变量中添加so所在路径: 修改一些文件,在其中指定so所在路径. 大概有上面的这3种方式,就不详细说了,相信大家都清楚. 二.指定 ...

  4. Linux下 Qt界面程序嵌入另一个Qt界面程序_Qt应用嵌入外部进程窗口

    项目工程的实现,想要使用多个程序进行实现,在里面存在一定的调用的过程:调查的情况如下 Qt界面程序嵌入另一个Qt界面程序[Linux] Qt界面程序嵌入另一个Qt界面程序[Linux]_ptc321的 ...

  5. Linux下Java程序中文乱码问题研究

    Linux下Java程序中文乱码问题研究 摘  要:在一个项目的开发中,我用linux内核源代码和busybox源代码自己编译打造的操作系统mylinux 1.0 ,服务器是我用java语言自己编写的 ...

  6. Windows下Qt程序打包

    Windows下Qt程序打包 将windeployqt.exe 目录添加到系统环境变量 windeployqt.exe目录如下: 命令行打包 1.打开命令行 2.执行打包命令 windeployqt ...

  7. 解决Windows下Arm下Linux下Qt4程序的中文乱码问题

    解决Windows下Arm下Linux下Qt4程序的中文乱码问题 ################################################################### ...

  8. Qt程序打包发布方法(使用官方提供的windeployqt工具)

    Qt程序打包发布方法(使用官方提供的windeployqt工具) 转自:http://tieba.baidu.com/p/3730103947?qq-pf-to=pcqq.group Qt 官方开发环 ...

  9. linux上 arm开发环境搭建,详解 LINUX下QT For ARM开发环境搭建过程

    LINUX下QT For ARM开发环境搭建过程是本文介绍的内容,不多说,先来看内容.在PC上,我们需要得到两个版本的Qt,分别是:Qt-4.5.2和QtEmbedded-4.5.2-arm.前者包括 ...

最新文章

  1. 简单提升编译速度的一个方法
  2. fwrite视频写入帧率测试(不用测了。。)
  3. Object 保存到文件中
  4. 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)
  5. mysql gui 分区_一文彻底搞懂MySQL分区
  6. Python List sort方法无效
  7. The Closest M Points//kd树+优先队列
  8. 详细关闭iiop方法_安卓手机卡顿清理垃圾是没用的,教你关闭几个设置,告别手机迟钝...
  9. 2020年最新-Java集合面试题
  10. 425 Failed to establish connection解决方案
  11. Coding life,云栖社区的个性化首页上线
  12. 极客Linux日记-2022年1月2日
  13. python收益风险点图_AAVE当前风险与收益是否有偏差?如何评估DeFi投资组合?
  14. 区块链公链“三元悖论”专题之可扩展性(Scalability)
  15. 在C语言中使用二分法算法思想解决猜商品价格问题
  16. 深入理解 latch: cache buffers chains
  17. 一篇文章说清楚TensorFlow是什么
  18. 数据分析---2012美国大选献金项目数据分析
  19. python调用windows系统声音
  20. java多线程与并发_漫画 | Java多线程与并发(一)

热门文章

  1. React框架:1、React简介
  2. alias无效,source /etc/profile Badly placed ()'s.
  3. 计算机组成原理之总线设计
  4. 【JavaWeb】TableDemo 表格隔行显色+鼠标悬停高亮显示
  5. 白杨SEO:再谈私域流量,微信好友及朋友圈超过5000限定的机遇与挑战!
  6. a标签触发手机电话相关功能
  7. 【javascript】模板字符串
  8. adb devices检测不到小米Note 3的问题
  9. 字符0、数字0和‘\0’
  10. hexo 快速免费搭建博客