基于FL2440的QT5.6.0移植记录

2019-07-13 08:48发布

参考文章:
1. QT5.6.0的移植配置参考1
2. QT5.6.0的移植配置参考2
3. QT5.6.0的移植配置参考3
4. S3C2440的Architect level值
5. Qt字体相关

前言:

在此感谢上面这些前辈的分享,今天增加几个遗留下来的问题,我在找寻答案时发现了有人居然全文照搬我的文章,但却不标明转载还显示是原创,我对此表示愤怒,我乐意任何人转载,但请注明出处,这是一个有良知的人应有的良心。

前提准备:

我的开发环境是ubuntu 12.04 64位VM
- 交叉编译器。
- 移植好的tslib

移植步骤:

1. 下载QT5.6的内核源码

去官网下载 anzyelay@ubuntu:Desktop$ wget https://download.qt.io/archive/qt/5.6/5.6.0/single/qt-everywhere-opensource-src-5.6.0.tar.xz anzyelay@ubuntu:Desktop$ tar -Jxf qt-everywhere-opensource-src-5.6.0.tar.xz anzyelay@ubuntu:Desktop$ cd qt-everywhere-opensource-src-5.6.0

2. 修改qmake.conf配置,设置编译Qt的选项

A、两种指定配置目录的方法

QT官方文档里说了指定配置目录有两种方法:一种是针对device的特定芯片设备,一种是针对platform的平台。两种配置目录下的文件都是一样的,没区别,区别只是配置目录的保存位置不一样以及在.configure时指定配置目录的方法有区别。
  • 针对device的:
    保存位置:qtbase/mkspecs/devices/xxx下
    configure指定方法:-device xxx
  • 针对platform的:
    保存位置:qtbase/mkspecs/xxx下
    configure指定方法:-xplatform xxx

B、配置文件说明及修改

上面说了两种配置目录里的文件是一样的,一般都有两个文件:qplatformdefs.h,qmake.conf。
此处以linux-arm-gnueabi-g++为例说下:
  • qplatformdefs.h :
    通常是引用上层目录下的其它相应平台定义文件,主要就是用来告知编译器宿主PC机的情况。这个我们不用管,都是通用的
  • qmake.conf :
    这个是我们要重点注意的,不同的平台内容是有区别的,我们可以在这里加入一些必要的编译选项,qmake.conf 内容如下,add标示了我针对ARM9开发板自己加的内容。其它略做修改 # # qmake configuration for building with arm-none-linux-gnueabi-g++ # MAKEFILE_GENERATOR = UNIX//配置makefile生成的平台 CONFIG += incremental//配置使用增量链接 QMAKE_INCREMENTAL_STYLE = sublib ##--> add QT_QPA_DEFAULT_PLATFORM = linuxfb //没有GPU,openl的一般都用这 QMAKE_CFLAGS_RELEASE +=-O2 -march=armv4t //march参数根据自己的开发板芯片修改 QMAKE_CXXFLAGS_RELEASE +=-O2 -march=armv4t ##--< add include(../common/linux.conf)//配置编译时编译器,链接器以及一些库的选项 include(../common/gcc-base-unix.conf)//配置GCC include(../common/g++-unix.conf)//配置G++ ##--> add QMAKE_INCDIR += tslib的include目录 //省去了在configure时指定的麻烦。 QMAKE_LIBDIR += tslib的lib的目录 ##--< add # modifications to g++.conf//修改成自己当前用的交叉编译器,没有配置PATH就用绝对路径 QMAKE_CC = arm-none-linux-gnueabi-gcc QMAKE_CXX = arm-none-linux-gnueabi-g++ QMAKE_LINK = arm-none-linux-gnueabi-g++ QMAKE_LINK_SHLIB = arm-none-linux-gnueabi-g++ # modifications to linux.conf QMAKE_AR = arm-none-linux-gnueabi-ar cqs QMAKE_OBJCOPY = arm-none-linux-gnueabi-objcopy QMAKE_NM = arm-none-linux-gnueabi-nm -P QMAKE_STRIP = arm-none-linux-gnueabi-strip load(qt_config) 其实这个文件的作用与configure是一样的,都是用来配置编译环境,在此需要作的修改就是增加几个宏定义,并配置下g++.conf,linux.conf中的编译器路径(如果你没有修改PATH,就改成绝对路径,像我的编译器是arm-none-linux-xxx的格式,与原文不一致(arm-linux-gnuebai-xxx),这个不要粗心) > QT_QPA_DEFAULT_PLATFORM选项是指定图形插件, Qt5将各平台底层抽象为一个 qpa 插件,通常在mac上是cocoa, 在window上是windows, 在linux X11下是xcb, 如果有OPENGL支持, 那么选eglfs。而对于无硬件加速的设备,则选择linuxfb s3c2440的march值是armv4t可以自行查下自己的芯片值。 arm-none-linux-gnueabi-gcc --target-help//查询你的编译器支持的CPU类型,一般都支持没什么必要查,如果不支持就通过这个找类型的。

3. ./configure配置Qt编译

吐槽下在QT官网的文档查询入口我开始一直点Docment,找来找去还是那几个没什么用的,后来点了下WIKI才发现点东西:https://wiki.qt.io/Main,可这里都是旧版的,新版还是要跳转回去。真无言,也就找到了特定设备的粟子,针对device的configure例子,还好最终还是找到了一个比较详细有内容的配置说明,点我查看原文嫌麻烦的可看我文尾的简介。 在qt-everywhere-opensource-src-5.6.0下自建个可执行脚本autoconfig.sh内容如下, 可以自行按需修改 anzyelay@ubuntu:qt-everywhere-opensource-src-5.6.0$ cat autoconfig.sh #!/bin/sh ./configure -prefix /usr/local/Qt5.6-arm -opensource -confirm-license -release -shared -xplatform linux-arm-gnueabi-g++ -optimized-qmake -pch -qt-sql-sqlite -qt-libjpeg -qt-zlib -qt-libpng -qt-freetype -tslib -no-opengl -no-sse2 -no-openssl -no-nis -no-cups -no-glib -no-dbus -no-xcb -no-eglfs -no-xcursor -no-xfixes -no-xrandr -no-xrender -no-separate-debug-info -no-iconv -make libs -make examples -nomake tools -nomake tests -skip -v -skip qt3d -skip qtcanvas3d -skip qtdoc -skip qtwayland exit anzyelay@ubuntu:qt-everywhere-opensource-src-5.6.0$ 执行后成功如下: anzyelay@ubuntu:qt-everywhere-opensource-src-5.6.0$ ./autoconfig.sh ...省略... Configure summary Building on: linux-g++ (x86_64, CPU features: mmx sse sse2) Building for: linux-arm-gnueabi-g++ (arm, CPU features: none detected) Platform notes: - Also available for Linux: linux-clang linux-kcc linux-icc linux-cxx qmake vars .......... styles += mac fusion windows DEFINES += QT_NO_MTDEV DEFINES += QT_NO_LIBUDEV DEFINES += QT_NO_LIBINPUT sql-drivers = sqlite sql-plugins = qmake switches ......... Build options: Configuration .......... accessibility audio-backend c++11 clock-gettime clock-monotonic compile_examples concurrent cross_compile enable_new_dtags evdev eventfd freetype full-config getaddrinfo getifaddrs harfbuzz inotify ipv6ifname large-config largefile linuxfb medium-config minimal-config mremap no-pkg-config pcre png posix_fallocate precompile_header qpa qpa reduce_exports release release_tools rpath shared small-config tslib zlib Build parts ............ libs examples Mode ................... release; optimized tools Using sanitizer(s)...... none Using C++ standard ..... c++11 Using gold linker....... no Using new DTAGS ........ yes Using PCH .............. yes Using LTCG ............. no Target compiler supports: Neon ................. no Qt modules and options: Qt D-Bus ............... no Qt Concurrent .......... yes Qt GUI ................. yes Qt Widgets ............. yes Large File ............. yes QML debugging .......... yes Use system proxies ..... no Support enabled for: Accessibility .......... yes ALSA ................... no CUPS ................... no Evdev .................. yes FontConfig ............. no FreeType ............... qt Glib ................... no GStreamer .............. no GTK theme .............. no HarfBuzz ............... yes (bundled copy) Iconv .................. no ICU .................... no Image formats: GIF .................. yes (plugin, using bundled copy) JPEG ................. yes (plugin, using bundled copy) PNG .................. yes (in QtGui, using bundled copy) libinput................ no Logging backends: journald ............... no syslog ............... no mtdev .................. no Networking: getaddrinfo .......... yes getifaddrs ........... yes IPv6 ifname .......... yes libproxy.............. no OpenSSL .............. no NIS .................... no OpenGL / OpenVG: EGL .................. no OpenGL ............... no OpenVG ............... no PCRE ................... yes (bundled copy) pkg-config ............. no PulseAudio ............. no QPA backends: DirectFB ............. no EGLFS ................ no EGLFS i.MX6 ........ no EGLFS i.MX6 Wayland. no EGLFS EGLDevice .... no EGLFS GBM .......... no EGLFS Mali ......... no EGLFS Raspberry Pi . no EGLFS X11 .......... no LinuxFB .............. yes Mir client............ no XCB .................. no Session management ..... yes SQL drivers: DB2 .................. no InterBase ............ no MySQL ................ no OCI .................. no ODBC ................. no PostgreSQL ........... no SQLite 2 ............. no SQLite ............... qt-qt TDS .................. no tslib .................. yes udev ................... no xkbcommon-x11........... no xkbcommon-evdev......... no zlib ................... yes (bundled copy) NOTE: Qt is using double for qreal on this system. This is binary incompatible against Qt 5.1. Configure with '-qreal float' to create a build that is binary compatible with 5.1. NOTE: -optimized-tools is not useful in -release mode. Info: creating super cache file /home/anzyelay/Desktop/arm/qt-everywhere-opensource-src-5.6.0/.qmake.super Qt is now configured for building. Just run 'make'. Once everything is built, you must run 'make install'. Qt will be installed into /usr/local/Qt5.6-arm Prior to reconfiguration, make sure you remove any leftovers from the previous build.

4. 编译安装

make & sudo make install 开始时由于没有加最后-skip一项.make时会遇到错误,就是关于3D插件部分编译失败,按网上的说法可以修改qt.pro,但5.6.0版的却不一样了,没有addmodule这样的语句,而是用for语句来加载“.gitmodules”这个文件里申明的模块,猜测应该可以直接在这个文件里把qtcanvas3d, qt3d , qtconnectivity, qtwayland 这几个模块注释掉,我没有这样做了,一开始是.configure后在生成的Makefile里直接修改SUBTARGETS的值,去掉“module-qt3d”之类的,如下图列举了一部分,你可以直接 寻到到上面说的几个不能编译的模块删了就行: 30 SUBTARGETS = 31 module-qtbase 32 module-qtmacextras 33 module-qtx11extras 34 module-qtimageformats 我是这样编译成功的,后来看了下文档有更容易的方法,直接在配置时使用 -skip选项就行,具体说明见文尾说明。

5.拷贝库和插件到根文件系

安装后就在你prefix指定的目录下有了我需要拷贝的文件了。这里只需要拷贝一些动态库和插件目录,对,不要忘了在lib下还有个fonts文件夹也需要。 anzyelay@ubuntu:qt-everywhere-opensource-src-5.6.0$ ls /usr/local/Qt5.6-arm/ bin doc include lib mkspecs plugins qml translations anzyelay@ubuntu:qt-everywhere-opensource-src-5.6.0$ cp -av /usr/local/Qt5.6-arm/lib/*so* /usr/local/Qt5.6-arm/lib/fonts /usr/local/Qt5.6-arm/plugins ~/Desktop/arm/myrootfs/usr/local/qt5/

6. 配置环境变量

修改根文件系统下的/etc/profile文件如下: anzyelay@ubuntu:rootfs$ cat etc/profile # /etc/profile: system-wide .profile file for the Bourne shells echo " Processing /etc/profile... " LOGNAME=`id -un` PS1='[u@h:/W]# ' HOSTNAME=`/bin/hostname` if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then HOSTNAME=localhost #如果为空则显示此名 fi PATH=/bin:/sbin:/usr/bin:/usr/sbin export LOGNAME PS1 PATH #tslib 配置 export TSLIB_TSDEVICE=/dev/input/ts0 export TSLIB_CONFFILE=/etc/ts.conf export TSLIB_PLUGINDIR=/lib/ts export TSLIB_CALIBFILE=/etc/pointercal export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb0 echo "Done" export PATH=/usr/local/bin:$PATH export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH #---》要增加的配置有以下这些,试好了就跟上面的合并下。 export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/local/qt5/plugins export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0 export QT_QPA_FONTDIR=/usr/local/qt5/lib/fonts export QT_QPA_GENERIC_PLUGINS=tslib:$TSLIB_TSDEVIC export LD_LIBRARY_PATH=/usr/local/qt5/lib:$LD_LIBRARY_PATH anzyelay@ubuntu:rootfs$ 这下你可以可PC机里的examples目录下的一些执行文件弄过来试验了。完结

说明

配置文章简单翻译 下几个重要的Qt Configure Options 东东:
configure :命令行工具–determines how to build Qt for a particular platform 使用configure -h查看帮助说明

1. 为了便于管理,或编译多种配置的QT,最好新建一个目录,到此目录上使用configure命令,如下,(qt-source代指你下载的解压出来的源码目录)

mkdir ~/qt-build cd ~/qt-build ~/qt-source/configure 这样当你要在配置别的平台的QT并编译时可以重新在建一个目录弄。

2. -prefix + 安装目录 指定make install的目录

3. -skip + 模块名

在配置时可以指定不编译某个模块,但要注意,有些模块的依赖弄一个模块的,所以当你EXCLUDE它时可能引发问题,使用的option命令: ./configure -skip qtconnectivity

4. -qt-lib, -system-lib,-no-lib

qt源码包中有一些第三方的库,可以使用上述三个命令添加或去除。-qt是使用包里的,-system是使用PC系统带的,-no就是不要了

5. Compiler Options

-platform + host platform-compiler
用于编译PC机的QT配置,指明平台和编译器如: ./configure -platform linux-g++

6. Cross-Compilation Options:

  • -xplatform + xplatform:指向目标平台的配置,后面接在qtbase/mkspecs目录下的xplatform目录名
  • -device + device :指向一种特定设备或芯片的配置,后面接在qtbase/mkspecs/devices下的目录名
  • -device-option ,设定附加qmake 变量

移植后的一些遗留问题:

1. 屏幕无法旋转

本方法是依这为大神的文章指导修改,更改下linuxfb插件文件,在./qtbase/src/plugins/platforms/linuxfb/目录下
的qlinuxfbscreen.cpp和qlinuxfbscreen.h
直接将下述补丁文件保存在qt源码根目录下,使用如下命令即可完成修改。 patch -p1 < qt.linuxfb.rotate.lcd.patch 补丁文件qt.linuxfb.rotate.lcd.patch 访问密码 facf 修改后编译一下譔插件,不会单独编译就直接 make吧,然后在./qtbase/plugins/platforms/下找到编译出来的插件libqlinuxfb.so放到开发板根目录中你移植的QT plugins/platforms中.
现在你可以通过两种方法旋转屏幕:
  • 修改环境配置 export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:rotation=90
  • 启动参数中加入参数 -platform linuxfb:fb=/dev/fb0:rotation=90 这样虽然能旋转了但还是有BUG,比如控件按钮失灵之类的。
注:依我最新发现,新版是可以设置旋转的,不用打补丁,使用QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS来定义参数如下: QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=rotate=180 但控件也有点问题,要深入探索了

2.关于字体的问题

界面显示的字体小,以及不显示中文。
中文不显示这个好解决,有两种方法:
一种是在应用程序里配置字体这个网上一堆,我这里就只用个最简单的,直接删除lib/font/下的其它所有字体,从windows下(一般是在C:WindowsFonts)找个汉字字体的ttf文件放过来重启就好了。
字体大小 的问题,这个跟用QWA插件也不同,主要设置可以参考QT官方文档linuxFB说明
设置下size,mmsize就行,QT会自动依据这两个参数计算字体的显示比例 export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=480x272:mmsize=93x56:rotation=0

error

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

  • 错误信息 collect2: error: ld returned 1 exit status make[4]: *** [chatserver] Error 1 make[4]: Leaving directory `/home/anzyelay/Desktop/arm/qt-everywhere-opensource-src-5.6.0/build/qtwebchannel/examples/webchannel/chatserver-cpp' make[3]: *** [sub-chatserver-cpp-make_first] Error 2 make[3]: Leaving directory `/home/anzyelay/Desktop/arm/qt-everywhere-opensource-src-5.6.0/build/qtwebchannel/examples/webchannel' make[2]: *** [sub-webchannel-make_first] Error 2 make[2]: Leaving directory `/home/anzyelay/Desktop/arm/qt-everywhere-opensource-src-5.6.0/build/qtwebchannel/examples' make[1]: *** [sub-examples-make_first] Error 2 make[1]: Leaving directory `/home/anzyelay/Desktop/arm/qt-everywhere-opensource-src-5.6.0/build/qtwebchannel' make: *** [module-qtwebchannel-make_first] Error 2
  • 解决方法
    某个模块无法通过编译,就直接跳此模块,不编译这样子是最快的解决途径,如这里: -skip qtwebchannel

在configure时加上make tests选项,编译QT过程中会出错,提示tst_qmetatype无法编译

  • 错误信息 cd qmetatype/ && ( test -e Makefile || /home/anzyelay/Desktop/arm/qt-everywhere-opensource-src-5.6.0/qt-build0/qtbase/bin/qmake /home/anzyelay/Desktop/arm/qt-everywhere-opensource-src-5.6.0/qtbase/tests/auto/corelib/kernel/qmetatype/qmetatype.pro -o Makefile ) && make -f Makefile make[6]: Entering directory `/home/anzyelay/Desktop/arm/qt-everywhere-opensource-src-5.6.0/qt-build0/qtbase/tests/auto/corelib/kernel/qmetatype' ...省略.. /home/anzyelay/Desktop/arm/qt-everywhere-opensource-src-5.6.0/qtbase/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp:145: note: CustomGadget_NonDefaultConstructible::CustomGadget_NonDefaultConstructible(const CustomGadget_NonDefaultConstructible&) make[6]: *** [.obj/tst_qmetatype.o] Error 1 make[6]: Leaving directory `/home/anzyelay/Desktop/arm/qt-everywhere-opensource-src-5.6.0/qt-build0/qtbase/tests/auto/corelib/kernel/qmetatype' make[5]: *** [sub-qmetatype-make_first] Error 2 make[5]: Leaving directory `/home/anzyelay/Desktop/arm/qt-everywhere-opensource-src-5.6.0/qt-build0/qtbase/tests/auto/corelib/kernel' make[4]: *** [sub-kernel-make_first] Error 2 make[4]: Leaving directory `/home/anzyelay/Desktop/arm/qt-everywhere-opensource-src-5.6.0/qt-build0/qtbase/tests/auto/corelib' make[3]: *** [sub-corelib-make_first] Error 2 make[3]: Leaving directory `/home/anzyelay/Desktop/arm/qt-everywhere-opensource-src-5.6.0/qt-build0/qtbase/tests/auto' make[2]: *** [sub-auto-make_first] Error 2 make[2]: Leaving directory `/home/anzyelay/Desktop/arm/qt-everywhere-opensource-src-5.6.0/qt-build0/qtbase/tests' make[1]: *** [sub-tests-make_first] Error 2 make[1]: Leaving directory `/home/anzyelay/Desktop/arm/qt-everywhere-opensource-src-5.6.0/qt-build0/qtbase' make: *** [module-qtbase-make_first] Error 2
  • 解决方法
    参考
    升级交叉gcc/g++试试。
    目前我用的gcc/g++都是4.4.3版本的 anzyelay@ubuntu:build$ sudo apt-get install gcc-4.6-arm-linux-gnueabi anzyelay@ubuntu:build$ sudo apt-get install g++-4.6-arm-linux-gnueabi 安装好后用此版本重新编译下tslib,在编译QT,这会也出现了错误,不过这回是编译另一个东西出错, make[6]: *** [.obj/tst_qalgorithms.o] Error 1 make[6]: Leaving directory `/home/anzyelay/Desktop/arm/qt-everywhere-opensource-src-5.6.0/qt-build0/qtbase/tests/auto/corelib/tools/qalgorithms' make[5]: *** [sub-qalgorithms-make_first] Error 2 make[5]: Leaving directory `/home/anzyelay/Desktop/arm/qt-everywhere-opensource-src-5.6.0/qt-build0/qtbase/tests/auto/corelib/tools' make[4]: *** [sub-tools-make_first] Error 2 make[4]: Leaving directory `/home/anzyelay/Desktop/arm/qt-everywhere-opensource-src-5.6.0/qt-build0/qtbase/tests/auto/corelib' make[3]: *** [sub-corelib-make_first] Error 2 make[3]: Leaving directory `/home/anzyelay/Desktop/arm/qt-everywhere-opensource-src-5.6.0/qt-build0/qtbase/tests/auto' make[2]: *** [sub-auto-make_first] Error 2 make[2]: Leaving directory `/home/anzyelay/Desktop/arm/qt-everywhere-opensource-src-5.6.0/qt-build0/qtbase/tests' make[1]: *** [sub-tests-make_first] Error 2 make[1]: Leaving directory `/home/anzyelay/Desktop/arm/qt-everywhere-opensource-src-5.6.0/qt-build0/qtbase' make: *** [module-qtbase-make_first] Error 2
而上面tst_qmetatype这个东西是正常编译出来如下: ``` anzyelay@ubuntu:qt-build0$ ls qtbase/tests/auto/corelib/kernel/qmetatype/ Makefile target_wrapper.sh tst_qmetatype ``` 所以,确实是不同gcc/g++版本间,也会造成某些测试程序无法编译。我试过4.9.4的版本也有某些不能编译的,都是直接用-skip才完成的。QT也没说明。。