QNX 7.0 平臺QT開發環境配置

 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

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章