1 虚拟机安装
CentOS7.6x64的VMware虚拟机安装中,在软件选择->基本环境中,选择“GNOME桌面”,不勾选其它任何额外组件,则能很大程度避免GCC版本和Qt版本太旧难以卸载和替换带来的麻烦(GNOME桌面类型的基本环境中不存在完整的GCC和Qt版本)。
2 GCC升级(gcc4.8.5->gcc 9.3)
Qt官方的平台支持中,对Qt5.13 Red Hat Enterprise Linux 7.x要求GCC 5.3.1(通过devtoolset-4)。然而目前devtoolset-4源已经没有了,直接7起步。
CentOS 7官方源的gcc最新版本是4.8.5,发布于2015年,年代久远且不支持c++14。 要编译c++14及以上项目,必须要升级现有版本或者安装高版本的gcc。
解决办法有两种:手动编译(也可以从其他机器拷贝或者网上下载),或从源安装。
大多数情况下不推荐从源码编译,不仅因为编译过程中常会出现各种依赖问题需要手动解决,更因为件升级还要再来一次,相当的折腾(单核编译gcc至少一小时,费时费精力)。
本文介绍从源安装高版本gcc的办法。
红帽其实已经编译好了高版本的gcc,但未更新到base和epel这两个常用源中,而是将这些版本放在scl中。
2.1.1 安装gcc9
首先安装scl:
#yum -y install centos-release-scl
如果你之前用过grouplist/install等命令,应该知道gcc包含在Development Tools这个组中。scl中的gcc/g++软件包的前缀都是devtoolset。
scl中devtoolset与 gcc版本对应关系如下:
devtoolset-3: gcc 4.9
devtoolset-4: gcc 5
devtoolset-6: gcc 6
devtoolset-7: gcc 7
devtoolset-8: gcc 8
现在版本9也有了,此处安装devtoolset-9
#yum -y install devtoolset-9
On RHEL, enable RHSCL repository for you system:
#yum-config-manager --enable rhel-server-rhscl-9-rpms
#scl enable devtoolset-9 bash
值得说明的是这些软件包可以同时安装,不会相互覆盖和冲突,也不会覆盖系统的版本。即可以在系统中可同时存在gcc 6, gcc 7, gcc 8等多个版本。
因为不会覆盖系统默认的gcc,使用这些软件的方法有四种:
- 使用绝对路径;
- 添加可执行文件路径到PATH环境变量;
- 使用官方推荐的加载命令:scl enable devtoolset-x bash, x为要启用的版本;
- 执行安装软件自带的脚本: source /opt/rh/devtoolset-x/enable,x为要启用的版本。
实践推荐使用最后两种方式。例如启用gcc 6: source /opt/rh/devtoolset-6/enable,接着输入gcc -v查看版本已经变成gcc 6.3.1。如果希望长期使用某个高版本,可将此命令写入.bashrc等配置文件。
需要注意的是scl命令启用只是临时的,退出shell或重启就会恢复原系统gcc版本。
如果要长期使用gcc 9.3的话:
#echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
#source /etc/profile
升级完成后一定要运行:gcc –version、 g++ –version看一下版本号变成升级后的gcc、g++版本才算升级成功。
尽管初始没有低版本GCC,但是安装devtoolset-9时,仍会作为依赖安装GCC4.8.5到/usr/bin等目录下。
3 MySQL安装
在CentOS中默认安装有MariaDB或其部分组件,这个是MySQL的分支,但为了需要,还是要在系统中安装MySQL。
3.1 下载并安装MySQL官方的 Yum Repository
3.1.1 安装
卸载MariaDB(查询出其安装软件,逐个卸载, 因为内部依赖的原因,需要用rpm忽略依赖强制卸载)
#rpm -qa | grep mariadb
#rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64
#wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
使用上面的命令就直接下载了安装用的Yum Repository,然后就可以直接yum安装了。
(/etc/yum.repos.d目录下多出mysql-community.repo、mysql-community-source.repo)
#yum -y install mysql57-community-release-el7-10.noarch.rpm
安装mysql mysql-community-server
#yum -y install mysql-community-server
安装mysql-community-devel
#yum install mysql-community-devel.x86_64
因为安装了Yum Repository,以后每次yum操作都会自动更新,需要把这个卸载掉
#yum -y remove mysql57-community-release-el7-10.noarch
rpm查询到安装的mysql包:
[root@localhost g5]# rpm -qa | grep mysql
mysql-community-libs-5.7.35-1.el7.x86_64
mysql-community-server-5.7.35-1.el7.x86_64
mysql-community-common-5.7.35-1.el7.x86_64
mysql-community-devel-5.7.35-1.el7.x86_64
mysql-community-client-5.7.35-1.el7.x86_64
3.1.2 设置
启动MySQL
# systemctl start mysqld.service
查看运行状态
# systemctl status mysqld.service
找出此时root用户的初始密码,通过如下命令可以在日志文件中找出密码:
# grep "password" /var/log/mysqld.log
进入数据库:
# mysql -uroot -p
输入初始密码
MySQL默认必须修改密码之后才能操作数据库:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
报错:
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
原因是因为MySQL有密码设置的规范,具体是与validate_password_policy的值有关:
mysql> set global validate_password_policy=LOW;
mysql> set global validate_password_length=1;
mysql> set global validate_password_check_user_name=OFF;
再次设置密码:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
成功!
3.1.3 远程登录设置
3.1.3.1 Root用户登录数据库
授权任意IP以root用户登录
> grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
重载授权表:
> flush privileges;
3.1.3.2 开放3306端口
# firewall-cmd --zone=public --add-port=3306/tcp --permanent
# firewall-cmd --reload
# firewall-cmd --list-ports
4 Qt
Qt在Linux系统里的安装要稍微复杂一些,因为Linux发行版众多,所以安装过程有些差异。 由于Linux系统都可以自行安装 GNU 工具集(对应Windows系统里的MinGW), 所以Qt在Linux系统里的安装包没有自带g++等编译生成工具以及OpenGL开发库, 需要根据不同的Linux发行版提前装好GNU 工具集和OpenGL开发库。Qt官方网站有介绍在Linux下安装的页面:
http://doc.qt.io/qt-5/linux.html
下载地址
https://download.qt.io/archive/qt/5.13/5.13.1/。
4.1 安装前准备工作
对于Linux系统,Qt官方的安装包总是假定C++编译器compiler、调试器debugger、生成器make以及其他开发工具 由该操作系统自己提供,另外构建Qt图形界面程序还需要OpenGL库文件(扩展名为 .a 和 .so)和头文件(扩展名为 .h), OpenGL的开发库也是需要操作系统自己提供。所以在安装Qt官方run文件之前,必须先安装好Linux系统自己软件源里面 的GNU开发工具集和OpenGL开发库。下面针对三类 Linux 操作系统安装相应的GNU开发工具集和OpenGL开发库, 请注意安装软件都需要root权限,并且要联网安装。
(1)如果是 Debian/Ubuntu/Deepin (apt-get) 系列操作系统,执行命令:
#sudo apt-get install build-essential libgl1-mesa-dev
(2)如果是 Fedora/RHEL/CentOS (yum) 系列操作系统,执行命令:
#yum groupinstall "C Development Tools and Libraries"
#yum install mesa-libGL-devel
尽管是Qt官方推荐的方法,但是yum groupinstall "C Development Tools and Libraries"报了找不到的错,所以没有安装,而yum groupinstall "Development Tools"尽管可以下载安装,但是版本看起来过于老旧,还不如前面的devtoolset,所以不下载安装,最后实际只执行yum install mesa-libGL-devel一句即可。
(3)如果是 openSUSE (zypper) 系列操作系统,执行命令:
#sudo zypper install -t pattern devel_basis
根据不同的操作系统执行相应的命令,完成安装后就可以继续下面的安装了。
XShell上传qt-opensource-linux-x64-5.13.1.run到CentOS中,赋予执行权限
#chmod +x qt-opensource-linux-x64-5.13.1.run
4.2 安装
图形界面下,双击qt-opensource-linux-x64-5.13.1.run,以图形化方式安装(需要登录Qt账号),安装目录用默认目录(/opt/Qt5.13.1),组件除Android外都选,安装。
Qt 开发环境安装时会创建一个 Qt Creator 快捷方式文件,然后会呈现在 Linux 的开始菜单里面, 打开“开始菜单”–>“应用程序”–>“开发”–>“集成环境”–>“The IDE of choice for Qt development.”, 可以看到 Qt 的图标。
以后点击该工具就可以进行Qt开发了。该图标对应的快捷方式文件位于:用户主文件夹/.local/share/applications/, (.local是隐藏文件夹,默认看不到,KDE 文件管理器里按快捷键 Ctrl + . ,即 Ctrl 和点号,对于 GNOME 文件管理器里按快捷键 Ctrl + H,就可以切换是否显示隐藏文件) 快捷方式文件名是 DigiaQt-qtcreator-community.desktop (路径为/root/.local/share/applications)。
为方便使用 Qt Creator,可以右击复制该文件,然后粘贴到桌面文件夹或者主文件夹里使用, 点击该快捷方式文件就会打开 Qt Creator 工具。
4.2.1 ldconfig配置
目录/etc/ld.so.conf.d/下,新建qt5.13.1-x86_64.conf,内容:
/opt/Qt5.13.1/5.13.1/gcc_64/lib
/opt/Qt5.13.1/Tools/QtCreator/lib
执行ldconfig 刷新动态库缓存(通过ld.so.conf文件刷新)。
#ldconfig
看效果
#ldconfig -p
4.2.2 PATH环境变量配置
还是配当前登录用户的环境变量比较好(换个用户是找不到安装的Qt的)。
NOTE:环境变量可以简单的分成用户自定义的环境变量以及系统级别的环境变量。
- 用户级别环境变量定义文件:~/.bashrc、~/.profile(部分系统为:~/.bash_profile)
- 系统级别环境变量定义文件:/etc/bashrc、/etc/profile(部分系统为:/etc/bash_profile)、/etc/environment
另外在用户环境变量中,系统会首先读取~/.bash_profile(或者~/.profile)文件,如果没有该文件则读取~/.bash_login,根据这些文件中内容再去读取~/.bashrc。
Linux加载环境变量的顺序如下:
-
/etc/environment
-
/etc/profile
-
/etc/bash.bashrc
-
/etc/profile.d/test.sh
-
~/.profile
-
~/.bashrc
#vim ~/.bashrc
在~/.bashrc(登录与非登录shell都能生效)末尾添加:
export PATH=/opt/Qt5.13.1/5.13.1/gcc_64/bin:/opt/Qt5.13.1/Tools/QtCreator/bin:$PATH
export LD_LIBRARY_PATH=/opt/Qt5.13.1/5.13.1/gcc_64/lib:$LD_LIBRARY_PATH
export QT_PLUGIN_PATH=/opt/Qt5.13.1/5.13.1/gcc_64/plugins:$QT_PLUGIN_PATH
export QML2_IMPORT_PATH=/opt/Qt5.13.1/5.13.1/gcc_64/qml:$QML2_IMPORT_PATH
生效
#source ~/.bash_profile
5 Qt MySQL驱动
5.1 打开Qt源码中的MySQL驱动工程
Qt Creator打开/opt/Qt5.13.1/Src/qtbase/src/plugins/sqldrivers/mysql的mysql.pro工程;
5.2 工程配置
项目->构建设置,Debug、Release模式下均选择不勾选Shadow build;
5.3 修改mysql.pro文件
TARGET = qsqlmysql
HEADERS += $$PWD/qsql_mysql_p.h
SOURCES += $$PWD/qsql_mysql.cpp $$PWD/main.cpp
#QMAKE_USE += mysql#注释
OTHER_FILES += mysql.json
PLUGIN_CLASS_NAME = QMYSQLDriverPlugin
#添加
LIBS += /usr/lib64/mysql/libmysqlclient.so
INCLUDEPATH += /usr/include/mysql
include(../qsqldriverbase.pri)
5.4 依赖的上一级qsqldriverbase.pri修改
QT = core core-private sql-private
# For QMAKE_USE in the parent projects.
#include($$shadowed($$PWD)/qtsqldrivers-config.pri) #注释
PLUGIN_TYPE = sqldrivers
load(qt_plugin)
DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII
5.5 Compiler配置
工具->Kits->构建套件->Compiler C、C++均切换到/opt目录下
5.6 Release构建
项目->构建设置Release模式,执行qmake->构建,成功!
5.7 Debug构建
项目->构建设置Debug模式,修改mysql.pro首行为TARGET = qsqlmysqld,执行qmake->构建,成功!
5.8 查看生成驱动库
目录/opt/Qt5.13.1/5.13.1/Src/qtbase/src/plugins/sqldrivers/plugins/sqldrivers下生成驱动库文件。
[root@localhost sqldrivers]# ll
总用量 2216
-rwxr-xr-x. 1 root root 157304 8月 24 14:29 libqsqlmysqld.so
-rw-r--r--. 1 root root 974304 8月 24 14:29 libqsqlmysqld.so.debug
-rwxr-xr-x. 1 root root 157304 8月 24 14:24 libqsqlmysql.so
-rw-r--r--. 1 root root 974304 8月 24 14:24 libqsqlmysql.so.debug
5.9 拷贝
将这4个文件拷贝到/opt/Qt5.13.1/5.13.1/gcc_64/plugins/sqldrivers中即可。
5.10 注意
如果没有升级GCC、G++,会报错g++: error: unrecognized command line option ‘-Wdate-time’(MySQL需要高版本的GCC和G++)。
6 Linux下Qt开发的打包方式
目前有3种方法提供:
6.1 linuxdeployqt
GitHub有提供类似windeployqt的工具,但是功能较弱(采用https://github.com/probonopd/linuxdeployqt/releases的Release build (7)的Release或者源码编译,结合patchself工具https://nixos.org/releases/patchelf/patchelf-0.9/patchelf-0.9.tar.gz,可以启动打包)。
6.1.1 安装配置
#sudo mv linuxdeployqt-continuous-x86_64.AppImage linuxdeployqt
#sudo mv ./linuxdeployqt /usr/local/bin
#chmod 777 linuxdeployqt
#sudo linuxdelpoyqt --version
linuxdeployqt 6 (commit d41e234), build 724 built on 2020-07-31 15:51:47 UTC
显示版本表示安装成功。
进入patchelf解压的文件夹后执行如下命令
#./configure
#make
#sudo make install
进入/usr/local/bin目录,执行ls命令出现
linuxdeployqt patchelf
表示配置成功。
6.1.2 程序打包一般流程
将即将打包的程序的执行文件放进可执行文件所在文件夹内
然后进入该目录执行如下命令
#linuxdeployqt MysqlConnectionTest –appimage
貌似会报点错,不过好像不要紧。
目录下的AppRun可以启动程序,成功!
对于除了依赖Qt的库和插件,还依赖第三方动态库的场景,则需要额外的步骤,才能打包成功。步骤如下:
-
用lddconfig查询可执行文件的软链接,显示“not found”的是需要的动态库/动态库软链接
-
对于需要动态库软链接的,手工拷贝第三方库文件(实际文件,非软链接)到打包目录,逐个创建软链接,命令形如
#ln -s dllfile dllfilelink
-
linuxdeployqt默认没有把当前可执行目录作为LD_LIBRARY_PATH的一部分,所以需要命令行将当前目录加入LD_LIBRARY_PATH中
#export LD_LIBRARY_PATH=/home/gggg/:$LD_LIBRARY_PATH
-
调用linuxdeployqt打包命令
#linuxdeployqt MysqlConnectionTest –appimage
-
此时生成桌面快捷方式文件default.desktop、默认图标default.png、程序软链接AppRun、动态库目录lib、Qt插件目录plugins,需要将打包目录下的所有第三方动态库剪切到lib目录下
-
命令行调用AppRun或鼠标双击即可启动程序。
除了手工解决外,还有脚本方式解决第三方动态库的查找拷贝问题,如下:
-
工程的工作目录下创建脚本copylib.sh,内容如下(内容无需修改)
#!/bin/sh bin=$1 #发布的程序名称 desDir="./lib" #lib文件夹 if [ ! -d $desDir ];then #echo "makedir $desDir" mkdir $desDir fi libList=$(ldd $bin | awk '{if (match($3,"/")){ printf("%s "),$3 } }') cp $libList $desDir
-
赋予权限后,命令运行
chmod a+x ./copylib.sh ./copylib.sh ./myapp
-
即可从lib目录中复制所需的库到打包目录下的lib目录中。
6.1.3 注意
使用linuxdeployqt会更改可执行文件,如有顾虑,则不要使用。
6.2 linuxdeploy
linuxdeploy号称源于linuxdeployqt,但是更严格好用,且提供了多种输入输出插件机制,但是目前除了官方资料,几乎找不到有开发人员实际使用的,所以暂不使用。
首页
https://github.com/linuxdeploy/linuxdeploy
插件机制
https://github.com/linuxdeploy/awesome-linuxdeploy#linuxdeploy-plugins
插件系统
https://github.com/linuxdeploy/linuxdeploy/wiki/Plugin-system#plugin-discovery
Qt插件
https://github.com/linuxdeploy/linuxdeploy-plugin-qt
用户指南
https://docs.appimage.org/packaging-guide/from-source/linuxdeploy-user-guide.html
原生二进制文件打包
https://docs.appimage.org/packaging-guide/from-source/native-binaries.html
6.3 脚本方式
脚本方式直接依赖人工的判断,且对Qt插件库的打包缺乏,但是不会更改可执行文件。步骤如下:
-
将可执行文件拷贝到打包目录下
-
打包目录下新建打包脚本文件(例如名为AppDeploy.sh),内容如下
#!/bin/sh exe="MysqlConnectionTest"#存放你的可执行文件的名字 des="/home/gggg/MysqlConnectionTest/"#可执行文件的路径 deplist=$(ldd $exe | awk '{if(match($3,"/")){printf("%s "),$3}}') cp $deplist $des
-
为打包脚本赋予执行权限
#chmod +x AppDeploy.sh
-
执行打包脚本
#./AppDeploy.sh
-
该脚本能找到可执行文件依赖的第一层次的系统库和加入环境变量的库(包括Qt库),自动将其拷贝到打包目录,但对于一些第三方库(及解决方案中生成的库),则没有做处理,需要进行检查
#ldd MysqlConnectionTest
-
会列出各依赖库,对于箭头指向为空(“not found”)的需要人工拷贝过来,对于多级软链接,需要将各级软链接均拷贝过来,用ll命令检查软链接是否失效,如果失效,需要重建软链接,完成后,重复步骤5,直至依赖库均能找到。
-
由于Linux默认不识别可执行文件同级目录为库目录的一部分,必须通过脚本启动该可执行文件,打包目录下建立与可执行文件同名的.sh脚本文件(注意:必须同名!),内容如下(官方推荐,内容不需要改):
#!/bin/sh appname=`basename $0 | sed s,\.sh$,,` dirname=`dirname $0` tmp="${dirname#?}" if [ "${dirname%$tmp}" != "/" ]; then dirname=$PWD/$dirname fi LD_LIBRARY_PATH=$dirname export LD_LIBRARY_PATH $dirname/$appname "$@"
-
赋予执行权限
#chmod +x 可执行文件名.sh
-
通过启动脚本即可启动该程序
#./可执行文件名.sh
-
复制打包目录到其它相同操作系统的主机上可以直接以启动脚本启动。
-
另有其它的开机脚本形式,如下所示(脚本里面可执行文件名字写对即可,脚本文件名不强制要求)
#!/bin/bash export LD_LIBRARY_PATH=/app/lib:$LD_LIBRARY_PATH export QT_PLUGIN_PATH=/app/plugins:$QT_PLUGIN_PATH export QML2_IMPORT_PATH=/app/qml:$QML2_IMPORT_PATH ./MysqlConnectionTest
6.4 额外的应用程序图标配置
对于打包目录下的default.desktop,如需使用修改其中的:
Name值为可执行文件名,
Exec为可执行文件的绝对路径名,
Icon为图标的绝对路径,
Terminal为终端启动开关
default.desktop改名后拷贝
全局安装(所有用户可用),将xxx.desktop 复制到/usr/share/applications
当前用户可用, 将xxx.desktop 复制到 ~/.local/share/applications
也可拷贝到桌面作为桌面快捷方式
7 参考资料
【1】 CentOS7 yum方式安装MySQL5.7. https://www.cnblogs.com/porotin/p/9045391.html
【2】 Centos7下编译Qt的mysql驱动. http://www.voidcn.com/article/p-cirrynjy-tm.html
【3】 Linux CentOS7 安装 Qt 5.9.2. https://www.cnblogs.com/lsgxeva/p/7688884.html
【4】 Qt for Linux/X11. https://doc.qt.io/qt-5/linux.html
【5】 linux下Qt环境的搭建. https://blog.csdn.net/baidu_24256693/article/details/48198889
【6】 Linux环境变量配置全攻略. https://www.cnblogs.com/niuben/p/14049694.html
【7】 为CentOS 6、7升级gcc至4.8、4.9、5.2、6.3、7.3等高版本. https://www.vpser.net/manage/centos-6-upgrade-gcc.html
【8】 Supported Platforms.https://doc.qt.io/archives/qt-5.13/ supported-platforms.html
【9】 centos 升级gcc. https://www.cnblogs.com/dream397/p/14148796.html
【10】 Developer Toolset 8 by Software Collections. https://www.softwarecollections.org/en/scls/rhscl/devtoolset-8/
【11】 centos7用devtoolset安装gcc7.3.0. https://www.jianshu.com/p/046deadb5cca
【12】 如何卸载Centos自带的一些应用(Qt,和其他应用).https://blog.csdn.net/NEUQ_zxy/article/details/77434684
打包方法
【13】 centos7 linuxdeployqt qt5.13.1 打包程序. https://blog.csdn.net/hu626626/article/details/100918455
【14】 https://github.com/probonopd/linuxdeployqt/releases
【15】 超详细Linux下QT使用appimage打包程序. https://www.pianshen.com/article/912312212/
【16】 linux下的QT打包方法. https://www.cnblogs.com/xupeidong/p/9395193.html
【17】 Qt官方打包方法.https://doc.qt.io/qt-5/linux-deployment.html
【18】 Linux下Qt程序的打包发布.https://blog.csdn.net/hjl_1991/article/details/50365927
【19】 Linux 下qt 程序打包发布(使用linuxdelpoyqt ,shell 脚本).https://blog.csdn.net/u014746574/article/details/79288727