1. 程式人生 > >QNX 7.0 平臺QT開發環境配置

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