1. QNX qt开发工具介绍
qnx 对 qt模块的支持
Qt是基于QNX Neutrino OS的嵌入式设备推荐的UI和应用程序开发平台之一。QNX Neutrino OS不是现成的软件包,而是嵌入式开发解决方案,Qt也是此解决方案的一部分。很久以前Qt已经移植到QNX,在QNX 社区还专门有一个Qt的专栏保证 qnx-qt用户的交流 http://community.qnx.com/sf/projects/qt/
Qt对于QNX的支持是如何的呢,QNX Neutrino RTOS 几乎支持所有Qt Essential 模块和一些附加组件,如下列出目前可在QNX Neutrino OS 平台上运行,并可用于常规构建和单元测试得模块:
Qt essential modules |
state |
notes |
Qt Core |
supported |
|
Qt Declarative |
not supported |
扫描二维码关注公众号,回复:
4080503 查看本文章
|
Qt GUI |
supported |
|
Qt Multimedia |
supported |
not supported on x86, a few known issues |
Qt Multimedia Widgets |
supported |
not supported on x86, a few known issues; no platformstyle |
Qt Network |
supported |
|
Qt QML |
supported |
|
Qt Quick |
supported |
|
Qt Quick Controls |
supported |
No platform style |
Qt Quick Dialogs |
supported |
Some native styles only |
Qt Quick Layouts |
supported |
|
Qt SQL |
supported |
|
Qt Test |
supported |
|
Qt WebKit QML |
not supported |
Depends on Qt Declarative |
Qt WebKit Widgets |
not supported |
Compiles and runs, but is not officially supported in 5.4 |
Qt Widgets |
supported |
No platform style |
Qt add ons |
state |
notes |
Active Qt |
not applicable |
|
Enginio |
not supported |
|
Qt Android Extras |
not applicable |
|
Qt Bluetooth |
not supported |
no OS backed defined yet |
Qt Concurrent |
supported |
|
Qt D-Bus |
not applicable |
|
Qt Graphical Effects |
supported |
|
Qt Image Formats |
supported |
|
Qt Mac Extras |
not applicable |
|
Qt NFC |
not supported |
no OS backed defined yet |
Qt OpenGL |
Only OpenGL ES 2 |
|
Qt Positioning |
not supported |
no OS backed defined yet |
Qt Print Support |
supported |
only printing to pdf |
Qt Quick1 |
not supported |
might work |
Qt Script |
supported |
|
Qt Tools |
supported |
|
Qt Sensors |
not supported |
no OS backed defined yet |
Qt Serial Port |
not supported |
a backend is available; a candidate for a future release |
Qt SVG |
supported |
|
Qt WebSockets |
not supported |
|
Qt Windows Extras |
not applicable |
|
Qt X11 Extras |
not applicable |
|
Qt XML |
supported |
|
Qt XML Patterns |
partly supported |
XPath functionality supported, XML schema validation not supported |
"supported" modules are provided in the binary Qt installers for QNX.
2. 为QNX Neutrino OS 构建Qt
要在 QNX 中使用Qt 首先就要获得Qt,有两种方法获得:
-
下载已发布的定制版本,可以从qnx 供应商获得,或者qt 公司获得。
-
克隆Qt git 源码库,使用主存储库一次构建所必须的子模块,并构建安装QtBase,然后逐个构建子模块作为单独的项目。详细可见
http://wiki.qt.io/Building_Qt_for_QNX_Neutrino_OS
你也可以自己用源码编译 详细可参考我的另一篇博客
此文是第一种方法。发布版本中包含了QNX 支持的所有 Qt Essential 模块(完整支持列表见 1.1小节)
Qt的使用可以分为两种:
第一种是用QNX SDP 7.0 提供的IDE Momentics 配置Qt 开发工具,
-
这种方法需要首先在QNX 官网获得Qt的使用liecnse key。然后在 QNX Software Center下载 Qt Runtime,所谓Qt Runtime 是包含除了Qt Quick Controls module 模块的基于 Qt 5.6.2版本的 QNX runtime 包。该包包括必要的生成可执行文件的编译工具(例如 qmxke,qcc等),还包括支持 QNX Neutrino RTOS 的库文件。下载完成以后,将下载的Qt 路径添加到系统环境变量中,以window为例 打开计算机——>属性——>高级——>环境变量在PATH 变量下添加变量值如下
C:\Users\oada\qnx700\qt\Qt5.6.2\win64\x86_64\target\x86_64\bin;C:\Users\oada\qnx700\qt\Qt5.6.2\win64\x86_64\target\x86_64
-
关机重启,打开命令行输入 qmake –query:结果如下所示:
-
上述截图说明 QNX 下的 qt配置正确,然后打开 Momentics IDE 配置Qt路径,打开windows——>Qt——>Qt installs 添加QMake的路径,如下图
-
然后就可以在IDE 下进行 Qt 应用程序的开发了。
第二种方法,对于有的开发pc 没有QNX 使用qt的license如何使用 上述版本的Qt Runtime Tools呢,很简单,可以用Qt Creator进行开发,或者Qt Creator 可以在Qt官网下载 4.3.1版本或者更高,至于为什么是4.3.1是QNX 说明文档里提供的,本文并未进行考证,测试了高版本的4.5.1可用,未出现问题
3. Qt应用程序开发和部署
设置 Qt Creator环境
首先必须手动将Qt for QNX 作为新的Qt 版本添加,配置编译器,调试器并创建工具包。
添加Qt版本
可以通过选择 Tools->Options->Build & Run>Qt Versions->Add,并在Qt for QNX构建中将路径设置为“qmake”。还需要指定QNX SDP 安装的路径,让Qt Creator验证新添加的Qt版本:
添加QCC编译器
选择Tools->Options->Build & Run->Compiler->Add->QCC并设置qcc编译器的路径(<QNX700_path>/host/<OS>/x86/usr/bin/qcc)。由于qcc依赖于某些特定于QNX的环境变量,因此还需要指定QNX SDP 安装的路径:
添加调试器
选择 Tools->Options->Build & Run->Debuggers 设置为ntoarmv7-GDB调试器(<qnx700_path>/host/<OS>/x86/usr/bin/ntoarmv7-gdb)。如果目标机是x86 选择ntox86-gdb:
添加QNX设备
选择 Tools->Options->Devices->Add->QNX Device 在Qt Creator注册QNX设备。
执行test 如果缺什么bin 文件可以在开发机上查找并复制到目标机对应的位置。
需要注意的是 QNX device的添加需要有一个安装了qnx 系统的硬件设备或者在vmware 中安装一个 QNX 系统。否则是无法正确添加 QNX 设备的,如果无法添加,则无法添加下面的开发套件也就无法进行编译。
添加套件
选择 Tools->Options->Build & Run->Kits->Add 添加一个新工具包,该工具包使用QNX设备,Qt 版本,编译器和调试器在上述步骤中进行设置:
4. 编译和部署
新建的工程完成,应用刚刚设置的工具包组建进行编译,编译成功,下一步就需要将Qt5 Runtime 部署到目标机上。为了使应用程序可执行,必须从要运行应用程序的位置访问Qt5 的lib, plugins和 qml import文件,有两种选择
-
将Qt Runtime 复制到目标版的对应位置上。
-
具有 Qt Runtime 和二进制文件的文件夹也可以通过NFS从板上安装,这种方式在日常开发过程中非常有用,因为文件保留在主机PC 上,并且可以更容易地修改,使开发测试周期非常短。
部署 Qt Runtime
将Qt安装中的“lib”,“plugins”,“qml”三个文件夹复制到QNX 文件系统中,目标文件夹位置无关紧要,只要可以被应用程序访问,并准确的添加到环境变量中即可。例如在/usr目录下新建qt5文件夹并将前面复制的三个文件夹拷贝到里面。
小注:为了精简系统,可以不把所有文件拷贝,具体需要什么文件就拷贝什么文件。
执行 应用程序
编译了应用程序以后,必须将将其部署(即复制)到QNX 系统中,然后可以从目标机的远程shell 中简单的执行应用程序二进制文件。但是有两个先决条件:
-
QNX 目标板已经运行“屏幕图形子系统”
-
Qt Runtime 环境变量的设置如下一节所述
在目标板子设置Qt5环境
Qt5应用程序需要能够在应用程序启动时找到Qt Runtime(lib,plugins,qml import)。因此,必须在QNX板上设置以下环境变量:
-
LD_LIBRARY_PATH 设置为 Qt 库路径 <Qt-install-path>/lib;
-
QT_PLUGIN_PATH 定义 Qt的插件位于何处,应设置为<Qt-install-path>/plugins;
-
QML2_IMPORT_PATH 定义 Qt Quick2 位于何处,应设置为<Qt-install-path>/qml;
-
QT_QPA_FONTDIR如果Qt 不使用fontconfig,还必须定义Qt所用字体的路径,可设置为<Qt-install-path>/lib/fonts;
-
QQNX_PHYSUCAL_SCREEN_SIZE 它以毫米为单位定义屏幕上应用程序显示区域的高度和宽度,一些启动映像定义全局启动时会设置此变量。也就是该变量决定最终显示在屏幕上的大小,可以设置为“150,90”(具体设置多少需要根据实际情况调整);
5. 平台和编译器说明
通过上边几个步骤的配置,不出意外现在可以在qt creator 下编译程序并把可执行文件部署到目标机上,然后执行即可。如果不能正常执行,请检查下面几条运行要求
Qt runtime 要求
Qt依赖于几个第三方组件和选定的OS服务的存在。因此,运行Qt的目标设备的QNX Neutrino RTOS启动映像必须满足几个要求,以确保Qt按预期工作。以下部分列出了Qt的关键部分。
QNX 屏幕图形子系统
在启动任何Qt应用程序之前,必须运行 QNX Screen Graphics Subsystem(也叫做“screen”),Screen 不仅包含驱动程序,还包括Qt 使用的几个实用程序和其他服务,包括处理鼠标和键盘事件。可以通过验证图形应用程序(例如gles2-gears,可以启动和运行没问题)来确保正确配置和运行Screen。
IPv6 支持
Qt 的网络堆栈需要启用IPv6支持。而不管实际网络是使用IPv4还是IPv6。这意味着,io-pkt-v6-hc必须运行,而不是io-pkt-v4。
Random 设备/dev/random
Qt要求/dev/random存在且功能齐全,在启动任何Qt应用程序之前或在系统启动期间启动它:
$ random -p
$ waitfor /dev/random
系统logger
QNX 提供针对嵌入式系统细节量身定做的slog2日志框架。它的主要优点是比文件输出更好的性能。Qt默认使用此框架来通过QNX Neutrino RTOS上的QDebug进行任何日志记录输出。Slog2应在系统启动期间启动该服务。slog2还依赖于/tmp下是否存在配置好的文件夹。例如:
[type=link] /tmp=/dev/shmem
display_msg "Starting slogger2..."
slogger2 -U1001:1000 &
waitfor /dev/slog2
环境变量
启动Qt应用程序时应该设置一组环境变量。其中大部分实际上并不特定于QNX Neutrino RTOS。上面已经提及到,这里只是完整性的做一下介绍。
Qt Runtime 的环境路径 见上面 需要注意的是如果Qt不使用fontconfig,则必须指定Qt中提供的字体路径并设置QT_QPA_FONTDIR=/usr/share/lib/fonts 。因为Qt5以后已经不再提供qt的fonts文件了,所以这个地方目前还是使用的fontconfig。
Physical Screen Size
Qt需要有关所连接显示器的物理尺寸的信息来确定DPI值,从而设置正确的字体大小。通常,此信息由屏幕提供,在某些情况下,可能会看到无效的屏幕尺寸。例如0mm*0mm。在这种情况下,Qt需要将环境变量QQNX_PHYSICAL_SCREEN_SIZE设置为对应值以获得所需的信息。如果Qt应用程序退出,并显示无法确定物理屏幕大小的错误信息,请在启动Qt应用程序之前设置此变量。
排除Qt应用程序的首次启动故障技巧
QNX Neutrino RTOS提供了的具大灵活性的唯一缺点是,目标仍然存在与Qt预期不同的风险。这是一个新的目标机上第一个Qt应用程序无法启动的非常常见的原因。有一些通用的环境变量可以帮助找到问题的根本原因:
-
设置QT_DEBUG_PLUGINS=1 可以帮助理解为什么QPA插件无法加载;
-
设置LD_DEBUG=1 可以查看在哪里以及如何加载共享库。这个变量可以与QT_DEBUG_PLUGINS无法加载插件时结合使用,因为它无法加载某些其他共享库;
另外 export LD_DEBUG=libs testapp 可以查看testapp运行时缺少什么加载库;
第三方库
为了使Qt应用程序正常运行,需要确保系统系统镜像中包含以下额外的第三方库,这些库并不总是包含在最小的 QNX Neutrino RTOS映像中:
-
Libfontconfig
-
Libfreetype
-
Libiconv
-
Libicui18n
-
Libicudata
-
Libicuuc
-
Libpng16
-
Libxml14
-
Libsqlite3
-
Libssl
-
Libcrypto
注:上述列表并不是Qt在QNX Neutrino OS上使用的共享库的完整列表。相当一部分共享库已经在定制OS映像中可用。或者由系统其它部分包含。例如通过 Screen。实际使用的时候,可以调试变量查看缺少什么库就添加什么库。
6. 注意事项与问题解决
开发过程中遇到过的问题以及解决方法记录在此作为参考
中文显示
下载中文支持的库,本文用的是google 的noto 字体,其中NotoSansCJKsc-Medium.otf 为所用的字体样式,将其添加到/usr/share/fonts文件夹下,同时设置环境变量:
export QT_QPA_FONTDIR=/usr/share/fonts
从而解决了中文字体显示乱码的问题。
Fontconfig 配置文件加载
在运行qt 应用程序过程中报错:
>> Fontconfig error: Cannot load default config file
解决方法:
-
一种方法 在qt runtime 的文件夹下新建一个fontconfig文件夹,并新建一个命为local.conf的配置文件,文件内容如下:
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<!-- /etc/fonts/fonts.conf file to configure system font access -->
<fontconfig>
<!-- Font directory list -->
<dir>/usr/share/fonts</dir>
<dir prefix="xdg">fonts</dir>
<!-- the following element will be removed in the future -->
<dir>~/.fonts</dir>
<!--
Accept deprecated 'mono' alias, replacing it with 'monospace'
-->
<match target="pattern">
<test qual="any" name="family">
<string>mono</string>
</test>
<edit name="family" mode="assign" binding="same">
<string>monospace</string>
</edit>
</match>
<!--
Accept alternate 'sans serif' spelling, replacing it with 'sans-serif'
-->
<match target="pattern">
<test qual="any" name="family">
<string>sans serif</string>
</test>
<edit name="family" mode="assign" binding="same">
<string>sans-serif</string>
</edit>
</match>
<!--
Accept deprecated 'sans' alias, replacing it with 'sans-serif'
-->
<match target="pattern">
<test qual="any" name="family">
<string>sans</string>
</test>
<edit name="family" mode="assign" binding="same">
<string>sans-serif</string>
</edit>
</match>
<!--
Load local system customization file
-->
<include ignore_missing="yes">conf.d</include>
<!-- Font cache directory list -->
<cachedir>/usr/fontconfig</cachedir>
<cachedir prefix="xdg">fontconfig</cachedir>
<!-- the following element will be removed in the future -->
<cachedir>~/.fontconfig</cachedir>
<config>
<!--
Rescan configuration every 30 seconds when FcFontSetList is called
-->
<rescan>
<int>30</int>
</rescan>
</config>
</fontconfig>
从而解决 load config file failed 的问题继而添加环境变量 export FONTCONFIG_FILE=/qt5/lib/fontconfig/local.conf
-
另外一种方法 也是如上新建一个local.conf 不同之处在于 不再添加 FONTCONFIG_FILE 环境变量而是添加:
export FONTCONFIG_PATH=/qt5/lib/fontconfig/
其实区别就在于找的是文件还是文件夹。
qnx lib not found or load 报错解决
报错如下:
# ./test
This application failed to start because it could not find or load the Qt platform plugin "qnx"
in "/usr/qt5/plugins/platforms".
Available platform plugins are: minimal (from /usr/qt5/plugins/platforms), offscreen (from /usr/qt5/plugins/platforms), qnx (from /usr/qt5/plugins/platforms), minimal, offscreen, qnx.
Reinstalling the application may fix this problem.
Abort (core dumped)
出现 找不到qnx 库的原因确认是否设置了相对应的 lib plugins qml 的环境变量,同时确认是否screen 正常启动了,其他原因可以参考 qt运行配置关于正确执行qt app的要求。
该错误的解决方法:
1. 首先在usr下新建 qt5 文件夹 把 交叉编译链中qt的 qml、lib和plugins 三个文件夹复制到 刚刚新建的qt5文件夹下。
2. 设置 环境变量 在etc 下 .profile 中添加 qt的环境变量 如下
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/qt5/lib
export QT_PLUGIN_PATH=/usr/qt5/plugins
export QML2_IMPORT_PATH=/usr/qt5/qml
export QQNX_PHYSICAL_SCREEN_SIZE=150,90
export QT_DEBUG_PLUGINS=1
export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/qt5/plugins/platforms
export QT_QPA_FONTDIR=/usr/qt5/lib/fonts
注意:/usr/qt5/ 是我在目标机存放 qt5 库的路径,具体设置的时候请改成实际的库存放路径。
3. 重启系统
4. 启动 screen
5. 添加 调试指令 缺什么库补什么库
export LD_DEBUG=libs openglwindow
6. 执行 $./openglwindow
参考链接:
http://doc.qt.io/archives/qt-5.10/configure-options.html
http://doc.qt.io/qt-5/configure-options.html
https://blog.csdn.net/liukang325/article/details/50456461