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
现在对帖子的内容整理一下,并且修复一些问题更加适合 我们这种菜鸡 操作:
针对的 大问题:
具体的相关问题:
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 静态编译
下载源码
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
终端安装必要环境 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:
注意打印信息,可能你的系统已经安装了最新的开发环境了
进入刚解压的目录
运行
./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
./运行你的程序
总结: 至此我的程序已经通过了静态编译,前后耗了很多天。