提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
Centos 7 qt 使用linuxdeployqt 打包发布,并打包成rpm
资源
链接:https://pan.baidu.com/s/1rvF-x5CwzThT1lQQYAC7FQ
提取码:ac2j
一台Centos 7 系统下使用qt 开发一款桌面端,然后使用linuxdeployqt 打包工具进行打包。在使用rpmbuild 命令打包成rpm 包。
提示:以下是本篇文章正文内容,下面案例可供参考
一、Centos 7 安装
使用虚拟机作为本次记录的使用对象。
- 创建虚拟机
等待安装完成。
打开terminal 输入命令查看系统信息
uname -a
结果:
Linux bogon 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
二、安装qt 环境
qt 版本是15.14.2
安装目录在/opt 下
进行qt 安装
因为空间够大,所以,我选择全部安装
等待安装
安装完成以后
在terminal 中输入一下命令,进行环境配置
gedit /etc/profile
添加(注意修改为自己的安装目录)
export PATH="/opt/Qt5.14.2/Tools/QtCreator/bin:$PATH"
export PATH="/opt/Qt5.14.2/5.14.2/gcc_64/bin:$PATH"
刷新配置命令
source /etc/profile
添加用户环境变量(username:用户名)
vim /home/username/.bashrc
添加(注意修改为自己的安装路径)
export QTDIR=/opt/Qt5.14.2/Tools/QtCreator
export PATH=$QTDIR/bin:$PATH
export MANPATH=$QTDIR/man:$MANPATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
export PATH=/opt/Qt5.14.2/5.14.2/gcc_64/bin:$PATH
刷新配置命令
source /home/username/bashrc
查看qt 版本
qmake -v
查看qmake 位置
which qmake
Qt 5.14.2 使用的是c++11,所以需要高版本的gcc,需要升级一下
Centos 7 自带版本
升级gcc
安装centos-release-scl
yum install centos-release-scl
安装devtoolset
想安装x 版本的gcc ,直接将devtoolset-x-gcc* 改成想要的版本;此次以8为例
yum install devtoolset-8-gcc*
激活对应的devtoolset
可以一次安装多个版本的devtoolset,需要的时候用下面这条命令切换到对应的版本
scl enable devtoolset-8 bash
查看升级后的GCC、版本
显示版本
cgcc version 8.3.1 20190311 (Red Hat 8.3.1-3) (GCC)
但是这次激活,只对本次会话管用,重新打开的话,还是之前的4.8.5版本
要找到8.3.1版本的话,有两种方式
- 切换版本
- 直接替换
切换版本
安装的devtoolset在 /opt/sh 目录下,每个版本的目录下面都有个 enable 文件,如果需要启用某个版本,只需要执行
source ./enable
例如:
source /opt/rh/devtoolset-8/enable
直接替换
旧的GCC是运行的 /usr/bin/gcc,所以将该目录下的gcc**/**g++替换为刚安装的新版本gcc软连接,免得每次enable,执行
mv /usr/bin/gcc /usr/bin/gcc-4.8.5
ln -s /opt/rh/devtoolset-8/root/bin/gcc /usr/bin/gcc
或者
mv /usr/bin/g++ /usr/bin/g++-4.8.5
ln -s /opt/rh/devtoolset-8/root/bin/g++ /usr/bin/g++
查看GCC/G++版本
gcc --version / g++ --version
打开程序
提示error: cannot find -lGL
yum install mesa-libGL-devel
如果还是这个错,那么就
然后编项目时出现找不到GL/gl.h问题
是少装了gl库
用命令
yum install mesa-libGL-devel mesa-libGLU-devel
(2个opengl核心库)就可以了
也可以再安装
yum install freeglut-devel
(OpenGL Utility ToolKit )
运行qt 提供的demo
此时qt 环境部署成功
参考:
https://blog.csdn.net/m0_70849943/article/details/132472950
https://blog.csdn.net/zyx4843/article/details/51569285
三、安装linuxdeployqt 环境
Linux 需要自己编译安装
- 下载解压
存放到/opt 目录下
解压文件 linuxdeployqt-master
tar -zxvf tar -zxvf linuxdeployqt-master.tar.gz
- 修改源码,去掉版本检查
位置在
/opt/linuxdeployqt-master/tools/linuxdeployqt
3. 安装cmake
我安装的版本是cmake 3.5.2,如果系统默认安装了cmake ,需要卸载
yum -y remove cmake
解压文件
tar -zxvf cmake-3.5.2.tar.gz
编译
cd cmake-3.5.2
./configure
安装
make
make install
确认
/usr/local/bin/cmake --version
建立软连接
ln -s /usr/local/bin/cmake /usr/bin/
确认
重新打开terminal
/cmake --version
参考:
https://blog.csdn.net/qq_22938603/article/details/122964218
编译cmake-gui
在
/opt/cmake-3.5.2 目录下
执行
./bootstrap --qt-gui
make
make install
建立软连接
ln -s /usr/local/bin/cmake-gui /usr/bin/
/cmake-gui --version
- 安装patchelf 工具
tar -zxvf patchelf-0.9.tar.gz
解压完成后,进入到patchelf-0.9中
执行命令
cd patchelf-0.9
./configure
完成后,执行命令
make
make install
执行完成后,重新打开terminal 测试是否安装成功
patchelf --version
成功
5. 编译 linuxdeployqt
执行命令
cmake CMakeLists.txt
如果出现
说明git 的版本不对,修改源码
打开 /opt/linuxdeployqt-master 的CMakeLists.txt;把7到63行删除
最后会改成这样
然后删除目录下的缓存,CMakeCache.txt;然后执行
cmake CMakeLists.txt
出现
说明成功
- 配置qt 的环境依赖
检查qmake 安装路径
使用cmake-gui来指定依赖的qt:
执行命令
cmake-gui
where is the source code 选择/opt/linuxdeployqt-master
在linuxdeployqt-master 下面建立build 文件
where to build binaries 选择 /opt/linuxdeployqt-master/build
点击Configure,选择 “Unix Makefiles”方式;
之后等待
显示Configuring done
然后再点击 Generate 按钮
7. 生成Generate:
如果没成功,查看gcc g++,是否匹配
8. 编译make
进入到/opt/linuxdeployqt-master/build 目录下
执行
make
9. 安装到系统目录
cd /opt/linuxdeployqt-master/build/tools/linuxdeployqt
执行
cp linuxdeployqt /usr/local/bin
10 . 测试是否编译成功
四、 inuxdeployqt打包流程
- 准备打包的应用
2. Release 生成一个包
把应用单独拿出来,放在一个单独的文件夹中。
2.:引入环境变量
qmake要引入$PATH中(注意:不指定则当前使用的是系统的qmake):
为了不影响系统,使用脚本引入,每次打包使用之前使用source env.sh引入即可。
QT_DIR 要和which qmake 保持一致
#!/bin/sh
QT_DIR=/opt/Qt5.14.2/5.14.2/gcc_64
export PATH=${QT_DIR}/bin:$PATH
export LIB_PATH=${QT_DIR}/lib:$LIB_PATH
export PLUGIN_PATH=${QT_DIR}/plugins:$PLUGIN_PATH
export QML2_PATH=${QT_DIR}/qml:$QML2_PATH
export LD_LIBRARY_PATH=${QT_DIR}/lib:$LD_LIBRARY_PATH
echo $PATH
echo $LIB_PATH
echo $PLUGIN_PATH
echo $QML2_PATH
echo $LD_LIBRARY_PATH
- 打包
执行命令
source env.sh
linuxdeployqt demo -appimage
论证是否真的能运行
将文件打包
tar -zcvf demo_pro.tar.gz demo_pro/
将文件放在另一台服务器上测试
测试可运行。
如果出现xcb 的问题,可以使用
export QT_DEBUG_PLUGINS=1 来定位
修改配置文件~/.bashrc:
vim ~/.bashrc
在最末尾添加如下语句,会在qtcreator启动时,列出详细的错误提示。
export QT_DEBUG_PLUGINS=1
保存退出编辑,使配置文件生效:
source ~/.bashrc
启动命令后
就能看到程序的运行情况了
一般xcb 的问题,
如果还是会报xcb 的错误。 报版本不对,那就需要重新安装一个qt 环境,把env.sh的路径,指到最新的路径下面
笔者关于xcb的问题,排查了好久,其实,最简单粗暴的解决办法,就是重新装一次qt 环境。然后把env.sh 的路径直接指到最新的qt 路径下。就解决了。
使用过ldd 程序,ldd xcb.so 一个个的查找依赖,经过3天的查找,能解决,但是效率太低。最好就是重装。关于xcb 的问题,直接解决。
参考:
https://hpzwl.blog.csdn.net/article/details/129409832
https://blog.csdn.net/sinat_42884063/article/details/123004755
五、rpm 打包
- package 环境准备
打包命令安装
yum -y install rpm-build
yum install rpmdevtools
- 配置工作空间
rpmdev-setuptree
把要打包的文件复制到SOURCES 中
- SPEC 文件
##这些东西是rpm -qpi demo_pro*.rpm 的时候显示的数据 对打包没什么影响
Name: demo_pro
Version: 1.3.0
Release: 1%{?dist}
# 描述信息
Summary: "demo_pro"
# 说明软件包的协议版本,审查软件的 License 状态是打包者的职责,这可以通过检查源码或 LICENSE 文件,或与作者沟通来完成。
License: GPL
Source0: %{name}.v%{version}.tar.gz
# 全局变量,最终安装的路径
%define _path /opt/demo_pro
# 编译依赖
# BuildRequires: gettext
# Requires(post): info
# Requires(preun): info
Requires: info
# 描述信息
%description
# %description -l zh_CN
# %prep指定了在编译软件包之前的准备工作,这里的
# setup宏的作用是静默模式解压并切换到源码目录中,
# 当然你也可以使用tar命令来解压
%prep
#提取源码到BUILD 目录
%setup -n %{name}.v%{version}
echo "-------------------"
echo "把 /root/rpmbuild/SOURCES/ 路径下的源码文件解压提取到 /root/BUILD/目录下 "
echo "-------------------"
# 编译阶段,和直接编译源代码类似,具体的操作或指定的一些参数由configure文件决定。
# 编译阶段,不需要太多操作编译位于 %_builddir 构建目录下的文件。通过执行类似 ./configure && make 的命令实现。
%build
# 安装阶段
# 先删除原来的测试安装的,只有在制作失败了%{buildroot}目录才会有内容,
# 如果成功的话,目录下会被清除。
# 从 ~/rpmbuild/BUILD 复制到 ~/rpmbuild/BUILDROOT/XXX
%install
rm -rf %{buildroot}
mkdir -p %{buildroot}%{_path}
cp -rfv %{_builddir}/%{name}.v%{version}/* %{buildroot}%{_path}
echo "-------------------"
echo "install start***"
echo "-------------------"
# 需要被打包的文件和目录。决定了最后源码安装的路径
%files
#指定包装文件的属性,分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755
%defattr(755, root, root)
%config(noreplace)
%{_path}/AppRun
%{_path}/demo_pro
%{_path}/default.desktop
%{_path}/default.png
%{_path}/lib
%{_path}/plugins
%{_path}/readme.md
%{_path}/translations
%post
##安装后执行的脚本//安装之后需要执行的动作
if [ ! -d /usr/share/certsforsrv ] ; then
mkdir /usr/share/certsforsrv
fi
if [ ! -d /usr/share/certsforsrv/device ] ; then
mkdir /usr/share/certsforsrv/device
fi
# 测试阶段
%check
%postun
#卸载后
if [ $1 -eq 0 ] ; then
if [ -d /opt/demo_pro ]; then
rm -rf %{_path}/AppRun
rm -rf %{_path}/demo_pro
rm -rf %{_path}/default.desktop
rm -rf %{_path}/default.png
rm -rf %{_path}/lib
rm -rf %{_path}/plugins
rm -rf %{_path}/readme.md
rm -rf %{_path}/translations
fi
echo "---------remove successful----------"
fi
%clean
rm -rf ${buildroot}
rm -rf ${builddir}/%{name}.v%{version}
%changelog
打包宏命令代表的目录
https://blog.csdn.net/get_set/article/details/53453320
rpm 打包
rpm -ba xxx.spec
rpm 安装
rpm -ivh 包名 --force --nodeps
查询已经安装的所有包
rpm -qa
查询指定的包是否已经安装
rpm -q
查看打的rpm 包中的内容
rpm -qpl certificatetool-1.3.0-4.el7.src.rpm
rpm -qpl
rpm 操作查看指南
https://www.cnblogs.com/xzongblogs/p/14617456.html
检查sepc文件语法
rpmlint rpmbuild/SPECS/mypackage.spec
参考:
https://www.aikaiyuan.com/11357.html
https://blog.csdn.net/SunshineTan/article/details/121508689
总结
以上是在centos 7 下,qt 开发,打包发布的流程,仅供参考。