Qt 相关 编译流程及交叉编译 部署所遇到的问题总结-持续更新

准备环境和工具

1、主机环境 ubuntu20

2、交叉编译器 gcc-linaro-6.3.1...arm-linux-gnuebihf

3、QT5源码包qt-5.11.3_sources

下载qt-5.11.3的包需要先带网络代理软件,再访问下载目录就可以显示了。
Index of /archive/qt

4、依赖库安装

复制代码
   sudo apt install g++ make qt3d5-dev-tools -y
   sudo apt install qml-module-qtquick-xmllistmodel -y
   sudo apt install qml-module-qtquick-virtualkeyboard qml-module-qtquick-privatewidgets qml-module-qtquick-dialogs qml -y
   sudo apt install libqt53dquickscene2d5 libqt53dquickrender5 libqt53dquickinput5 libqt53dquickextras5 libqt53dquickanimation5 libqt53dquick5 -y
   sudo apt install qtdeclarative5-dev qml-module-qtwebengine qml-module-qtwebchannel qml-module-qtmultimedia qml-module-qtaudioengine -y

5、解包交叉编译器和qt源码

复制代码
tar -xvf gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf.tar

可以选择将gcc编译器,移动到opt目录下

复制代码
tar -xvf qt-everywhere-src-5.11.3.tar.xz
cd qt-everywhere-src-5.11.3

5、修改qmake.conf

路径: qt-everywhere-src-5.11.3/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf

这里需要先配置下交叉变异工具路径 本机qt程序编译也会调用

复制代码
#
# qmake configuration for building with arm-linux-gnueabi-g++
#
 
MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublib
 
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
 
# modifications to g++.conf
#交叉编译工具 带有-lts的会编译失败不知道为什么
#QMAKE_CC                = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcc -lts
#QMAKE_CXX               = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-g++ -lts
#QMAKE_LINK              = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-g++ -lts
#QMAKE_LINK_SHLIB        = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-g++ -lts

QMAKE_CC                = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcc 
QMAKE_CXX               = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-g++ 
QMAKE_LINK              = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-g++ 
QMAKE_LINK_SHLIB        = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-g++ 
 
# modifications to linux.conf
#交叉编译工具
QMAKE_AR                = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY           = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-objcopy
QMAKE_NM                = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-nm -P
QMAKE_STRIP             = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-strip
load(qt_config)
 
#tslib路径(交叉编译库)
QMAKE_INCDIR=/opt/tslib-1.21/include
QMAKE_LIBDIR=/opt/tslib-1.21/lib

6、configure配置脚本文件

为了防止代码污染,可以先新建一个build目录

复制代码
mkdir build && cd build  (特别说明 这个build 目录 不能在qt 源代码目录下,默认编译仅支持顶级编译,可以在其他目录 脱离qt源码目录随便创建一个文件夹编译)

#!/bin/sh
../configure \
-prefix /opt/rk3288/qt-5.11.3/ \
-xplatform linux-arm-gnueabi-g++ \
-gui \
-widgets \
-release \
-opensource \
-confirm-license \
-no-openssl \
-no-opengl \
-skip qtdeclarative #这行是可选的,加上会不编译qml quick模块,需要就删掉这一行

7、特别说下 -skip qtdeclarative这一条,名字很坑完全看不出和quick有什么关系,网上很多都说编译会报错就加上这个,也可能是因为用不到quick为了缩小体积,很多配置文件都把这个给加上了,但是这个是qml quick模块,需要这部分功能的一定不要加,而且我这边编译也没报错。

8、build (-j8 8指的是cpu核心数)

复制代码
make -j8 
sudo make -j8 install

9、编译报错处理

1),error1 :qt-everywhere-src-5.11.3/qtbase/src/corelib/global/qrandom.cpp:455:62: error: no matching function for call to 'std::mersenne_twister_engine

方法:在qrandom.cpp 的219行,增加一条定义

typedef quint32 result_type;

复制代码
qsizetype fillBuffer(void *, qsizetype) Q_DECL_NOTHROW
    {
        // always use the fallback
        return 0;
    }
#endif // Q_OS_WINRT
    typedef quint32 result_type;
    static SystemGenerator &self();
    void generate(quint32 *begin, quint32 *end) Q_DECL_NOEXCEPT_EXPR(FillBufferNoexcept);

2),error: 'SIOCGSTAMP' undeclared (first use in this function); did you mean 'SIOCGARP'?

解决:找到socketcanbackend.cpp并打开,添加头文件

#include <linux/sockios.h>

即可解决问题

3),python: not found

解决:在终端输入命令

sudo ln -s /usr/bin/python3 /usr/bin/python 将Python和Python3 连接到一起

4),缺少 libxcb*

解决:sudo apt-get install libxcb*

备注:

ubuntu20的 系统vi编辑器过老,需要升级下

1、打开终端。

2、更新软件包列表:

复制代码
sudo apt-get update  

3、安装或更新 vim:

复制代码
sudo apt-get install --only-upgrade vim

或者直接升级所有软件包:

复制代码
sudo apt-get upgrade vim

如果系统提示需要升级,输入 Y 确认。

复制代码
admin1@admin:/opt/gcc-arm-linux-gnueabihf-8.3.0/bin$ find "$(pwd)" -maxdepth 1
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-addr2line
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/runtest
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcc
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gdb
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-c++filt
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-strip
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-c++
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-elfedit
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-readelf
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-g++
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gprof
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-strings
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-ld.gold
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcov
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-ld
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcc-6.3.1
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-size
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcov-tool
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-objdump
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-dwp
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-as
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcc-ar
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-ld.bfd
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/gdbserver
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-ar
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-ranlib
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-nm
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-objcopy
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-cpp
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcc-nm
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcc-ranlib
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gfortran
下方为编译qt开发工具
复制代码
../configure \
-prefix /opt/qt-5.11.3/ \
-gui \
-widgets \
-release \
-opensource \
-confirm-license \
-no-openssl \
-no-opengl

之后

复制代码
make -j8 
sudo make -j8 install

上述编译完成之后

复制代码
sudo apt install qtcreator

问题

可能遇到的问题

ubuntu安装qt时编译出现cstddef:50:10: fatal error: 'stddef.h' file not found

sudo apt-get install libclang-common-8-dev

,这条命令完美解决

补充 :

设置文件权限
复制代码
sudo chmod -R 777 /home/
更改用户组权限
复制代码
sudo chown admin1:admin1 /home

ubuntu 下用的vpn客户端 - 可用的

https://github.com/2dust/v2rayN/releases


MAC M2下

当出现 版本不匹配 这样做

复制代码
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.15

CONFIG+=sdk_no_version_check   

如果 报错 不影响运行 可以关闭插件中

复制代码
ClangCodeModel

这个配置是基于 gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf
复制代码
#
# qmake configuration for building with arm-linux-gnueabi-g++
#

MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublib

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

# modifications to g++.conf
QMAKE_CC                = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-gcc
QMAKE_CXX               = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-g++
QMAKE_LINK              = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB        = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-g++

QMAKE_CC                = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-gcc
QMAKE_CXX               = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-g++
QMAKE_LINK              = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB        = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-g++

# modifications to linux.conf
QMAKE_AR                = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY           = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-objcopy
QMAKE_NM                = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-nm -P
QMAKE_STRIP             = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-strip
load(qt_config)

推荐几个主流 Linaro 工具链版本选择参考
Linaro 工具链版本 GCC 版本 对应 glibc 范围 使用场景
6.3.1-2017.02 6.3.1 glibc 2.23 嵌入式 Linux 4.x 常见
7.5.0-2019.12 7.5.0 glibc 2.27~2.28 ARMv7 硬浮点常见
8.3.0-2019.03 8.3.0 glibc 2.28~2.29 新平台(如 RK3399)
aarch64-linux-gnu-9.x 9.x glibc 2.31+ 64 位 ARM(Cortex-A72)

当嵌入式linux内置qt版本与开发机器编译版本不一致

  • 本机编译机器运行正常,但部署远端会发生异常
    处理
    在远端嵌入式linux机器上进入

    /usr/lib/arm-linux-gnueabihf/qt5/qml/QtQuick/Controls.2

嵌入式linux机器qt相关东西一般在这里

随意打开一个 例如 menu.qml vi 编辑后查看内部 import 的相关版本

  • 此相关问题 导致的原因在于本地编译qt库与远端设备不同步导致的

注意

qt 库编译 - 路径禁止包含中文 --卡了一段时间没想到是因为这个

当开发机器选择远端编译环境运行部署的时候如果提示

复制代码
qt.qpa.screen: QXcbConnection: Could not connect to display :0
Could not connect to any X display.
  • 1、先确认远端是否有

    echo $DISPLAY # 如果有输出则说明有图形界面

若上述条件满足 则直接登陆远端设备 直接执行下方指令

  • 临时放开所有本地用户的访问权限(不安全,只用于调试):

    xhost +local:

或者执行

  • (注意:这会放开所有访问权限,不建议在公共或生产环境使用)

    xhost +

成功再次编译项目运行到远端

相关推荐
feiyangqingyun9 小时前
Qt/C++开发监控GB28181系统/sip协议/同时支持udp和tcp模式/底层协议解析
c++·qt·gb28181
编码小笨猪12 小时前
[ Qt ] | 常用控件(三):
开发语言·qt
cykaw259012 小时前
使用QT做网络调试助手心得
网络·qt
Echo``15 小时前
8:OpenCV—仿射变换和坐标映射
开发语言·图像处理·人工智能·qt·opencv·计算机视觉·命令模式
know_heng17 小时前
UBUNTU20.04 配置以QT界面程序代替系统界面启动,以及如何在tty模式下以linuxfb形式启动
开发语言·qt·ubuntu·嵌入式设备
丿无缘梦丨18 小时前
qt ubuntu 20.04 交叉编译
linux·qt·ubuntu
丁劲犇21 小时前
基于Qt的MCP LLM代理服务开发实战:从0到1扩展大语言模型
c++·qt·llm·agent·httpserver·mcp
hvinsion1 天前
【开源解析】基于PyQt5+Folium的谷歌地图应用开发:从入门到实战
python·qt·开源·地图·谷歌地图·folium·地图引擎
Archer1942 天前
C++——QT 文件操作类
开发语言·qt
编码小笨猪2 天前
[ Qt ] | 常见控件(二): window相关
开发语言·qt