Qt程序linux发布,终极方案-无敌

qt菜鸟,需要将编好的软件在没有安装Qt的linux系统下运行,首先联想到windos下有windeployqt 这个环境打包命令,这个命令非常好用,所以查了查linux下有没有这个 命令,发现还真的有这个命令,接下来就是在网上找帖子看看有没有可以使用的,做一会伸手党。接下来就是漫无目的的掉坑之旅。。。

 

ps: 最近整理了一下,如下是主要执行步骤

——————————————————————————————

1. vim /etc/ld.so.conf    
2. 在"include ld.so.conf.d/*.conf"下方增加
    "/usr/local/lib"
    "/usr/local/lib64" (如果是64位的系统)
    "/usr/lib"
    "/usr/lib64" 保存退出(不要双引号)

3.   chmod  777 执行程序和依赖库
4.   拷贝依赖文件到"/usr/local/lib"和 "/usr/local/lib64"路径下
5 .  在命令行终端执行:/sbin/ldconfig -v     
6.   可以运行程序
 

——————————————————————————————

原博文:

1

https://blog.csdn.net/u010168781/article/details/82150105 

没用!

将Qt安装目录中 Qt5.6.3/5.6.3/gcc_64/plugins/platforms 拷贝到qt程序所在目录

2

https://cloud.tencent.com/developer/ask/62599/answer/106141 

不行

懒得列了,总之好多坑之后。。。。。。

 

看下面贴子有用,也可以直接看我的这篇汇总

https://blog.csdn.net/whatday/article/details/83825491    

https://blog.csdn.net/u010168781/article/details/82150105

https://blog.csdn.net/sinat_26106275/article/details/82778951   

https://blog.csdn.net/zuolj/article/details/80793364

 

现在对帖子的内容整理一下,并且修复一些问题更加适合 我们这种菜鸡 操作:

 

针对的 大问题:

Linux中error while loading shared libraries错误解决办法

 

具体的相关问题:

Qt:

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

Reinstalling the application may fix this problem.

已放弃 (core dumped)

 

出现的原因:

 

 库的路径,库的使用 问题。

 

    默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件,通常通过源码包进行安装时,如果不指定--prefix,会将库安装在/usr/local/lib目录下;

    当运行程序需要链接动态库时,提示找不到相关的.so库,会报错。也就是说,/usr/local/lib目录不在系统默认的库搜索目录中,需要将目录加进去。

 

写在解决方法之前 root权限 , 给虚拟机弄个快照

 

统一解决的方法:

     1  -  首先打开/etc/ld.so.conf

     2  -   vim /etc/ld.so.conf    

              在"include ld.so.conf.d/*.conf"下方增加"/usr/local/lib"   “/usr/lib” "/usr/lib64" 保存退出(不要双引号)

                这里有个坑,不加上后两个的话,有可能你下一步执行之后就GG了。

     3  -   在命令行终端执行:/sbin/ldconfig -v           作用是将文件/etc/ld.so.conf 列出的路径下的库文件缓存到/etc/ld.so.cache以供使用 。  因此当安装完一些库文件 ,修改/etc/ld.so.conf 增加库的新搜索路径,需要运行一下ldconfig,使所有的库文件都被缓存到文件/etc/ld.so.cache中,如果没做,可能会找不到刚安装的库              

针对Qt发布问题解决: 

    提示缺少xcb,就是缺少库!!我们把共享库放在 /usr/local/lib  中。

    1 - 新建文件夹  dsb(最好项目名),把你生成的release版的(linux可执行文件)程序单独拷贝过来。

    2 -  将Qt安装目录中 查找 platforms  目录 ,整个拷贝到qt程序所在目录 (版本路径按自己安装的来), 使用ldd查看libqxcb需要链接的库是否能找到,如果没有,将缺少的库一并拷贝到发布包中

    可以写个shell程序,新建文本复制下面内容,关闭把文件后缀改成 .sh, 先把 可执行文件的依赖通过脚本shell打一次包,然后再改 EXE =  libqxcb ,把libqxcb库的依赖库也全部打包。  查找这个   libQt5XcbQpa.so.5  和   ibQt5DBus.so.5.5.0 也要放在运行目录下。重点来了,用ldd libqxcb.so 看看有没有什么库是 not found ,这就需要在Qt安装目录下查找手动拷贝出来,造成原因大部分是名字的问题。例如 libQt5Gui.so.5 在安装目录中可能叫 libQt5Gui.so.5.5.0 

---------------------我是分割线------------------

#! /bin/bash

EXE='power2'                         //想打包什么就改这个EXE的名字

PWD=`pwd`                            //dest的路径

files=`ldd $EXE | awk '{ if(match($3,"^/"))         // ldd 是查找依赖

        printf("%s "),$3 }'`

cp $files $PWD                        //src->dest的依赖文件复制

---------------------我是分割线------------------

控制台执行  sh run.sh           //我这边命名为 run.sh

 

 

  2 -   重点来了,把 platforms 里, dsb 里 的 库文件 统统拷贝到  /usr/local/lib  目录下,最后执行 统一解决的方法 。没错,就是前文提到的方法。

 

有价值的内容:

    这次解决问题的关键在于,添加环境变量:export QT_DEBUG_PLUGINS=1,这个可以看到Qt执行失败的调试信息

 

附加,如果还有问题: 

        如果还不行, 那就得确认一下是不是当前用户在库目录下是不是没有可读的权限。像我遇到的问题就是,从别的机子拷贝了一些.so动态库,然后用root权限放到了/usr/local/lib中(普通用户没有对该目录的写权限),然后切换用户运行程序时,始终提示找不到.so库,一直以为是我配置有问题,结果是因为权限原因,那些我用root权限增加到/usr/local/lib中的.so文件对于普通用户而言,是没有访问权限的,所以以普通用户运行程序,当需要链接.so库时,在/usr/local/lib中是查找不到的。

        其实,对于由普通用户自己编译生成的.so库文件,比较好的做法是将这些.so库文件的路径用export指令加入到~/.bash_profile中的LD_LIBRARY_PATH变量中,LD_LIBRARY_PATH是程序运行需要链接.so库时会去查找的一个目录,~/.bash_profile是登陆或打开shell时会读取的文件,这样,每次用户登录时,都会把这些.so库文件的路径写入LD_LIBRARY_PATH,这样就可以正常地使用这些.so库文件了。export  LD_LIBRARY_PATH=/usr/local/lib  这样可以在当前shell中加入这个路径

 

感慨:

网上大部分搜到的解决办法,可能都是基于qt5.5之前的,但是qt5.5之后新加了几个库,所以网上的解决办法搜不到,所以才困扰我3天 ,真是坑。

如果还不行,就百度Qt在Linux下静态编译吧,good luck;

 

 

-----------------------------------分割线------------------------------------------

 

本人,没错还是本作者,在32位环境centOS6.5 ,Qt5.5  用上面方法成功了!!!!

但是!!!在CentOS7 64位上用上面的方法移植Qt5.9.4的程序,却是以失败而告终,

 

没错,我就是上面方法都用了还是不行的,ps:为什么鸟坑我都要踩一遍呢。

 

看这些帖子有用:

https://www.cnblogs.com/shark-smart/p/7910310.html ( 核心)

http://blog.sina.com.cn/s/blog_9d48d26f01015rv9.html 

 

Qt 5.9.4 静态编译

 

  1.  下载源码

http://download.qt.io/archive/qt/        我下载的是 qt-everywhere-opensource-src-5.9.4.tar.xz

        2.  解压

得到 qt-opensource-linux-x64-5.9.4.run

终端命令:  xz -d     qt-everywhere-opensource-src-5.9.4.tar.xz 

终端命令:  tar -xvf   qt-everywhere-opensource-src-5.9.4.tar

  1.  终端安装必要环境  http://doc.qt.io/qt-5/linux.html 

ubuntu :

sudo apt-get install build-essential libgl1-mesa-dev

 

CentOS7 :

sudo yum groupinstall "C Development Tools and Libraries"

sudo yum install mesa-libGL-devel

PS: 

注意打印信息,可能你的系统已经安装了最新的开发环境了

        

  1. 进入刚解压的目录

            运行

            ./configure -prefix /home/yx/Qt5.9static -confirm-license -opensource -c++std c++11 -platform linux-g++-64 -release -static -qt-sqlite -fontconfig -gstreamer 1.0 -qt-zlib -qt-libpng -qt-libjpeg -qt-xcb -qt-xkbcommon-x11

            

PS:参考帖子的原文

    由于加上-fontconfig编译项后,在编译过程中可能会出错,提示fontconfig未通过,这是由于缺少freetype相关头文件造成的,所以首先要保证freetype开发库已经安装: 

     终端命令:  sudo apt-get install libfreetype6-dev

    安装后发现freetype头文件没在标准路径,于是做软链接 

     终端命令: sudo ln -s /usr/include/freetype2/freetype /usr/include/freetype

    另外还需要安装fontconfig开发库

     终端命令: sudo apt-get install libfontconfig1-dev

    由于项目中要使到多媒体中相机功能 必须指定 -gstreamer 且插件必须安装否则相机无法使用(defaultServiceProvider::requestService(): no service found for - org.qt-project.qt.camera)

    我使用的是 1.0版本     

    终端命令:

    sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev

    sudo apt-get install gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-plugins-bad

    sudo apt-get install libpulse-dev

 

我按照上面的设置之后没有成功,应该是freeType安装的不对,然后我就去找这个安装包

 yum install  freetype-2.8-12.el7.x86_64.rpm(文件名可以替换成下载的连接)

找不到的可以在这个网站上查找 http://rpmfind.net/linux/rpm2html/search.php?query=libpng-devel&submit=Search+...&system=&arch=

freetype-2.8-12.el7.x86_64.rpm 依赖于 libpng-devel-1.5.13-7.el7_2.x86_64.rpm 所以先  yum install  libpng-devel-1.5.13-7.el7_2.x86_64.rpm

 

 

相关的参数说明可以网上自行百度

            一路 yes  ,然后 make    ,然后 make install 

               

PS1 :make和make install 的时候我看运行到最后编译过程中可能会出错,我怀疑就是一开始 freetype没装好的原因,我选择忽视,先跑完再说,因为有快照也不怕搞坏虚拟机。

 

PS2:在 make 静态编译内核的时候,可能会失败,报错示/tmp空间不够怎么办,放心,我也遇到了- -!

         这种情况最好 make clean ,重新 make  

            

     df -Th  查看你的磁盘空间使用情况,比如我的磁盘已经用满了,所以一定会失败,我的如下只有1G的空间了,编译一会就报错

                        /dev/mapper/centos-root xfs        22G   21G  1.4G   95% /

                1 -  我的虚拟机使用的是VMWare ,首先删掉之前备份的快照, 有快照的话是不可以给虚拟机系统增加磁盘空间的。我直接又分了20G,应为我也不知道要多大。

                2 -  新建快照,以防万一失败,可以恢复。

                3 -  按照这个帖子做  https://www.jianshu.com/p/273daea17b2a  ,如果想升入理解还可以看这个帖子                                                                                                                                                                        https://www.cnblogs.com/gaojun/archive/2012/08/22/2650229.html

                

 

 6.    

增加(或改变)环境变量: 

在etc 目录profile文件中追加(或改变)如下环境变量:(为Qt设置一些特定的环境变量,这个很重要!profile文件是隐藏的,可在你的名字目录下,按Ctrl+H显示所有文件查看到)

QTDIR=/home/yx/Qt5.9static         //静态安装的qt 

PATH=$QTDIR/bin:$PATH   

MANPATH=$QTDIR/doc/man:$MANPATH   

LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH   

export QTDIR PATH MANPATH LD_LIBRARY_PATH  

7、重启

8、在终端测试一下 qmake -v

成功的话,我的是显示

QMake version 3.1

Using Qt version 5.9.4 in /home/yx/Qt5.9static/lib

下来用qmake编译出的Qt程序就是采用静态编译的。这时你会发现,静态编译出来的程序大小变大了相当多。

 

         

------------------测试使用qmake编译工程----------------------

cd 自己的工程目录

qmake -project(生成.pro文件),如果已经有.pro文件就可以不执行这一步,最好用Qtcreator动态编译生成的.pro文件,防止缺QT += core gui\

      network 这类东西,我就一开始缺报错,很纳闷为什么动态可以,静态编译出问题,因为我很确定程序是没有问题的,然后一看原来是 .pro文件被更新了

qmake 

make 

./运行你的程序

 

总结: 至此我的程序已经通过了静态编译,前后耗了很多天。

            

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值