0.前言

本文用于记录在国产操作系统:银河麒麟V10(arm64)上从源码编译Qt5.8.0(Qt5.15.2为踩坑版本)

0.1 编译环境

主机环境:

Qt Version:5.8.0

Openssl Version:1.0.2k

0.2 参考文档

参考博客:https://segmentfault.com/a/1190000040169088

Qt 文档: https://doc.qt.io/qt-5/build-sources.html

​ https://doc.qt.io/qt-5/configure-options.html

1.下载Qt源码

Qt 5.15.2 https://download.qt.io/official_releases/qt/5.15/5.15.2/single/

Qt 5.8.0 https://download.qt.io/new_archive/qt/5.8/5.8.0/

2. 解压源码包

#解压
sudo tar xvf qt-everywhere-opensource-src-5.8.0.tar.xz
#进入源码目录
cd  qt-everywhere-opensource-src-5.8.0

3. 安装编译所依赖的库

3.1 安装基础的编译环境

sudo apt-get build-dep qt5-default
sudo apt-get install libxcb-xinerama0-dev
sudo apt-get install build-essential perl python git

3.2 按需选择安装其他模块依赖

  • Libxcb
sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev  libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev
  • OpenGL
sudo apt-get install build-essential
sudo apt-get install libgl1-mesa-dev
sudo apt-get install libglu1-mesa-dev
sudo apt-get install libegl1-mesa-dev
sudo apt-get install freeglut3-dev
  • Qt WebKit
sudo apt-get install flex bison gperf libicu-dev libxslt-dev ruby
  • Qt WebEngine
sudo apt-get install libssl-dev libxcursor-dev libxcomposite-dev  libxdamage-dev libxrandr-dev libdbus-1-dev libfontconfig1-dev libcap-dev libxtst-dev libpulse-dev libudev-dev libpci-dev libnss3-dev  libasound2-dev libxss-dev libegl1-mesa-dev gperf bison
  • Qt Multimedia
sudo apt-get install libasound2-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev
  • QDoc Documentation Generator Tool
sudo apt install libclang-6.0-dev llvm-6.0

4. 配置编译参数使用影子构建

参考博客:Linux 下 qt5的安装及库编译、qt5的configure选项说明

4.1 configure参数说明

./configure:执行 Qt 的配置脚本。
-confirm-license:自动确认许可
-prefix:指定 Qt 库的安装路径。
-opensource:指定使用开源协议编译 Qt 库。
-openssl-linked:开启该选项将 OpenSSL 链接到 Qt 应用程序中
-I:指定 OpenSSL 头文件的搜索路径。
-L:指定 OpenSSL 库的搜索路径。
-nomake tests:不编译 Qt 库自带的测试程序。
-nomake examples:不编译 Qt 库自带的示例程序。
-recheck-all:重新检查所有依赖项。

4.2 构建

官方建议新建一个build目录,然后在该目录下配置configure,make之类的,这样子配置编译生成的临时文件会放在该目录下,而不会污染源码。

#创建构建目录
mkdir build-5.8.0
#进入构建目录
cd build
#执行构建命令
OPENSSL_LIBS='-L/usr/local/openssl/lib -lssl -lcrypto -ldl' ../qt-everywhere-opensource-src-5.8.0/configure -confirm-license -prefix /opt/qt-5.8.0  -opensource -openssl-linked -I /usr/local/openssl/include -L /usr/local/openssl/lib -nomake tests -nomake examples -skip qtwebengine -recheck-all

5. 编译

5.1 make

sudo make -j4

5.2 make install

sudo make install

在编译完成后执行 make install 会将qt库安装到 -prefix 指定的目录下。

5.3 make clean 清除配置

可以使用make clean 清楚编译

5.4 make uninstall 卸载安装

使用make uninstall来卸载安装

Qt 5 环境变量

查看版本信息

# 进入qmake所在目录
cd /opt/qt-5.8.0/bin
# 查看版本信息
./qmake -v

设置环境变量
打开终端输入以下代码

vim ~/.bashrc

在最后一行加入以下代码

export QTDIR=/opt/qt-5.8.0
export PATH=$QTDIR/bin:$PATH
export MANPATH=$QTDIR/man:$MANPATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

保存退出重启电脑
打开终端输入

qmake -v

成功显示版本号安装完成

原文链接:https://blog.csdn.net/liangjian990709/article/details/111494494

常见问题

报错 Could not find qmake spec ‘’

原因:目录有中文

解决办法:将源码文件夹放在没有中文的路径

Qt5 opensll配置

报错

/home/yh/work/code/Silversea/3rdparty/shftp/shftp/dataconnection.cpp:52: 错误: invalid use of incomplete type ‘class QSslSocket’socket = new QSslSocket(this);^

解决

QSslSocket报错,因为相同代码在不同编译器上报错,排查是不是当前系统环境配置问题

经过对比发现,应该是源码编译时没有开启openssl的支持。

运行 configure 脚本,指定 OpenSSL 库的路径和头文件路径,同时开启 Qt Network -> OpenSSL 选项。例如:

mkdir build-qt5.8.0
cd build-qt5.8.0
../qt-everywhere-opensource-src-5.8.0/configure -prefix /opt/qt-5.8.0  -opensource -openssl-linked -I /usr/local/openssl/include -L /usr/local/openssl/lib -nomake tests -nomake examples -skip qtwebengine -recheck-all

make: *** [module-qtbase-make_first] Error 2

报错信息

核心问题是libcrypto.a中找不到一系列的符号:dlopen、dlsym等

Erratum 843419 found and fixed at ".obj/qnetworkreplyhttpimpl.o", section 66, offset 0x00004bb0.
Erratum 843419 found and fixed at ".obj/qsslcertificate.o", section 10, offset 0x00000f90.
Erratum 843419 found and fixed at ".obj/qnetworkreplyhttpimpl.o", section 66, offset 0x00004bb0.
Erratum 843419 found and fixed at ".obj/qsslcertificate.o", section 10, offset 0x00000f90.
/usr/local/openssl/lib/libcrypto.a(dso_dlfcn.o):dso_dlfcn.c:function dlfcn_globallookup: error: undefined reference to 'dlopen'
/usr/local/openssl/lib/libcrypto.a(dso_dlfcn.o):dso_dlfcn.c:function dlfcn_globallookup: error: undefined reference to 'dlsym'
/usr/local/openssl/lib/libcrypto.a(dso_dlfcn.o):dso_dlfcn.c:function dlfcn_globallookup: error: undefined reference to 'dlclose'
/usr/local/openssl/lib/libcrypto.a(dso_dlfcn.o):dso_dlfcn.c:function dlfcn_bind_func: error: undefined reference to 'dlsym'
/usr/local/openssl/lib/libcrypto.a(dso_dlfcn.o):dso_dlfcn.c:function dlfcn_bind_func: error: undefined reference to 'dlerror'
/usr/local/openssl/lib/libcrypto.a(dso_dlfcn.o):dso_dlfcn.c:function dlfcn_bind_var: error: undefined reference to 'dlsym'
/usr/local/openssl/lib/libcrypto.a(dso_dlfcn.o):dso_dlfcn.c:function dlfcn_bind_var: error: undefined reference to 'dlerror'
/usr/local/openssl/lib/libcrypto.a(dso_dlfcn.o):dso_dlfcn.c:function dlfcn_load: error: undefined reference to 'dlopen'
/usr/local/openssl/lib/libcrypto.a(dso_dlfcn.o):dso_dlfcn.c:function dlfcn_load: error: undefined reference to 'dlclose'
/usr/local/openssl/lib/libcrypto.a(dso_dlfcn.o):dso_dlfcn.c:function dlfcn_load: error: undefined reference to 'dlerror'
/usr/local/openssl/lib/libcrypto.a(dso_dlfcn.o):dso_dlfcn.c:function dlfcn_pathbyaddr: error: undefined reference to 'dladdr'
/usr/local/openssl/lib/libcrypto.a(dso_dlfcn.o):dso_dlfcn.c:function dlfcn_pathbyaddr: error: undefined reference to 'dlerror'
/usr/local/openssl/lib/libcrypto.a(dso_dlfcn.o):dso_dlfcn.c:function dlfcn_unload: error: undefined reference to 'dlclose'
collect2: error: ld returned 1 exit status
Makefile:551: recipe for target '../../lib/libQt5Network.so.5.8.0' failed
make[3]: *** [../../lib/libQt5Network.so.5.8.0] Error 1
make[3]: Leaving directory '/home/yh/work/qt/build5.8/qtbase/src/network'
Makefile:190: recipe for target 'sub-network-make_first' failed
make[2]: *** [sub-network-make_first] Error 2
make[2]: Leaving directory '/home/yh/work/qt/build5.8/qtbase/src'
Makefile:46: recipe for target 'sub-src-make_first' failed
make[1]: *** [sub-src-make_first] Error 2
make[1]: Leaving directory '/home/yh/work/qt/build5.8/qtbase'
Makefile:78: recipe for target 'module-qtbase-make_first' failed
make: *** [module-qtbase-make_first] Error 2

解决办法

在configure构建的时候,openssl编译命令填上 -ldl

#之前的
OPENSSL_LIBS='-L/usr/local/openssl/lib -lssl -lcrypto'
#修改后
OPENSSL_LIBS='-L/usr/local/openssl/lib -lssl -lcrypto -ldl'

参考链接:
https://stackoverflow.com/questions/956640/linux-c-error-undefined-reference-to-dlopen

https://blog.csdn.net/itjobtxq/article/details/51538239

银河麒麟V10(arm64) 源码编译Qt5.8.0相关推荐

  1. 银河麒麟V10系统+飞腾CPU编译安装Qt-5.15.2

    银河麒麟V10系统+飞腾CPU编译安装Qt-5.15.2 一.准备工作 1.下载qt源码包 下载网址:https://download.qt.io/archive/qt/ 在任意空闲位置新建文件夹,并 ...

  2. php 7.0 编译安装mysql_源码编译安装php7.0.5

    源码编译安装php7.0.5 源码包下载地址 安装epel扩展yum源 [root@xuegod63 ~]# yum clean all [root@xuegod63 ~]# yum list 注:R ...

  3. 07-PDI(Kettle)源码编译8.2.0.0.R版本

    文章目录 07-PDI(Kettle)源码编译8.2.0.0.R版本 1.安装PDI8.2.0.0.R的parent工程到本地 1.1配置Maven的settings.xml文件 1.2安装PDI源码 ...

  4. android源码编译烧鸡,android4.0源码下载 编译 系统体验~图解

    近来着眼于ANDROID4.0的关注与研究,第一时间把ANDROID4.0源码下 下来了,只是时间问题,所以没能第一时间把过程记录下来,今天算是富裕点时间就给写下来,希望能给灼热于ANDROID继续平 ...

  5. CentOS7 源码编译安装MySQL8.0.15 shell脚本

    使用MySQL8无需像MySQL5那样需要Boost依赖,和经过35-55分钟的等待编译完成,直接解压即可使用,方便快捷! 1,环境: 操作系统   CentOS Linux release 7.6. ...

  6. ARM环境下centos 7源码编译安装ceph-v14.0.1教程(待修改)

    一.环境介绍 IP hostname IOS   10.2.152.131 node-01 centos  7.4 admin 10.2.152.132 node-02 centos  7.4 nod ...

  7. 【MySQL】ubuntu16.04安装mysql,然后源码编译Qt5.12.4版本的libqsqlmysql.so

    一.Ubuntu16.04.5 安装 MySQL 1.使用apt命令安装 sudo apt install mysql-server 安装过程会提示,推荐设置MySQL的root用户密码(注意:这里r ...

  8. 银河麒麟V10系统+飞腾CPU交叉编译安装Qt-5.15.2

    银河麒麟V10系统+飞腾CPU编译安装Qt-5.15.2 一.准备工作 1.下载qt源码包 下载网址:https://download.qt.io/archive/qt/ 在任意空闲位置新建文件夹,并 ...

  9. 保姆级教程——Ubuntu16.04 Server下深度学习环境搭建:安装CUDA8.0,cuDNN6.0,Bazel0.5.4,源码编译安装TensorFlow1.4.0(GPU版)...

    写在前面 本文叙述了在Ubuntu16.04 Server下安装CUDA8.0,cuDNN6.0以及源码编译安装TensorFlow1.4.0(GPU版)的亲身经历,包括遇到的问题及解决办法,也有一些 ...

最新文章

  1. iOS进阶之底层原理-isa与对象
  2. 无法使用tomcat6.exe启动服务
  3. 【操作系统】进程调度(4):I/O、不可预测的运行时间
  4. 关于tag,viewWithTag
  5. 写一个Android输入法01——最简步骤
  6. [ZT]图像处理库的比较:OpenCV,FreeImage,CImg,CxImage
  7. (4)FPGA JTAG接口连接(学无止境)
  8. [Linux]局域网设置-远程登录GDMSETUP
  9. Qt学习之路_6(Qt局域网聊天软件)
  10. java一个和_你知道Java中和||放一个表达式中怎么执行吗-百度经验
  11. java课设单链式存储心得报告_队列的链式存储方式的实现(Java语言描述)
  12. 搜集-类似Visio绘图软件
  13. 基于图神经网络的推荐系统
  14. Photoshop调出花朵照片复古冷色效果
  15. 没有肉眼可见的躯体,却丝毫不妨碍放飞灵魂
  16. Python爬虫实战(1):抓取毒舌电影最新推送
  17. php 集成 spss,〖SPSS Modeler〗 IBM SPSS Modeler 整合不同数据库之间的数据
  18. Carmack(卡马克)传奇的3D引擎开源代码
  19. String.getBytes()
  20. mysql 列转行union all_MySQL中的列转行 - osc_qheq8wav的个人空间 - OSCHINA - 中文开源技术交流社区...

热门文章

  1. Windows多线程控制台程序
  2. 什么是SEO文章?seo文章的作用方法
  3. 使用 hutool 工具包发送 HTTP 请求
  4. 技术大佬告诉你:创业型APP如何选择推送平台
  5. 服务器2008r2显示0xa000000,server2008安装wins服务器出现错误代码0x80070643
  6. [转]从Java开源说起
  7. fetchall函数php,PHP PDO fetchAll(),简单结果
  8. 企业微信逆向开发协议,HOOK接口,DLL开发
  9. C++模板元编程(8)模板类的继承
  10. 宏程序c语言哪个复杂,什么是宏程序?