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