QNX 7.0平台QT开发环境配置

QNX –Qt 开发

目录

QNX –Qt 开发文档 1

1 QNX Qt开发工具 2

1.1 qnx 对 qt模块的支持 2

1.2 为QNX Neutrino OS 构建Qt 3

2 Qt应用程序开发和部署 6

2.1 设置 Qt Creator环境 6

2.1.1 添加Qt版本 6

2.1.2 添加QCC编译器 6

2.1.3 添加调试器 7

2.1.4 添加QNX设备 7

2.1.5 添加套件 9

2.2 编译和部署 9

2.2.1 部署 Qt Runtime 9

2.2.2 执行 应用程序 10

2.2.3 在目标板子设置Qt5环境 10

3 平台和编译器说明 10

3.1 Qt runtime 要求 10

3.1.1 QNX 屏幕图形子系统 10

3.1.2 IPv6 支持 11

3.1.3 Random 设备/dev/random 11

3.1.4 系统logger 11

3.1.5 环境变量 11

3.1.6 排除Qt应用程序的首次启动故障技巧 12

3.1.7 第三方库 12

4 注意事项与问题解决 12

4.1 中文显示 13

4.2 Fontconfig 配置文件加载 13

4.3 无法root ssh 登录qnx 15

4.4 编译中关于eigen报错 15

4.5 qnx lib not found or load 报错解决 16

4.6 libpng warning 警告解决 17

4.7 一些常用指令 17

 

  1. QNX Qt开发工具

    1. 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.

 

  1. 为QNX Neutrino OS 构建Qt

要在 QNX 中使用Qt 首先就要获得Qt,有两种方法获得:

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

  2. 克隆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

QNX 7.0平台QT开发环境配置

  • 关机重启,打开命令行输入 qmake –query:结果如下所示:

QNX 7.0平台QT开发环境配置

  • 上述截图说明 QNX 下的 qt配置正确,然后打开 Momentics IDE 配置Qt路径,打开windows——>Qt——>Qt installs 添加QMake的路径,如下图

QNX 7.0平台QT开发环境配置

  • 然后就可以在IDE 下进行 Qt 应用程序的开发了。

第二种方法,对于有的开发pc 没有QNX 使用qt的license如何使用 上述版本的Qt Runtime Tools呢,很简单,可以用Qt Creator进行开发,或者Qt Creator 可以在Qt官网下载 4.3.1版本或者更高,至于为什么是4.3.1是QNX 说明文档里提供的,本文并未进行考证,测试了高版本的4.5.1可用,未出现问题。

 

  1. Qt应用程序开发和部署

    1. 设置 Qt Creator环境

首先必须手动将Qt for QNX 作为新的Qt 版本添加,配置编译器,调试器并创建工具包。

    1. 添加Qt版本

可以通过选择 Tools->Options->Build & Run>Qt Versions->Add,并在Qt for QNX构建中将路径设置为“qmake”。还需要指定QNX SDP 安装的路径,让Qt Creator验证新添加的Qt版本:

QNX 7.0平台QT开发环境配置

    1. 添加QCC编译器

选择Tools->Options->Build & Run->Compiler->Add->QCC并设置qcc编译器的路径(<QNX700_path>/host/<OS>/x86/usr/bin/qcc)。由于qcc依赖于某些特定于QNX的环境变量,因此还需要指定QNX SDP 安装的路径:

QNX 7.0平台QT开发环境配置

    1. 添加调试器

选择 Tools->Options->Build & Run->Debuggers 设置为ntoarmv7-GDB调试器(<qnx700_path>/host/<OS>/x86/usr/bin/ntoarmv7-gdb)。如果目标机是x86 选择ntox86-gdb:

QNX 7.0平台QT开发环境配置

    1. 添加QNX设备

选择 Tools->Options->Devices->Add->QNX Device 在Qt Creator注册QNX设备。

QNX 7.0平台QT开发环境配置

 

执行test 如果缺什么bin 文件可以在开发机上查找并复制到目标机对应的位置。

QNX 7.0平台QT开发环境配置

需要注意的是 QNX device的添加需要有一个安装了qnx 系统的硬件设备或者在vmware 中安装一个 QNX 系统。否则是无法正确添加 QNX 设备的,如果无法添加,则无法添加下面的开发套件也就无法进行编译。

    1. 添加套件

选择 Tools->Options->Build & Run->Kits->Add 添加一个新工具包,该工具包使用QNX设备,Qt 版本,编译器和调试器在上述步骤中进行设置:

QNX 7.0平台QT开发环境配置

  1. 编译和部署

新建的工程完成,应用刚刚设置的工具包组建进行编译,编译成功,下一步就需要将Qt5 Runtime 部署到目标机上。为了使应用程序可执行,必须从要运行应用程序的位置访问Qt5 的lib, plugins和 qml import文件,有两种选择

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

  2. 具有 Qt Runtime 和二进制文件的文件夹也可以通过NFS从板上安装,这种方式在日常开发过程中非常有用,因为文件保留在主机PC 上,并且可以更容易地修改,使开发测试周期非常短。

    1. 部署 Qt Runtime

将Qt安装中的“lib”,“plugins”,“qml”三个文件夹复制到QNX 文件系统中,目标文件夹位置无关紧要,只要可以被应用程序访问,并准确的添加到环境变量中即可。例如在/usr目录下新建qt5文件夹并将前面复制的三个文件夹拷贝到里面。

小注:为了精简系统,可以不把所有文件拷贝,具体需要什么文件就拷贝什么文件。

    1. 执行 应用程序

编译了应用程序以后,必须将将其部署(即复制)到QNX 系统中,然后可以从目标机的远程shell 中简单的执行应用程序二进制文件。但是有两个先决条件:

  • QNX 目标板已经运行“屏幕图形子系统”

  • Qt Runtime 环境变量的设置如下一节所述

    1. 在目标板子设置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”(具体设置多少需要根据实际情况调整);

 

  1. 平台和编译器说明

通过上边几个步骤的配置,不出意外现在可以在qt creator 下编译程序并把可执行文件部署到目标机上,然后执行即可。如果不能正常执行,请检查下面几条运行要求

  1. Qt runtime 要求

Qt依赖于几个第三方组件和选定的OS服务的存在。因此,运行Qt的目标设备的QNX Neutrino RTOS启动映像必须满足几个要求,以确保Qt按预期工作。以下部分列出了Qt的关键部分。

    1. QNX 屏幕图形子系统

在启动任何Qt应用程序之前,必须运行 QNX Screen Graphics Subsystem(也叫做“screen”),Screen 不仅包含驱动程序,还包括Qt 使用的几个实用程序和其他服务,包括处理鼠标和键盘事件。可以通过验证图形应用程序(例如gles2-gears,可以启动和运行没问题)来确保正确配置和运行Screen。

    1. IPv6 支持

Qt 的网络堆栈需要启用IPv6支持。而不管实际网络是使用IPv4还是IPv6。这意味着,io-pkt-v6-hc必须运行,而不是io-pkt-v4。

    1. Random 设备/dev/random

Qt要求/dev/random存在且功能齐全,在启动任何Qt应用程序之前或在系统启动期间启动它:

$ random -p

$ waitfor /dev/random

 

    1. 系统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

 

    1. 环境变量

启动Qt应用程序时应该设置一组环境变量。其中大部分实际上并不特定于QNX Neutrino RTOS。上面已经提及到,这里只是完整性的做一下介绍。

Qt Runtime 的环境路径 见2.2.3节 需要注意的是如果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应用程序之前设置此变量。见2.2.3节。

    1. 排除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。这对于分析应用程序启动问题非常方便,因为有日志消息就不需要使用其他工具来查看消息了。

    1. 第三方库

为了使Qt应用程序正常运行,需要确保系统系统镜像中包含以下额外的第三方库,这些库并不总是包含在最小的 QNX Neutrino RTOS映像中:

  • Libfontconfig

  • Libfreetype

  • Libiconv

  • Libicui18n

  • Libicudata

  • Libicuuc

  • Libpng16

  • Libxml14

  • Libsqlite3

  • Libssl

  • Libcrypto

注:上述列表并不是Qt在QNX Neutrino OS上使用的共享库的完整列表。相当一部分共享库已经在定制OS映像中可用。或者由系统其它部分包含。例如通过 Screen。实际使用的时候,可以结合3.1.6中的调试变量查看缺少什么库就添加什么库。

  1. 注意事项与问题解决

开发过程中遇到过的问题以及解决方法记录在此作为参考

  1. 中文显示

下载中文支持的库,本文用的是google 的noto 字体,其中NotoSansCJKsc-Medium.otf 为所用的字体样式,将其添加到/usr/share/fonts文件夹下,同时设置环境变量:

export QT_QPA_FONTDIR=/usr/share/fonts

从而解决了中文字体显示乱码的问题。

  1. 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>

继而添加环境变量 export FONTCONFIG_FILE=/qt5/lib/fontconfig/local.conf

从而解决 load config file failed 的问题

  • 另外一种方法 也是如上新建一个local.conf 不同之处在于 不再添加 FONTCONFIG_FILE 环境变量而是添加:

export FONTCONFIG_PATH=/qt5/lib/fontconfig/

其实区别就在于找的是文件还是文件夹。

  1. 无法root ssh 登录qnx

无法以root账户 ssh登录qnx 解决方法

因为root 没有打开权限

开启ssh服务

  • vi /etc/ssh/sshd_config

 

修改文件内容,更改#PermitRootLogin no为PermitRootLogin yes. 然后依次执行

  • slay sshd

  • ssh-****** -t dsa -f /etc/ssh/ssh_host_dsa_key

  • ssh-****** -t rsa -f /etc/ssh/ssh_host_rsa_key

  • mkdir -p /var/chroot/sshd/etc

  • chown -R root.root /var/chroot/sshd

  • chmod 744 /var/chroot/sshd

  • /usr/sbin/sshd

第一行的命令slay sshd应该会输出slay: Unable to find process sshd的提示,应该本来就没有ssh进程在运行. 

上述命令仅仅是开启ssh服务,但是在远程ssh时,由于root用户并没有密码,是不能完成登录的.所以需要执行

  • passwd

给root用户创建密码.这个时候就可以使用远程主机ssh登录了

  1. 编译中关于eigen报错

编译合好的代码 ,出现问题,提示eigen 中某些模板不匹配的问题

如下:

Description Resource Path Location Type

template-id 'pmul<Eigen::internal::Packet4f>' for 'Eigen::internal::Packet4f Eigen::internal::pmul(const Packet4f&, const Packet4f&)' does not match any template declaration testproject line 219, external location: /home/panda/qnx700/target/qnx7/x86_64/usr/local/include/eigen3/Eigen/src/Core/arch/SSE/PacketMath.h C/C++ Problem

解决方法是在makefile里面加入 如下编译指令

CCFLAGS_debug += -D_EIGEN_DONT_VECTORIZE

上面指令的意思是 给编译过程中添加一条宏定义,

但是 因为 我的编译环境是要依赖与qt 所以需通过qmake编译,通过查找,qmake 添加额外的参数有两种方式,一种是修改qmake.conf(对应平台的例如x86-64),另一种就是修改.pro文件,通过查找qmake 手册,查到 qmake 中有QMAKE_CFLAGS 与 QMAKE_CFLAGS_DEBUG 可供使用,但是 通过类比于makefile中的添加方法,添加 QMAKE_CFLAGS_DEBUG += -D_EIGEN_DONT_VECTORIZE 无法通过编译,依然存在一样的错误,

最终 添加如下指令使编译通过:

QMAKE_CFLAGS_DEBUG += -D_EIGEN_DONT_VECTORIZE

DEFINES += EIGEN_DONT_VECTORIZE

 

  1. qnx lib not found or load 报错解决

报错如下:

# ./qnxwidgettest

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 库的原因可以参考 2.2.3小节确认是否设置了相对应的 lib plugins qml 的环境变量,同时确认是否screen 正常启动了,其他原因可以参考 3.1节关于正确执行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

  1. libpng warning 警告解决

报错如下:

libpng warning: iCCP: known incorrect sRGB profile 错误

原因解释:QT中引用png图片经常遇到这类警告,但是他没有影响,不必担心,不过我们还是要考究一下原因的。

sRGB是标准色彩的意思。

这段话意思就是这个图片不是标准的色彩结构。很多ps修过的图,还有QQ截图在引用的时候都会有这个警告。估计这个是因为色彩检查和实际的色彩不一致导致的,一个执行标准色彩检查,而图片却不是。故转换一下就可解决

解决方法:在 Ubuntu 下应用 convert指令 转化一下就可以了

convert infile.png outfile.png

 

  1. 一些常用指令

查看磁盘大小指令: df -h

查看系统进程: top