如有错误,欢迎批评指正!!!
Qt for Embeded Linux
这里着重讨,http://doc.qt.io/qt-5/embedded-linux.html
有多个平台插件可以在嵌入式Linux系统上使用:EGLFS,LinuxFB,KMS,DirectFB,Wayland。 这些的可用性取决于Qt的配置。 默认平台插件也是特定于设备的。 例如,在许多板上,选择eglfs作为默认板。 如果默认值不合适,则可以使用QT_QPA_PLATFORM环境变量参数来请求另一个插件。 或者,对于快速测试,-platform命令行可以使用相同的语法。
一、配置特定设备
为给定设备构建Qt需要一个工具链和一个sysroot。此外,一些设备需要针对EGL和OpenGL ES 2.0支持的供应商特定的适配代码。这与非加速平台不相关,例如使用LinuxFB插件的平台,这只适用于基于软件的渲染。这意味着Qt Quick 2在这样的设置中不起作用,因为它依赖于OpenGL进行渲染。
目录qtbase / mkspecs / devices包含多个设备的配置和图形适配代码。例如,linux-rasp-pi2-g ++ mkspec包含构建设置,例如Raspberry Pi 2设备的最佳编译器和链接器标志。 mkspec还包含关于eglfs钩子(供应商特定的适配代码)的实现或者对适当的eglfs设备集成插件的引用的信息。通过配置工具的-device参数选择设备。此参数后面的名称必须至少部分匹配设备下的其中一个子目录。
以下是Raspberry Pi 2的示例配置。对于大多数嵌入式Linux板,configure命令看起来类似:
./configure -release
-opengl es2
-device linux-rasp-pi2-g++
-device-option CROSS_COMPILE=$TOOLCHAIN/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-
-sysroot $ROOTFS
-prefix /usr/local/qt5
最重要的参数是-device和-sysroot。通过指定-sysroot,configure的特性检测测试使用的包含文件和库以及Qt本身从指定位置获取,而不是从主机PC的标准位置获取。这意味着在主机上安装开发包没有意义。例如,要获得libinput支持,在主机环境中安装libinput开发头和库是不够的或不必要的。相反,目标体系结构的头和库(例如ARM)必须存在于sysroot中。
在执行交叉编译时也支持pkg-config。 configure会自动设置PKG_CONFIG_LIBDIR以使pkg-config报告编译器和链接器设置基于sysroot而不是主机。这通常功能很好,没有任何进一步的调整。但是,在运行configure之前,必须为主机取消设置环境变量(如PKG_CONFIG_PATH)。否则,Qt构建可能尝试使用来自主机系统的不适当的标头和库。
指定-sysroot会导致在调用编译器时自动设置--sysroot参数。在某些情况下,这是不可取的,可以通过传递-no-gcc-sysroot来禁用配置。
-prefix,-extprefix和-hostprefix控制Qt构建的预期目标目录。在上面的例子中,Qt的ARM构建预计放在目标设备上的/ usr / local / qt5中。请注意,运行make install不会向设备部署任何内容。相反,安装步骤的目标是由extprefix指定的目录,默认为sysroot +前缀,因此是可选的。然而,在许多情况下,“污染”sysroot是不可取的,因此指定-extprefix变得重要。最后,-hostprefix允许从目标的二进制文件中分离主机工具,如qmake,rcc,uic。当给定时,这些工具将安装在指定的目录而不是extprefix。
二、嵌入式Linux设备的平台插件(Platform Plugins for Embedded Linux Devices)
EGLFS:
EGL是OpenGL和本地窗口系统之间的接口。 Qt可以使用EGL进行上下文和表面管理,但是API不包含平台特定:创建本地窗口(这不一定是屏幕上的实际窗口)仍然必须通过平台特定的方法来完成。 因此需要板或GPU特定的适配代码。 这样的适配或者作为eglfs钩提供,其可以是编译到平台插件中的单个源文件,或者作为动态加载的EGL设备集成插件。
EGLFS是一个平台插件,用于在没有实际窗口系统(如X11或Wayland)的EGL和OpenGL ES 2.0之上运行Qt5应用程序。 除了Qt Quick 2和原生OpenGL应用程序,它还支持软件渲染窗口(例如QWidget)。 在后一种情况下,小部件的内容使用CPU呈现为图像,然后上传到纹理并由插件合成。
这在支持GPU的嵌入式设备中鼓励使用。