0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Qt源码跨平台源码编译构建过程中的注意点

嵌入式小生 来源:嵌入式小生 作者:嵌入式小生 2022-10-08 11:51 次阅读

硬件板卡提供商提供的嵌入式linux平台下的Qt环境中,很多时候会存在许多问题:

(1)可能一些Qt的模块不支持。这时候要么找厂家,要么自己编译。

(2)在厂家提供的平台开发环境中,支持的东西太多,太杂,导致整个文件系统镜像太大。这时候为了减小根文件系统,往往需要自己集成和编译开发环境。

(3)不同版本Qt编译构建出的库文件,一般会不兼容,需要针对特定版本进行交叉编译。

本文主要是记录在Qt源码跨平台源码编译构建过程中的一些注意点以及自己的思考。因平台太多,软件环境大多不同,故不会针对特定平台进行详细步骤描述,所以记录些共同点,细节点就略过啦。如果有疑问,可以加小生微信相互交流,互相学习,哈哈!

编译Qt源码,首先就获取源码,从Qt官方网站https://download.qt.io/archive/qt/获取源码。将其解压缩,完成后如下图所示:

3c93ca1c-427c-11ed-96c9-dac502259ad0.png

从目录结构来观察,源码结构以模块方式高度划分。Qt的各个模块都可以单独编译,当然一般使用最多的是整体编译。在使用工具(例如buildroot)制作嵌入式linux根文件系统时,对Qt部分是自动编译的(暂不清楚里面的构建细节)

在上图中,有一个qtbase目录,该目录是Qt的基础模块目录,该目录下同样有configure文件(在源码目录下也有一个configure配置文件,这两个文件不一样)

在Qt源码目录下执行:

./configure--help

会打印出帮助信息,在/qtbase目录下使用上述命令同样会打印帮助信息,只是在此处打印出的信息比在源码目录下使用confiigure --help命令打印出的帮助信息少。

当我们在Qt源码目录下执行./configure命令时,可以配置整体编译方案,我们则可以在此处设置想要编译构建的参数和模块。

在/qtbase目录下,执行./configure命令时,配置的是在该目录下的Qt基本模块。从源码目录结构,可以知道在qtbase模块下包含许多子模块:

3ccfc120-427c-11ed-96c9-dac502259ad0.png

其中包含:core、network、sql、widget等。

只编译构建qtbase,开发运行常见窗体应用是可以的

mkspecs目录

在qtbase目录下,存放了多个目录,如下图所示:

3cfba4d4-427c-11ed-96c9-dac502259ad0.png

因为Qt是跨平台的,在该目录下则存放了许多与具体平台相关的目录,目录的名称则是以具体架构来命名,且目录中存放了两个文件:

3d37cc66-427c-11ed-96c9-dac502259ad0.png

qmake.conf:该文件是关于具体架构的qmake配置描述,一般内容格式如下:

#
#qmakeconfigurationforbuildingwithaarch64-linux-gnu-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)

#modificationstog++.conf
QMAKE_CC=aarch64-linux-gnu-gcc
QMAKE_CXX=aarch64-linux-gnu-g++
QMAKE_LINK=aarch64-linux-gnu-g++
QMAKE_LINK_SHLIB=aarch64-linux-gnu-g++

#modificationstolinux.conf
QMAKE_AR=aarch64-linux-gnu-arcqs
QMAKE_OBJCOPY=aarch64-linux-gnu-objcopy
QMAKE_NM=aarch64-linux-gnu-nm-P
QMAKE_STRIP=aarch64-linux-gnu-strip
load(qt_config)

qplatformdefs.h:该文件是一个头文件,文件中内容用于描述具体模块层级包含的相关头文件依赖。

qmake.conf是一个重要的文件,在针对具体平台编译构建源码时,可能需要修改该文件下的内容:

3d5276ec-427c-11ed-96c9-dac502259ad0.png在上述图片中,等号右边表示具体的编译构建工具名称。需要提前安装对应的编译套件且将他们添加到环境变量中(如果没有添加,可以以绝对路径来描述)。例如,如果是在linux平台下,且将编译器添加到了环境变量中,可以使用编译器名称加上v参数选项查看编译器信息,此处以交叉编译器aarch64-linux-gnu为例:

3d8012a0-427c-11ed-96c9-dac502259ad0.png

编译构建qtbase

本小节以在ubuntu系统下,交叉编译Arm64平台的Qt版本为目标。记录qtbase的编译构建步骤。

交叉编译器为:gcc-linara-6.3.1-2017.05-x86_64_aarch64-linux-gnu

(1)准备好交叉编译工具后,将交叉编译器的路径添加到ubuntu环境变量中。参见《一文分享linux的环境变量》一文。

(2)在源码目录下使用cd qtbase将终端切换到qtbase目录下。

(3)查看/qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf文件内容。编译器一栏所填写的命令,需要与交叉编译器套件名称一样。小生的交叉编译器套件如下图所示:

3de643f4-427c-11ed-96c9-dac502259ad0.png

(经对比,qmake.conf文件中交叉编译器名称与上图所示名称一样,故此处不用修改qmake.conf文件)

(4)在终端使用下列命令:

./configure
-prefix编译安装的目录路径
-xplatformlinux-aarch64-gnu-g++
-no-opengl
-opensource
-confirm-license
-release
-strip
-shared
-c++stdc++11
--sqlite=qt
-recheck-all

(注:可以将上述内容写成脚本,直接在终端下运行即可)

-prefix:该参数用于指定Qt编译完成后安装时的输出目录。

-xplatform:用于交叉编译时选择目标mkspec。(需与qtbase/mkspec目录下的目录名称一样)

其他参数含义可以使用./configure -help打印出帮助信息查看。

(5)使用make -j12编译构建qtbase。(-j12表示同时允许的任务数,计算机性能好,就指定12或更高。计算机性能弱就指定低数值或不指定-j参数)

注:根据编译构建环境的硬件配置,整个编译构建过程可能会需要几分钟甚至几十分钟。

(6)编译完成后,在终端使用make install命令将编译成功后的文件安装到-prefix参数指定的路径下。

安装完成后,会在-prefix参数指定的路径下自动创建几个目录,如下图所示:3e21e472-427c-11ed-96c9-dac502259ad0.png

bin:该目录下包含生成的Qt版本的二进制程序。例如:moc、qmake、rcc、uic等Qt构建工具。

doc:为对应模块的文档目录。

examples:该目录中存放的是与该模块相关的Qt演示demo(源码+生成的可执行体)。

include:该目录存放与该模块相关的包含头文件。

lib:该目录下存放的是与该模块相关的库文件。

plugins:该目录下存放插件目录,在对应插件目录下存放着对应的插件库文件。

在上述过程中,我们已经编译构建且安装好了qtbase,如果在开发中,还想增加其他的组件模块,我们可以直接到模块对应的目录路径下编译即可。例如,如果想编译构建qtcharts模块,可以按照如下步骤进行:

(1)切换到qtcharts目录路径下,打开终端。

(2)用在qtbase编译出的qmake工具来配置(这个qmake会自动延用qtbase交叉编译时的配置),qmake工具位于-prefix参数指定的路径下的bin目录中:

编译安装的目录路径/bin/qamke

(3)使用make -j12编译构建。

(4)使用make install安装。

完整编译构建Qt源码

完整编译Qt源码指的是在Qt源码路径下进行编译,使用configure对Qt进行编译配置时指定需要编译的模块。

完整编译构建步骤如下:

(1)与上述编译qtbase一样,需要确保准备好了交叉编译器环境,且配置好具体目标平台下的qmake配置文件,然后在Qt源码目录下打开终端。

(2)使用下列命令配置Qt源码:

#!/bin/sh
./configure-prefix/home/Qt/qt-everywhere-src-5.12.9/arm-qt
-opensource
-confirm-license
-release
-strip
-shared
-xplatformlinux-arm-gnueabi-g++
-optimized-qmake
-c++stdc++11
--rpath=no
-pch
-skipqt3d
-skipqtactiveqt
-skipqtandroidextras
-skipqtcanvas3d
-skipqtconnectivity
-skipqtdatavis3d
-skipqtdoc
-skipqtgamepad
-skipqtlocation
-skipqtmacextras
-skipqtnetworkauth
-skipqtpurchasing
-skipqtremoteobjects
-skipqtscript
-skipqtscxml
-skipqtsensors
-skipqtspeech
-skipqtsvg
-skipqttools
-skipqttranslations
-skipqtwayland
-skipqtwebengine
-skipqtwebview
-skipqtwinextras
-skipqtx11extras
-skipqtxmlpatterns
-makelibs
-makeexamples
-nomaketools-nomaketests
-gui
-widgets
-dbus-runtime
--glib=no
--iconv=no
--pcre=qt
--zlib=qt
-no-openssl
--freetype=qt
--harfbuzz=qt-no-opengl-linuxfb
--xcb=no-tslib
--libpng=qt
--libjpeg=qt
--sqlite=qt
-plugin-sql-sqlite
-I/home/Qt/tslib-1.21/arm-tslib/include
-L/home/Qt/tslib-1.21/arm-tslib/lib
-recheck-all

上述的配置文本,可通过./configure -help查看对应的意思。

参考链接:https://doc.qt.io/qt-5/configure-options.html

上述配置跳过了几个Qt模块,且使用linuxfb作为显示平台插件,为ARM32编译Qt跨平台开发环境。

(3)在终端使用make -j12编译构建Qt源码。

(4)在终端使用make installl命令将编译成功后的文件安装到-prefix参数指定的路径下。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206734
  • 源码
    +关注

    关注

    8

    文章

    573

    浏览量

    28585
  • Qt
    Qt
    +关注

    关注

    1

    文章

    299

    浏览量

    37339

原文标题:交叉编译Qt源码笔记

文章出处:【微信号:嵌入式小生,微信公众号:嵌入式小生】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    OpenHarmony开发学习:【源码下载和编译

    本文介绍了如何下载鸿蒙系统源码,如何一次性配置可以编译三个目标平台(`Hi3516`,`Hi3518`和`Hi3861`)的编译环境,以及如何将源码
    的头像 发表于 04-14 09:36 391次阅读
    OpenHarmony开发学习:【<b class='flag-5'>源码</b>下载和<b class='flag-5'>编译</b>】

    如何编译ARM版本LINUX QT4.5

    天嵌科技推出最新一期天嵌使用教程,教程将会演示在E9卡片电脑中,如何编译LINUX QT4.5。该教程在E9卡片电脑用户手册,在11.2.4小章,详细描述在ARM平台上运行编译
    发表于 02-06 16:51

    【OK210试用体验】之QT编译过程中疑惑求解

    因为要使用板子完成计算机辅助绘图中坐标的提取,上位机采用QT来制作的,所以需要对QT进行移植,本人是参考OK6410 QT移植百科全书,发现QT源码
    发表于 09-24 11:29

    Linux QT5程序编译准备源码

    Linux QT5程序编译准备源码  打开网盘到 5_MY-Demo,下载 MY-Linux-QT5-Demo-AboutUs-svn*.tar.bz2 文件,并复制到虚拟机。解压
    发表于 03-08 11:27

    linux源码编译过程

    /***in/ldconfig使所有的库文件都缓存都ld.so.cache,如果没有运行/***in/ldconfig,即使库文件就在/etc/ld.so.conf,也是不会被使用的,结果在编译
    发表于 07-09 07:37

    手动编译QT源码生成qmake

    交叉编译QT4.8.7源码生成qmake工具TQ-i.MX6UL使用的QT版本是QT4.8.7,板卡出厂前附带的开发资料中,天嵌官方没有为开
    发表于 11-05 08:20

    平台Qt调试作一个简单的介绍

    Qt自带调试功能,如果是主机上的程序可以直接调试,非常方便。同时,Qt是一个平台的编程语言,在主机上调试其他平台上的程序时就需要相应的设置
    发表于 12-14 08:46

    qt源码库在树莓派的部署方法

    接安装qt。本文介绍最普遍的部署方式,就是在pc端的ubuntu交叉编译源码,然后上传编译好的库到树莓派,最后配置
    发表于 12-24 06:44

    请问QT怎么实现源码编译

    你好,QT怎么实现源码编译
    发表于 12-31 07:49

    瑞芯微RK3568开发板源码编译与交叉编译环境搭建

    工具,对应Qt开发,需要注意是qmake这个工具,bin目录的所有编译工具如下:使用资料中的Qt程序进行交叉
    发表于 02-27 08:52

    qt源码编译安装遇到的问题

    QT源码make通过后执行make install时报错。
    发表于 12-09 15:56

    编译UCOSII源码过程

    编译UCOSII源码过程
    发表于 10-30 15:24 11次下载
    <b class='flag-5'>编译</b>UCOSII<b class='flag-5'>源码</b><b class='flag-5'>过程</b>

    嵌入式Linux开发环境搭建-(6)交叉编译QT4.8.7源码生成qmake工具

    交叉编译QT4.8.7源码生成qmake工具TQ-i.MX6UL使用的QT版本是QT4.8.7,板卡出厂前附带的开发资料中,天嵌官方没有为开
    发表于 11-02 13:21 3次下载
    嵌入式Linux开发环境搭建-(6)交叉<b class='flag-5'>编译</b><b class='flag-5'>QT</b>4.8.7<b class='flag-5'>源码</b>生成qmake工具

    QT设计的网络助手源码

    QT设计的网络助手源码
    发表于 09-27 11:46 1次下载

    qt opencv opencl opengl源码例程

    qt-opencv-opencl-opengl-源码例程
    发表于 09-27 14:42 1次下载