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,有兩種方法獲得:
-
下載已釋出的定製版本,可以從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