i.mx6q 移植Qt5.6.1(含opengl)
https://www.jianshu.com/p/370f4015a55c(2017.8.1更新:Qt5.9.1完美移植,支持QML请看这篇:http://www.jianshu.com/p/9cc782436ece)
开发板图片飞凌imx6q的开发板自带的qt版本是4.8.5的,版本太老,决定移植个LTS长期支持的新版本5.6。新版本对qt quick的支持很完善了,所以打算项目的程序用qml来开发,这样MVC架构代码与界面可以很好的分开来,降低各个功能模块之间的耦合度。但qt5要支持qt quick的话就必须让Qt支持opengl,如下官网http://doc.qt.io/qt-5/embedded-linux.html 所说:Building Qt for a given device requires a toolchain and a sysroot. Additionally, some devices require vendor-specific adaptation code for EGL and OpenGL ES 2.0 support. This is not relevant for non-accelerated platforms, for example the ones using the LinuxFB plugin, which is meant for software-based rendering only. This means Qt Quick 2 is not functional in such a setup as it depends on OpenGL for rendering.还好i.mx6Q技术手册写着是支持opengl功能的。下面开始:1. 下载qt5.6.1源码到官网:http://download.qt.io/archive/qt/5.6/5.6.1-1/single/找到qt-everywhere-opensource-src-5.6.1-1.tar.gz下载最新的qt5.6.1-1源码包。2. 解压qt5.6.1源码$ tar zxvf qt-everywhere-opensource-src-5.6.1-1.tar.gz -C ~/Workspace/qt-everywhere-opensource-src-5.6.1解压路径自己定,后面都是按这个路径来讲解的,注意修改成你们自己的。3. 解压交叉编译工具链将飞凌提供的gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12解压到此处(路径可自己修改):~/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/飞凌提供的百度网盘的gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12.tar 是有问题的(180M),正常是280M的,可以自行在网上按这个文件名另搜索个下载。4. 修改交叉编译工具到qmake.conf$ cd ~/Workspace/qt-everywhere-opensource-src-5.6.1$ vi qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf修改如下:## qmake configuration for building with arm-linux-gnueabi-g++#MAKEFILE_GENERATOR = UNIXCONFIG += incrementalQMAKE_INCREMENTAL_STYLE = sublibQT_QPA_DEFAULT_PLATFORM = linuxfb QMAKE_CFLAGS_RELEASE +=-O2 -march=armv7-aQMAKE_CXXFLAGS_RELEASE += -O2 -march=armv7-ainclude(../common/linux.conf)include(../common/gcc-base-unix.conf)include(../common/g++-unix.conf)# modifications to g++.confQMAKE_CC = arm-none-linux-gnueabi-gccQMAKE_CXX = arm-none-linux-gnueabi-g++QMAKE_LINK = arm-none-linux-gnueabi-g++QMAKE_LINK_SHLIB = arm-none-linux-gnueabi-g++# modifications to linux.confQMAKE_AR = arm-none-linux-gnueabi-ar cqsQMAKE_OBJCOPY = arm-none-linux-gnueabi-objcopyQMAKE_NM = arm-none-linux-gnueabi-nm -PQMAKE_STRIP = arm-none-linux-gnueabi-stripQMAKE_INCDIR += /home/volfull/Workspace/rootfs/usr/include QMAKE_LIBDIR += /home/volfull/Workspace/rootfs/usr/lib QMAKE_LIBDIR += /home/volfull/Workspace/rootfs/usr/lib QMAKE_INCDIR_OPENGL_ES2 = /home/volfull/Workspace/rootfs/usr/include QMAKE_LIBDIR_OPENGL_ES2 = /home/volfull/Workspace/rootfs/usr/lib QMAKE_INCDIR_EGL = /home/volfull/Workspace/rootfs/usr/include QMAKE_LIBDIR_EGL = /home/volfull/Workspace/rootfs/usr/lib QMAKE_LIBS_OPENGL_ES1 += -lGLESv1_CM -lEGL -lGAL QMAKE_LIBS_OPENGL_ES1CL += -lGLES_CL -lEGL -lGAL QMAKE_LIBS_EGL += -lEGL QMAKE_LIBS_OPENGL_ES2 += -lGLESv2 -lEGL -lGAL QMAKE_LIBS_OPENVG += -lOpenVG -lEGL -lGAL #QMAKE_LIBS += -ljpeg -ldbus-1 -lrt -lpthread #编译选项 #DISTRO_OPTS += hard-float #浮点运算使用软件不使用硬件 # Preferred eglfs backend EGLFS_DEVICE_INTEGRATION = eglfs_viv include(../common/linux_arm_device_post.conf) load(qt_config)上面的配置是已经包含了opengl需要的参数;/home/volfull/Workspace/rootfs/ 为飞凌开发板的文件系统,在飞凌提供的百度网盘上面可以找到;arm-none-linux-gnueabi- 为飞凌提供的交叉工具链;5. 增加编译脚本build.sh$ cd ~/Workspace/qt-everywhere-opensource-src-5.6.1$ vi build.sh./configure -release -opensource -confirm-license -no-c++11 -no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2 -no-avx -no-avx2 -no-mips_dsp -no-mips_dspr2 -no-opengl -opengl es2 -qt-zlib -no-mtdev -qt-sql-sqlite -qt-libpng -qt-libjpeg -qt-freetype -qt-harfbuzz -no-openssl -no-xinput2 -no-xcb-xlib -no-glib -nomake examples -make libs -nomake tools -nomake tests -gui -widgets -optimized-qmake -no-nis -no-cups -no-iconv -no-tslib -no-icu -no-fontconfig -strip -no-pch -no-dbus -force-asserts -no-xcb -no-directfb -linuxfb -no-kms -qpa linux -xplatform linux-arm-gnueabi-g++ -libinput -no-gstreamer -no-system-proxies -prefix ~/qt5.6.1-1-arm -vchmod +x build.sh-prefix ~/qt5.6.1-1-arm -v 为后面make install 时安装的路径,自行修改;6. 交叉编译opengl所需的库(1)下载 expat网址是http://sourceforge.net/projects/expat/files/expat/ ,解压在 /opt/EmbedRigol/文件夹下,完整路径是 /opt/EmbedRigol/expat-2.1.0 ;进入该路径后执行如下命令:CC=arm-none-linux-gnueabi-gcc ./configure --host=arm-linux --prefix=/opt/EmbedRigol/install-dev/expat-2.1.0其中安装路径是 /opt/EmbedRigol/install-dev/expat-2.1.0;makemake install(2)下载 libdbus.so源码的下载网址为http://dbus.freedesktop.org/releases/dbus/ ,我这里下载 1.2.30 版本;解压在 /opt/EmbedRigol/ 文件夹下,完整路径是 /opt/EmbedRigol/dbus-1.2.30;进入源码目录,执行下面的语句进行编译配置:CC=arm-none-linux-gnueabi-gcc ./configure CFLAGS=-I/opt/EmbedRigol/install-dev/expat-2.1.0/include LDFLAGS=-L/opt/EmbedRigol/install-dev/expat-2.1.0/libmakemake install将 /opt/EmbedRigol/install-dev/dbus-1.2.30/lib 文件夹下libdbus-1.so 相关的文件拷贝到开发板文件系统的rootfs的 lib 文件夹下;出错处理:以上2个库make install时会报错,说arm-linux-ranlib找不到;在它们解压源码根目录下运行: vi libtool ,找到RANLIB="arm-linux-ranlib",将其修改为(路径记得改成你们自己的):RANLIB="/home/volfull/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-ranlib"7. 添加交叉编译工具链路径到环境变量$ PATH=~/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin:$PATH8. 交叉编译Qt$ cd ~/Workspace/qt-everywhere-opensource-src-5.6.1$ ./build.sh结果如下:Build options: Configuration .......... accessibility alsa audio-backend clock-gettime clock-monotonic compile_examples concurrent cross_compile eglfs_viv enable_new_dtags evdev eventfd force_asserts freetype full-config getaddrinfo getifaddrs harfbuzz inotify ipv6ifname large-config largefile linuxfb medium-config minimal-config mremap no-pkg-config opengl opengles2 pcre png posix_fallocate qpa qpa reduce_exports release release_tools rpath shared small-config threadsafe-cloexec zlib Build parts ............ libs Mode ................... release; optimized tools Using sanitizer(s)...... none Using C++ standard ..... c++98 Using gold linker....... no Using new DTAGS ........ yes Using PCH .............. no Using LTCG ............. no Target compiler supports: Neon ................. noQt 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 ..... noSupport enabled for: Accessibility .......... yes ALSA ................... yes 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 ............... yes (OpenGL ES 2.0+) OpenVG ............... no PCRE ................... yes (bundled copy) pkg-config ............. no PulseAudio ............. no QPA backends: DirectFB ............. no EGLFS ................ no EGLFS i.MX6 ........ yes 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 .................. no 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.Cannot read /home/volfull/Workspace/qt-everywhere-opensource-src-5.6.1/qtbase/mkspecs/common/linux_arm_device_post.conf: No such file or directory NOTICE: The -no-c++11 / --c++-level=c++98 option is deprecated. Qt 5.7 will require C++11 support. The options are in effect for this Qt 5.6 build, but you should update your build scripts to remove the option and, if necessary, upgrade your compiler.Qt is now configured for building. Just run 'make'.Once everything is built, you must run 'make install'.Qt will be installed into /home/volfull/qt5.6.1-1-armPrior to reconfiguration, make sure you remove any leftovers fromthe previous build.$ make$ make install按照上面的流程下来,应该是不会出现任何问题的。make install 后即可在~/qt5.6.1-1-arm 找到编译好的qt库,将这个文件夹全部拷贝到开发板上完成qt移植工作。tslib触摸屏的库移植自行网上搜索。附带开发板上qt5.6.1的环境变量(QT_ROOT 是你开发板上qt5.6.1的路径):##qt5.6.1-1export QT_ROOT=/opt/qt5.6.1-1-armexport PATH=$QTDIR/bin:$PATHexport LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:$QT_ROOT/libexport QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/pluginsexport QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0export QT_QPA_FONTDIR=$QT_ROOT/lib/fontsexport QML2_IMPORT_PATH=$QT_ROOT/qml遗留问题:qt quick的相关库是编译出来了,但用qml写的程序放到开发板上运行不了,提示:root@freescale /home/app$ ./qml_testQML debugging is enabled. Only use this in a safe environment.jzw;pwm_backlight_update_status:s_bl_en=1This plugin does not support createPlatformOpenGLContext!Failed to create OpenGL context for format QSurfaceFormat(version 2.0, options QFlags(), depthBufferSize 24, redBufferSize -1, greenBufferSize -1, blueBufferSize -1, alphaBufferSize -1, stencilBufferSize 8, samples -1, swapBehavior 2, swapInterval 1, profile 0)Aborted目前还没找到解决方法,所以跑qml最后还是悲剧收场*&*,如果你们有办法的话也请告诉我一下。。。qt4.8.5跑自带的demo ./fluidlauncher 2秒就起来了,qt5.6.1跑最简单自建的C++写的模板程序需要9秒才能起来,这速度够慢的。