QNX 7.0 平台QT开发环境配置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/p942005405/article/details/83622727

 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

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,有两种方法获得:

  1. 下载已发布的定制版本,可以从qnx 供应商获得,或者qt 公司获得。

  2. 克隆Qt git 源码库,使用主存储库一次构建所必须的子模块,并构建安装QtBase,然后逐个构建子模块作为单独的项目。详细可见

http://wiki.qt.io/Building_Qt_for_QNX_Neutrino_OS

你也可以自己用源码编译 详细可参考我的另一篇博客

qt5.97移植到qnx7.0

此文是第一种方法。发布版本中包含了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文件,有两种选择

  1. 将Qt Runtime 复制到目标版的对应位置上。

  2. 具有 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_LOGGING_TO_CONSOLE将强制发送所有日志消息stderr而不是slog2。这对于分析应用程序启动问题非常方便,因为有日志消息就不需要使用其他工具来查看消息了。

第三方库

为了使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


 

猜你喜欢

转载自blog.csdn.net/p942005405/article/details/83622727