序言
这边文章很长,阅读需要耐心。在阅读之前,先提出三个问题。
1、编译器很多,为何选择QT Creator?
答:我要开发GUI程序,而Linux系统的界面库主要有GTK+、QT和Swing/AWT,所以能选择的IDE有限,QT Creator在众多IDE也算比较出色,所以选择了它。也可以使用Eclipse,搭配Swing/AWT开发GUI程序。
2、QT Creator能直接开发ARM程序吗?
答:不能,安装在x86架构的系统的QT Creator都不能直接开发ARM程序,需要对QT源码进行交叉编译。
3、交叉编译QT源码的目的?
答:我的理解是生成可以开发ARM程序的SDK,但是不理解为何QT公司不直接生成一些SDK包,就像Android的SDK。
1、交叉编译QT源码
交叉编译QT源码这个过程真的很痛苦、很痛苦、很痛苦,对于一个新手而言,有太多、太多、太多的坑等着我们。具体的过程如下图所示,我们按照图中的过程一一讲解。如果嫌麻烦,可以跳过这一章节,使用我编译好的文件即可。
可以通过访问QT官网下载源码,我使用得是5.14.2版本,选择其它版本的可以访问上层目录查找,注意源码在“Single”文件夹下,命名格式为“qt-everywhere-src-version”。
编译QT源码需要安装Perl、Python3、GNU Make和gcc交叉编译器,GNU Make在Linux系统已经被安装。我这里使用的是Ubuntu 20.04,只需要输入命令apt-get install build-essential
,即可安装Perl和Python。aarch64-none-linux-gnu是gcc的交叉编译器,在《玩转DragronBoard 410c系列之四:Linux系统搭建ARM应用开发环境》这篇文中有介绍,按照该文章描述下载和配置环境即可。如果系统中同时安装了python2和python3,可能会导致编译失败,QT源码中使用的是python,所以需要python3改名为python,我不推荐改名,可以通过创建软链接的方式实现。
# 使用root权限 sudo su # 创建软链接,版本号根据实际安装的修改 sudo ln -s /usr/bin/python3.8 /usr/bin/python
待以上操作完成后,一定要检查是否安装正常,可通过Shell查看版本的方式检查。
# 查询perl版本,v小写 perl -v # 查询python版本,V大写 python -V # 查询make版本,v小写 make -v # 查询aarch64 g++版本,v小写 aarch64-none-linux-gnu-g++ -v
解压QT源码,打开文件qt-everywhere-src-5.14.2/qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf,修改交叉编译器名称,修改成如下内容。
# modifications to g++.conf QMAKE_CC = aarch64-none-linux-gnu-gcc QMAKE_CXX = aarch64-none-linux-gnu-g++ QMAKE_LINK = aarch64-none-linux-gnu-g++ QMAKE_LINK_SHLIB = aarch64-none-linux-gnu-g++ # modifications to linux.conf QMAKE_AR = aarch64-none-linux-gnu-ar cqs QMAKE_OBJCOPY = aarch64-none-linux-gnu-objcopy QMAKE_NM = aarch64-none-linux-gnu-nm -P QMAKE_STRIP = aarch64-none-linux-gnu-strip
这一过程是关键的一步,也是最容易出错的。首先我们要创建一个脚本文件,用于自动生成MakeFiles,该脚本文件包含编译器名称、安装位置、QT编译配置(即裁剪QT源码)。每个QT版本的裁剪命令都有差异,本文章只能保证在QT 5.14.2版本上没问题。裁剪的目的主要是为了去掉自己不会使用的内容,减小QT库的大小。裁剪源码不是指将不需要的代码删除掉,而是选择性编译源码,达到节约时间和空间的目的。我也是摸索了很多次才成功,基本上做到了非常精简的程度,可能会在以后的使用中出现问题,但是目前还满足我的使用需求。
在源码根目录下创建“CreateMakeFiles.sh”文件,随便命名,里面添加如下内容。-prefix /usr/lib/qt-arm
表示编译完成后安装的路径,这里根据自己的喜好配置。-xplatform linux-aarch64-gnu-g++
是交叉编译器的名称。更多的配置说明可在当前根目录下使用./configure
查询。
#!/bin/sh ./configure -prefix /usr/lib/qt-arm \ -xplatform linux-aarch64-gnu-g++ \ -release \ -shared \ -opensource \ -confirm-license \ -nomake tools \ -nomake examples \ -no-iconv \ -no-dbus \ -no-cups \ -no-accessibility \ -no-opengl \ -no-pch \ -no-xcb \ -no-glib \ -no-pkg-config \ -no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2 -no-avx \ -skip qt3d \ -skip qtactiveqt \ -skip qtandroidextras \ -skip qtcanvas3d \ -skip qtcharts \ -skip qtconnectivity \ -skip qtdatavis3d \ -skip qtdeclarative \ -skip qtdoc \ -skip qtgamepad \ -skip qtgraphicaleffects \ -skip qtlocation \ -skip qtmacextras \ -skip qtmultimedia \ -skip qtnetworkauth \ -skip qtpurchasing \ -skip qtquickcontrols \ -skip qtquickcontrols2 \ -skip qtremoteobjects \ -skip qtscript \ -skip qtscxml \ -skip qtsensors \ -skip qtserialbus \ -skip qtserialport \ -skip qtspeech \ -skip qtsvg \ -skip qttools \ -skip qttranslations \ -skip qtvirtualkeyboard \ -skip qtwayland \ -skip qtwebchannel \ -skip qtwebengine \ -skip qtwebglplugin \ -skip qtwebsockets \ -skip qtwebview \ -skip qtwinextras \ -skip qtxmlpatterns \ -skip qtx11extras \
然后通过Shell指令运行./CreateMakeFiles.sh
,注意要切换到当前目录。如果该过程能够顺利执行的话,会在每个文件夹下生成MakeFiles文件,同时执行完成后会在命令窗口弹出如下图所示的内容,这代表需要编译的内容。
Build options: Mode ................................... release Optimize release build for size ........ no Building shared libraries .............. yes Using C standard ....................... C11 Using C++ standard ..................... C++17 Using ccache ........................... no Using new DTAGS ........................ yes Relocatable ............................ yes Using precompiled headers .............. no Using LTCG ............................. no Target compiler supports: NEON ................................. yes Build parts ............................ libs Qt modules and options: Qt Concurrent .......................... yes Qt D-Bus ............................... no Qt D-Bus directly linked to libdbus .... no Qt Gui ................................. yes Qt Network ............................. yes Qt Sql ................................. yes Qt Testlib ............................. yes Qt Widgets ............................. yes Qt Xml ................................. yes Support enabled for: Using pkg-config ....................... no udev ................................... no Using system zlib ...................... no Zstandard support ...................... no Qt Core: DoubleConversion ....................... yes Using system DoubleConversion ........ no GLib ................................... no iconv .................................. no ICU .................................... no Built-in copy of the MIME database ..... yes Tracing backend ........................ <none> Logging backends: journald ............................. no syslog ............................... no slog2 ................................ no PCRE2 .................................. yes Using system PCRE2 ................... no Qt Network: getifaddrs() ........................... yes IPv6 ifname ............................ yes libproxy ............................... no Linux AF_NETLINK ....................... yes OpenSSL ................................ no Qt directly linked to OpenSSL ........ no OpenSSL 1.1 ............................ no DTLS ................................... no OCSP-stapling .......................... no SCTP ................................... no Use system proxies ..................... yes GSSAPI ................................. no Qt Gui: Accessibility .......................... no FreeType ............................... yes Using system FreeType ................ no HarfBuzz ............................... yes Using system HarfBuzz ................ no Fontconfig ............................. no Image formats: GIF .................................. yes ICO .................................. yes JPEG ................................. yes Using system libjpeg ............... no PNG .................................. yes Using system libpng ................ no Text formats: HtmlParser ........................... yes CssParser ............................ yes OdfWriter ............................ yes MarkdownReader ....................... yes Using system libmd4c ............... no MarkdownWriter ....................... yes EGL .................................... no OpenVG ................................. no OpenGL: Desktop OpenGL ....................... no OpenGL ES 2.0 ........................ no OpenGL ES 3.0 ........................ no OpenGL ES 3.1 ........................ no OpenGL ES 3.2 ........................ no Vulkan ................................. no Session Management ..................... yes Features used by QPA backends: evdev .................................. yes libinput ............................... no INTEGRITY HID .......................... no mtdev .................................. no tslib .................................. no xkbcommon .............................. no X11 specific: XLib ................................. no XCB Xlib ............................. no EGL on X11 ........................... no QPA backends: DirectFB ............................... no EGLFS .................................. no LinuxFB ................................ yes VNC .................................... yes Qt Sql: SQL item models ........................ yes Qt Widgets: GTK+ ................................... no Styles ................................. Fusion Windows Qt PrintSupport: CUPS ................................... no Qt Sql Drivers: DB2 (IBM) .............................. no InterBase .............................. no MySql .................................. no OCI (Oracle) ........................... no ODBC ................................... no PostgreSQL ............................. no SQLite2 ................................ no SQLite ................................. yes Using system provided SQLite ......... no TDS (Sybase) ........................... no Qt Testlib: Tester for item models ................. yes Further Image Formats: JasPer ................................. no MNG .................................... no TIFF ................................... yes Using system libtiff ................. no WEBP ................................... yes Using system libwebp ................. no
编译受硬件和环境的双重影响,有可能会出现问题,甚至需要修改源码才能解决。不过我还未遇到需要修改源码的情景,我猜大概率是编译环境和代码不兼容导致的。编译的时间比较长,我几乎是最小化裁剪了,仍然花了一个多小时才编译完成。编译的过程很简单,使用指令make j2
或者make
,其中“j2”是指需要的同时执行2个作业,这个在多核CPU下可以提高编译速度。编译完成后使用make install
进行安装,安装的位置就是CreateMakeFiles.sh文件中配置的路径。下图是安装完成的图,由于是最小化裁剪,总文件大小约87M。
文章评论