1. 简介、概述(操作须知)
首先我们需要知道centos 6 已经在2020.11.30停止维护、centos7在2024年6月30日停止维护、centos8也是在2021年12月31日停止了维护,官方不在支持维护这意味着yum相关源无法使用。更换yum源的问题我这里不在展开,csdn中也有许多大佬提出方法。
但是许多体量较大的公司依旧还是在使用centos系统作为服务器。所以我们在centos中使用qt以及打包部署等需求依旧还是存在的,这也是这篇博客的由来。
1.1 Qt打包后兼容性问题
写前面:如果Qt程序在高版本系统中打包那么只能在更高版本中打开(已经踩过的坑希望大家不要再踩了)
因为需要部署的系统是centos7,所以这里选择centos7进行打包Qt,不过还需要注意一点,因为我的Qt版本为5.14.2,需要c++11以上的环境支持。然而centos7的默认gcc版本为4.8.5(如果大家使用yum install gcc,这种命令行安装,大家就会看到是4.8.5版本的),gcc4.8.5版本的无法支持Qt5.14.2。我这里选择自己手段编译gcc7.5.0版本(但是生产环境一般不更新gcc,其他基于gcc的软件可能会有问题,所以才会有docker的方案)。
1.2 打包工具(linuxdeployqt)
相信大家在windows系统中打包时都有用到windeployqt(安装qt时自带),在linux中安装qt时并没有带打包工具,所以需要自己下载。
1.3 博客由来
本篇博客的由来是因为在Windows中开发的Qt程序需要在Linux系统中使用,Qt作为跨平台框架,支持Windows、Linux和Mac系统。因此,我们将讨论如何将在Windows开发的Qt程序移植到Linux系统中进行打包部署的过程。
2. centos7中安装Qt
Qt Downloads:自行前往安装下载。
我安装几次Qt,貌似是低版本的安装器是这样的,高版本的安装器更酷炫一些选择和功能也更多一些,这里就不在赘述。
大家可以使用命令行打开这个在后面添加镜像,到后面安装时会快很多。
.\<安装工具> --mirror https://mirrors.ustc.edu.cn/qtproject
点击Next;
勾上,下一步;
这里没账号的可以自己注册一个(听别人说不好注册)我自己注册的时候挺好注册的,这里就不讲了大家自己解决一下。
Next;
大家自行调整这个路径。
下一步;
如果大家纠结就全选就完事儿了。
大家耐心等待安装,如果没有用镜像的会比较久一些。
安装完成之后,大家找到该目录,
在目录下输入:
sudo ./qtcreater
或者:
./qtcreater
打开之后大家如果可以顺利运行自己的项目那就恭喜大家,如果困难重重,那么也要恭喜你,因为你经历过了。。。
大家大概率会遇到一些大小写问题,按照报错的提示修改一般都可以修改好的。
但是如果大家像我这里这样:
就可能比较麻烦(但是也不一定)
3. centos7中更新gcc
我在csdn中看到可以修改pro文件,在pro文件中添加一行就可以
QMAKE_CXXFLAGS += -std=c++11
但是实际上,如果你的编译套件达不到支持c++11的话,加了也是没有用的(安装我的理解,如果有大佬比较懂这些,希望可以指出我的问题)。
所以我这里自己编译了更新版本的gcc7.5版本的,我也没有更新很高版本的gcc,因为我上面提到了只能向下兼容,如果你更新了很高版本的gcc,那么你的目标机器需要同等版本的gcc或者更高版本的gcc。
手动编译gcc我这里简单讲下(不会写很细,如果不行就在开一个窗口搜索centos7更新gcc)
wget https://ftp.gnu.org/gnu/gcc/gcc-7.5.0/gcc-7.5.0.tar.gz
如果下载太慢也可以使用win下载在传到linux中。
下载完成之后解压:
tar -xvf gcc-7.5.0.tar.gz
解压后安装编译所需要的库
## 编译常用软件包
yum install -y gcc-c++ libstdc++-static ant cmake byacc flex automake libtool binutils-devel bison ncurses-devel gcc kernel-devel libtool libatomic libcurl-devel texinfo
生成makefile文件准备make
./configure --prefix=/usr/local/gcc-7.5.0 --enable-bootstrap --enable-languages=c,c++ --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib
接下来make:
make -j$(nproc)
这里小做解释:make是构建工具,用于自动化编译和构建软件项目。它读取一个名为 Makefile 的文件,其中包含了编译和构建项目所需的指令和规则。通过运行 make 命令,系统会根据 Makefile 中的规则执行相应的操作。
参数 -j : 可以让make在多个处理器核心上并行执行编译任务,加快整个编译过程的速度。这里的nproc会被替换成系统的处理器核心数,所以如果大家知道自己的电脑有多少个处理器核心就可以将$(nproc)替换成自己的处理器核心数量。例如:
make -j4
make的过程会比较久,大家耐心等待。。。
make完成之后:
make install
可以自己查看gcc的版本啦。
4. 编译套件Kit
接下来大家就可以在qtcreater中编译自己的编译套件了。
工具->选项
没问题的话,那就是没问题了。
5. 开始打包
5.1 编译Reslease版本
运行成功后,大家左下角编译成Reslease版本(和win一样)
大家可以在编译目录中(Reslease),尝试的打开一下自己的运行程序
如果不行,那就是失败了(自己看看是什么原因)。
如果可以正常打开那么恭喜你,成功了一大半了。
接下来我们将可执行程序复制出来单独放在一个文件夹中像这样:
这个就先这样放着,大家先跟我一起去安装工具。
5.2 打包工具linuxdeployqt
大家前往:Releases · probonopd/linuxdeployqt · GitHub
最方便的是直接下载编译好的linuxdeployqt工具
chmod +x linuxdeployqt-continuous-x86_64.AppImage # 赋予可执行权限
mv linuxdeployqt-continuous-x86_64.AppImage linuxdeployqt # 改名以便后面操作
./linuxdelpoyqt -version
5.3 正式开始打包
大家回到5.1那一步在复制出来的可执行文件中打开终端,我这里用finashell(在centos7中截图很模糊)
输入:
linuxdeployqt <你的程序名> -appimage
有问题,大家不要慌,回到系统中,双击打开AppRun,是可以正常打开的。
大家有需要可以修改,default.desktop文件,关于软件的配置参数都在这里。
[Desktop Entry]
Type=Application
Name=这里填应用的名字
Comment=这里描述该程序功能
Exec=这里是可执行文件的路径。仅当可执行文件不在 $PATH 变量中指定的任何路径中时,才必须使用可执行文件的完整路径。例如,路径 /usr/bin 内的任何文件都不需要在 Exec 字段中指定其完整路径,而只需指定其文件名即可,或者在当前路径下也不用。
Icon=这里是应用图标。例如,目录 /usr/share/pixmaps 下的所有图标不需要指定其完整路径,但不需要指定不带扩展名的文件名。例如,如果图标文件是 /usr/share/pixmaps/wallch.png,则图标字段应该只是“wallch”。或者在当前路径下也不用。所有其他图标都应指定其完整路径。
Categories=Application;
打包完成之后大家就可以将这个目录压缩发给别人了。
6. 将打包后的放在docker容器
以上压缩包在目标机中打开很容易有问题。最常见的是glibc版本不支持的问题。
目标机器如果可以升级gcc那么升级gcc,如果目标机器是生产环境,不建议更新gcc。
简单粗暴放到docker容器中,所有问题都可以解决。
创建一个新的docker容器:
docker run -it --name <容器名称> -v /path/to/your/qt/app:/app <指定要使用的docker镜像名称>
# -v /path/to/your/qt/app:/app :将你的qt程序映射到容器中的/app目录
将打包好的Qt应用复制到容器中,注意路径
docker cp /path/to/your/qt/app <容器名称>:/app
进入容器
docker exec -it my_container_name /app/your_app_name
进入:
然后就需要在图形化界面中运行程序啦,在容器中遇到了libc++版本的问题,依旧是更新gcc。将libc++6.0.19替换为7.5版本的libc++6.0.24,做一个软连接就可以啦!
到这里大家没问题的,那就是没问题了。有问题那就是失败了!
如果博客有什么不对的地方,还望大佬指出!!。
如果有什么报错,也可以评论或者私信我!!。