Qt源码交叉编译带openssl的Qt版本

一.背景

近期项目由于对接的后台服务是https的,之前交叉编译的Qt是不带openssl的,为了能支持https,必须要重新编译Qt。

二.环境

环境准备:

Ubuntu版本 :18.04;

openssl 版本:1.1.1.g;

Qt版本:5.15.10

交叉编译链:aarch64-none-linux-gnu-gcc
openssl1.1.1g源码包下载地址
Qt5.15.10源码包下载地址

三.交叉编译

1.交叉编译Openssl库

因为Qt的编译要依赖openssl,所以要先交叉编译openssl,编译方法参见文章:
linux环境交叉编译openssl库,以使Qt支持https

2.交叉编译Qt

openssl安装好之后,先解压Qt的源码包

cpp 复制代码
tar -xvf qt-everywhere-opensource-src-5.15.10.tar.xz

再cd到Qt源码的文件夹中

进入到".../qt-everywhere-src-5.15.10/qtbase/mkspecs/linux-aarch64-gnu-g++"文件夹,用编辑器打开并修改"qmake.conf"文件。

cpp 复制代码
#
# qmake configuration for building with aarch64-linux-gnu-g++
#

MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublib

QT_QPA_DEFAULT_PLATFORM=linuxfb
QMAKE_CFLAGS_RELEASE += -O2 -march=armv8-a -lts
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv8-a -lts

include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)

#openssl
QMAKE_INCDIR += /usr/local/openssl1.1.1g-Arm/include
QMAKE_LIBDIR += /usr/local/openssl1.1.1g-Arm/lib

# modifications to g++.conf
QMAKE_CC                = /opt/gcc-arm-10.3-linux-gnu/bin/aarch64-none-linux-gnu-gcc
QMAKE_CXX               = /opt/gcc-arm-10.3-linux-gnu/bin/aarch64-none-linux-gnu-g++
QMAKE_LINK              = /opt/gcc-arm-10.3-linux-gnu/bin/aarch64-none-linux-gnu-g++
QMAKE_LINK_SHLIB        = /opt/gcc-arm-10.3-linux-gnu/bin/aarch64-none-linux-gnu-g++

# modifications to linux.conf
QMAKE_AR                = /opt/gcc-arm-10.3-linux-gnu/bin/aarch64-none-linux-gnu-ar cqs
QMAKE_OBJCOPY           = /opt/gcc-arm-10.3-linux-gnu/bin/aarch64-none-linux-gnu-objcopy
QMAKE_NM                = /opt/gcc-arm-10.3-linux-gnu/bin/aarch64-none-linux-gnu-nm -P
QMAKE_STRIP             = /opt/gcc-arm-10.3-linux-gnu/bin/aarch64-none-linux-gnu-strip
load(qt_config)

改完如下图:

编写Qt的配置脚本,自己随便命名写一个shell脚本,放在Qt源码包,用来执行Qt配置,如下:

cpp 复制代码
#!/bin/sh 
./configure -prefix /usr/local/Qt_5.15.10-Arm-openssl \
-opensource \
-confirm-license \
-release \
-strip \
-shared \
-openssl-linked \
-no-openssl \
-xplatform linux-aarch64-gnu-g++ \
-optimized-qmake \
--rpath=no \
-pch \
-skip qtandroidextras \
-make libs \
-nomake examples \
-nomake tools \
-nomake tests \
-gui \
-widgets \
-dbus-runtime \
--glib=no \
--iconv=no \
--pcre=qt \
--zlib=qt \
--freetype=qt \
--harfbuzz=qt \
-no-opengl \
-linuxfb \
--xcb=no \
--libpng=qt \
--libjpeg=qt \
--sqlite=qt \
-plugin-sql-sqlite \
-recheck-all

这里要注意下图中的几点说明:

注意:这个sh脚本如果有些配置不对,会在make编译时出现各种错误。比如

就是在shell脚本中将"-openssl-linked\ -no-openssl \"两行改为了"-openssl-linked -I"/usr/local/openssl1.1.1g-Arm/include" \ -L"/usr/local/openssl1.1.1g-Arm/include" \"和"-openssl \"导致报错。

我的脚本是"autoconfigure5.15.10OK.sh",执行shell脚本命令运行,对Qt编译进行配置

cpp 复制代码
sh autoconfigure5.15.10OK.sh

执行脚本后是这样,这说明我由于一些配置和依赖缺少,导致本次编译不能编译3dcore,3drender,webengine等五个模块,并且警告由于sysroot和pkg-config导致QtWebEngine和QtPdf模块不能构建,如果后面要用这两个模块,那么这次编译也是不行的。好在目前暂时用不到,提示配置完成就先make。

配置完成后,执行make编译(权限不够就用sudo )

cpp 复制代码
sudo make -j4

编译完成后,实行安装命令

cpp 复制代码
sudo make install

编译和安装都需要挺久时间,等安装完成后,将新的Qt配置到QtCreator上,配置方法参见文章
Ubuntu中完成Linux环境Qt源码交叉编译并配置Qt环境

配置好之后,进行验证

在代码任意可以执行的地方加上这段进行验证

cpp 复制代码
//.pro文件加上
QT += network
//任意可执行的代码中加上
include <QSslSocket>
//查看需要的openssl版本
QString strVersion = "QSslSocket="<<QSslSocket::sslLibraryBuildVersionString();
 //查看是否支持
bool bExist = (QSslSocket::supportsSsl() == true ? "true" : "false");
相关推荐
用余生去守护18 分钟前
python报错系列(16)--pyinstaller ????????
开发语言·python
数据小爬虫@23 分钟前
利用Python爬虫快速获取商品历史价格信息
开发语言·爬虫·python
向宇it25 分钟前
【从零开始入门unity游戏开发之——C#篇25】C#面向对象动态多态——virtual、override 和 base 关键字、抽象类和抽象方法
java·开发语言·unity·c#·游戏引擎
莫名其妙小饼干42 分钟前
网上球鞋竞拍系统|Java|SSM|VUE| 前后端分离
java·开发语言·maven·mssql
梦想平凡1 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle
十年一梦实验室1 小时前
【C++】sophus : sim_details.hpp 实现了矩阵函数 W、其导数,以及其逆 (十七)
开发语言·c++·线性代数·矩阵
TianyaOAO1 小时前
mysql的事务控制和数据库的备份和恢复
数据库·mysql
最爱番茄味1 小时前
Python实例之函数基础打卡篇
开发语言·python
Ewen Seong1 小时前
mysql系列5—Innodb的缓存
数据库·mysql·缓存
Oneforlove_twoforjob2 小时前
【Java基础面试题033】Java泛型的作用是什么?
java·开发语言