Qt für VxWorks

Kontaktieren Sie The Qt Company für weitere Informationen: https://www.qt.io/contact-us/

Qt für VxWorks-Lizenzierung

Qt für VxWorks ist unter der Qt for Device Creation Professional (DCP) Lizenz erhältlich. Weitere Informationen finden Sie unter Qt-Preise.

Unterstützte Architekturen und VxWorks-Versionen

Qt 6.9 ist auf VxWorks 24.03 verifiziert.

Unterstützte Architekturen:

  • ARM-v7-getestet auf BD-SL-i.MX6. Verwendetes BSP: fsl_imx6
  • x86_64-getestet auf Intel NUC6i3SYH. Verwendetes BSP: itl_generic

Wenn Sie an späteren Qt-Versionen interessiert sind, wenden Sie sich bitte an Qt Professional Services.

Anforderungen für VxWorks

Qt Widgets Anwendungen

  • POSIX-Unterstützung
  • C++17-Unterstützung

Qt Quick 2 Anwendungen

Alle Funktionen, die für Qt Widgets Anwendungen erforderlich sind, und zusätzlich die folgenden:

  • GPU-Gerät (GPUDEV) für OpenGL ES 2.0

Unterstützte Module

Die meisten wesentlichen Qt-Module und einige Zusatzmodule werden unterstützt.

Unterstützte wesentliche Module

Qt-ModulHinweise
Qt CoreKeine Unterstützung für QProcess. QLocalSocket und QLocalServer unterstützen nur SOCK_SEQPACKET.
Qt GUINicht anwendbar
Qt NetworkNicht zutreffend
Qt QmlNicht zutreffend
Qt QuickNicht zutreffend
Qt Quick ControlsNicht zutreffend
Qt Quick DialogsNicht anwendbar
Qt Quick LayoutsNicht anwendbar
Qt Quick TestNicht anwendbar
Qt TestNicht anwendbar
Qt WidgetsNicht anwendbar

Unterstützte Add-Ons

Hinweis: Sie können nicht unterstützte oder nicht verwendete Module explizit vom Build ausschließen, indem Sie die Option -skip <module> beim Ausführen des configure-Tools verwenden.

Plattform-Hinweise

Qt ist für die Verwendung durch RTP-Anwendungen vorbereitet, es gibt keine Unterstützung für DKM.

Mit der Veröffentlichung von Qt 5.0 enthält Qt keine eigene Implementierung des Fenstersystems mehr: QWS ist keine unterstützte Plattform mehr. Für Single-Process-Anwendungen ist die Qt Platform Abstraction eine bessere Lösung.

Es gibt ein Plugin, das auf VxWorks verwendbar ist: EGLFS. Die Verfügbarkeit dieses Plugins hängt von der Konfiguration von Qt ab.

Konfigurieren für ein bestimmtes Gerät

Bereiten Sie Ihre Umgebung vor, indem Sie das VxWorks SDK installieren und eine WindRiver-Lizenz erwerben, die vom Installationsprogramm und für die Erstellung von VxWorks-Images benötigt wird. Suchen Sie nach dem entsprechenden Installationsprogramm unter {https://gallery.windriver.com/portal/products}.

Die Erstellung von Qt für ein bestimmtes Gerät erfordert eine Qt 6-Installation für den Kompilierungshost, eine Toolchain und eine Sysroot. Zusätzlich benötigen einige Geräte herstellerspezifischen Anpassungscode für EGL und OpenGL 2.0 Unterstützung.

VxWorks Image Anforderungen

Qt für VxWorks erfordert bestimmte VxWorks-Image-Bundles und -Komponenten, die in die Basissoftware eingebettet werden müssen, damit Qt kompiliert und ordnungsgemäß funktioniert. Die Liste ist keineswegs vollständig, da sie von den Hardware-, Software- und Systemanforderungen Ihres Projekts abhängt. Die folgende Tabelle enthält jedoch diejenigen, die für das Funktionieren bestimmter Funktionen (einschließlich Touchscreen-Unterstützung) zwingend erforderlich sind. Beachten Sie auch, dass sich diese mit den verschiedenen VxWorks-Versionen ändern können.

Beispiel einer VSB-Konfiguration für die BSPs fsl_imx6 und itl_generic

Sie müssen die folgenden Features zu VSB hinzufügen, damit Qt richtig funktioniert. Für weitere Details lesen Sie bitte die WindRiver VxWorks Dokumentation.

MerkmalHinweise
DSI_DSI_KERNELNicht zutreffend
IPNET_COREIPNicht zutreffend
IPNET_DHCPCNicht anwendbar
SDMMC_DEVICENicht zutreffend
SDMMC_HOSTNicht anwendbar
SDMMC_SDHCNicht anwendbar
SDMMC_STORAGENicht anwendbar
SERVICE_UNNicht anwendbar
SOCKETNicht anwendbar
USB_EHCINicht anwendbar
USB_KEYBOARDNicht anwendbar
USB_MOUSENicht anwendbar
USB_STORAGENicht anwendbar
USB_TOUCHSCREENNicht anwendbar
EVDEVNicht anwendbar
EVDEV_LIBNicht anwendbar
EVDEV_TI_TSC2004_TSNicht anwendbar
EVDEV_EETI_EXC7200_TSNicht anwendbar
AUDIONicht anwendbar
GPUDEV_FSLVIVGPUfsl_imx6 spezifisch
HASHNicht zutreffend
OPENSSLNicht zutreffend
RANDOM_ENTROPY_INJECTNicht zutreffend
IPNET_SSHNicht zutreffend
USER_MANAGEMENTNicht zutreffend
ICUNicht anwendbar
DRMitl_generisch spezifisch
ITLI915itl_generisch spezifisch
LIBDRMitl_generisch spezifisch
MESAitl_generisch spezifisch

Die folgenden Konfigurationsvariablen werden implizit hinzugefügt und Sie müssen sie entfernen:

VariableAnmerkungen
_WRS_CONFIG_EVDEV_OPTIMIZED_MODENicht zutreffend
_WRS_CONFIG_EVDEV_DISPLAY_POINT_TRANSLATENicht zutreffend
_WRS_CONFIG_MESA_MANGLEitl_generisch spezifisch

Sie müssen die folgenden Variablen in der Konfiguration hinzufügen:

VariableWertHinweise
_WRS_CONFIG_RTP_SSPyNicht zutreffend
_WRS_CONFIG_RTP_STACK_PROTECTORyNicht zutreffend
_WRS_CONFIG_MESA_GPUDEV_INTEL_GEN90yitl_generic spezifisch
_WRS_CONFIG_EVDEV_COMPATIBLE_MODEyWird benötigt, damit Qt richtig mit einem Touchscreen funktioniert.

Beispiel VIP Konfiguration für fsl_imx6 und itl_generic BSPs

Für weitere Details lesen Sie bitte die WindRiver VxWorks Dokumentation.

BündelHinweise
BUNDLE_POSIXDieses Bundle ist notwendig für die Kompatibilität mit POSIX-bezogenen Funktionalitäten, die Qt benötigt.
BUNDLE_RTP_DEPLOYNicht zutreffend
BUNDLE_RTP_DEVELOPNicht zutreffend
BUNDLE_STANDALONE_SHELLNicht zutreffend
KomponenteAnmerkungen
INCLUDE_TMP_DIR INCLUDE_RAM_DISK_FORMAT_HRFSDie Einbeziehung dieser beiden Komponenten ist notwendig, wenn Sie QTemporaryFile verwenden wollen. Beachten Sie, dass Sie auch TMP_DIR_SIZE auf einen geeigneten Wert setzen sollten.
DRV_AUDIO_FSL_SSINicht zutreffend
DRV_AUDIO_FSL_SGTL5000Nicht zutreffend
DRV_FSL_SDHC_CTRLNicht zutreffend
DRV_IMX_SDHC_CTRLNicht zutreffend
INCLUDE_EHCI_INITNicht zutreffend
INCLUDE_FSL_IMX6Q_SABRELITENicht anwendbar
DRV_MMCSTORAGE_CARDNicht anwendbar
DRV_SDSTORAGE_CARDNicht anwendbar
INCLUDE_AUDIO_LIB_CORENicht anwendbar
INCLUDE_AUDIO_LIB_WAVNicht anwendbar
INCLUDE_CUSTOM_ENTROPY_ADDNicht anwendbar
INCLUDE_DEBUG_AGENT_STARTNicht anwendbar
INCLUDE_DEFAULT_TIMEZONENicht anwendbar
INCLUDE_DISK_UTILNicht anwendbar
INCLUDE_DOSFSNicht anwendbar
INCLUDE_DSAPARAM_CMDNicht anwendbar
INCLUDE_ENDNicht anwendbar
INCLUDE_EVDEV_LIB_CORENicht anwendbar
INCLUDE_EVDEV_LIB_KBDNicht anwendbar
INCLUDE_EVDEV_LIB_KBD_MAP_USNicht anwendbar
INCLUDE_EVDEV_LIB_PTRNicht anwendbar
INCLUDE_EVDEV_LIB_TSNicht anwendbar
INCLUDE_GENDSA_CMDNicht anwendbar
INCLUDE_GENRSA_CMDNicht anwendbar
INCLUDE_GETADDRINFONicht anwendbar
INCLUDE_GETNAMEINFONicht anwendbar
INCLUDE_HRFSNicht anwendbar
INCLUDE_HRFS_ACCESS_TIMESTAMPNicht anwendbar
INCLUDE_HRFS_FORMATNicht anwendbar
INCLUDE_HRFS_HISPEED_WRITE_MODENicht anwendbar
INCLUDE_IFCONFIGNicht zutreffend
INCLUDE_IO_REALPATHDiese Komponente wird benötigt, um die Verwendung der Realpath-Funktion zu ermöglichen, die für QFileInfo
INCLUDE_IPATTACHNicht zutreffend
INCLUDE_IPCOM_SYSLOGD_CMDNicht zutreffend
INCLUDE_IPCOM_SYSVAR_CMDNicht zutreffend
INCLUDE_IPCOM_USE_RAM_DISKNicht zutreffend
INCLUDE_IPCOM_USE_TIME_CMDNicht zutreffend
INCLUDE_IPDHCPCNicht anwendbar
INCLUDE_IPDNSCNicht anwendbar
INCLUDE_IPD_CMDNicht anwendbar
INCLUDE_IPFTPCNicht anwendbar
INCLUDE_IPFTP_CMDNicht anwendbar
INCLUDE_IPIFCONFIG_CMDNicht anwendbar
INCLUDE_IPNETSTAT_CMDNicht anwendbar
INCLUDE_IPNSLOOKUP_CMDNicht anwendbar
INCLUDE_IPPING_CMDNicht anwendbar
INCLUDE_IPROUTE_CMDNicht anwendbar
INCLUDE_IPTRACE_ROUTE_CMDNicht anwendbar
INCLUDE_IPWRAP_GETHOSTBYADDRNicht anwendbar
INCLUDE_IPWRAP_GETHOSTBYNAMENicht anwendbar
INCLUDE_IPWRAP_GETNAMEINFONicht anwendbar
INCLUDE_IPWRAP_IFNAMENicht anwendbar
INCLUDE_IPWRAP_ROUTECMDNicht anwendbar
INCLUDE_MMAPNicht anwendbar
INCLUDE_PINGNicht anwendbar
INCLUDE_PIPESNicht anwendbar
INCLUDE_POSIX_MAPPED_FILESNicht anwendbar
INCLUDE_POSIX_PIPESNicht anwendbar
INCLUDE_POSIX_PTHREAD_SCHEDULERNicht anwendbar
INCLUDE_POSIX_SHMNicht anwendbar
INCLUDE_RAM_DISKNicht anwendbar
INCLUDE_RAM_DISK_FORMAT_HRFSNicht anwendbar
INCLUDE_RANDOM_NUM_GENNicht anwendbar
INCLUDE_ROMFSNicht anwendbar
INCLUDE_ROUTECMDNicht anwendbar
INCLUDE_SC_PIPENicht anwendbar
INCLUDE_SC_POSIX_PIPENicht anwendbar
INCLUDE_SD_BUSNicht anwendbar
INCLUDE_SECURITYNicht anwendbar
INCLUDE_SEC_KEY_STORE_CMDNicht anwendbar
INCLUDE_SHELLNicht anwendbar
INCLUDE_SSHNicht anwendbar
INCLUDE_STANDALONE_SYM_TBLNicht anwendbar
INCLUDE_STARTUP_SCRIPTNicht anwendbar
INCLUDE_TMP_DIRNicht anwendbar
INCLUDE_UN_COMPNicht anwendbar
INCLUDE_USB_GEN2_KEYBOARDNicht anwendbar
INCLUDE_USB_GEN2_MOUSENicht anwendbar
INCLUDE_USB_GEN2_STORAGE_INITNicht anwendbar
INCLUDE_USB_TOUCH_SCREENNicht anwendbar
INCLUDE_USB_TOUCH_SCREEN_INITNicht anwendbar
INCLUDE_USER_DATABASENicht anwendbar
INCLUDE_USER_IDENTIFICATIONNicht anwendbar
INCLUDE_VRFSNicht anwendbar
INCLUDE_VXBUS_SHOWNicht anwendbar
DRV_TOUCH_SCREEN_TI_TSC2004Nicht anwendbar
DRV_TOUCH_SCREEN_EETI_EXC7200Nicht anwendbar
INCLUDE_FBDEV_FSLIPU_0fsl_imx6 spezifisch
INCLUDE_FBDEV_SPLASHNicht zutreffend
INCLUDE_GPUDEV_FSLVIV_APIfsl_imx6 spezifisch
INCLUDE_GPUDEV_FSLVIV_API_INITfsl_imx6 spezifisch
INCLUDE_GPUDEV_ITLGMC_2itl_generisch spezifisch
INCLUDE_I915itl_generisch spezifisch
INCLUDE_MESA_FBDEVitl_generisch spezifisch
INCLUDE_MESA_GPUDEV_DRIitl_generisch spezifisch
INCLUDE_MESA_GPUDEV_DRI_I965itl_generisch spezifisch

Die folgenden Komponenten werden implizit hinzugefügt und Sie müssen sie entfernen:

EbeneAnmerkungen
INCLUDE_FTPNicht zutreffend
INCLUDE_SHELL_SECURITYNicht zutreffend
VIP-Parameter

Sie müssen die folgenden Parameter hinzufügen, damit Qt unter VxWorks ordnungsgemäß läuft:

ParameterBeispielwertHinweise
SEC_VAULT_KEY_ENCRYPTING_PW'"vxTarget"'Nicht zutreffend
UDB_STORAGE_PATH'"/ram/vxUserDB.txt"'Nicht zutreffend
UDB_HASH_KEY'"123456789"'Nicht zutreffend
UDB_HASH_KEY_LEN9Beispielwert, siehe oben
FSLVIV_RTP_COMMAND_BUFFER_QUEUE32Für 'arm' Architektur
SYS_CLK_RATE100Nicht zutreffend
RTP_PTHREAD_STACK_SIZE_DEFAULT262144Erforderlich, damit die qtquick3d-Beispiele funktionieren. Kann mit der Umgebungsvariablen PTHREAD_STACK_SIZE_DEFAULT überschrieben werden.
TMP_DIR_SIZE614400Mindestwert für das Bestehen von Qt internen Tests
NUM_FILES300Nicht zutreffend
RTP_FD_NUM_MAX300Nicht zutreffend
HRFS_DEFAULT_MAX_FILES300Nicht zutreffend
ITLGMC_FBDEV_RESOLUTION_2'"1024x768-32"'Beispielwert für den über HDMI angeschlossenen Touchscreen Xenarc 706TSA.
RTP_MEM_FILLTrueStandardmäßig ist der Wert True und er muss True bleiben, damit Qt richtig funktioniert.

Erstellen von Qt 6 für VxWorks

Host-Build

Ein Host-Build von Qt muss verfügbar sein, um Qt crosskompilieren zu können. Das liegt daran, dass während des Builds bestimmte Werkzeuge (wie moc, rcc, qmlcachegen und qsb) vom Host-Build aufgerufen werden. Sie haben die folgenden Optionen:

Es ist jedoch ratsam, sicherzustellen, dass Sie Qt auch für das Desktop-Target auf dem Host kompilieren können, da die gleichen Werkzeuge auch für die Kompilierung für VxWorks benötigt werden.

Ausführen des Configure-Skripts

Die Befehle zum Konfigurieren, Erstellen und Installieren von Qt 6 für den Host sind die folgenden:

./configure \
    -cmake-generator "Ninja" \
    -extprefix <path/to/Qt6/host/installation/dir> \
    -submodules qtbase,qtdeclarative,qtquick3d,qtshadertools \
    -nomake tests \
    -nomake examples \
    -- \
    -B <host/build/directory>
cd <host/build/directory>
cmake --build . --parallel
cmake --install .

Diese Befehle installieren Qt 6 für den Host unter <path_to_Qt 6_host_installation_dir>.

Erstellen von Qt 6 für das Zielsystem

Einrichten der Build-Umgebung

Bevor Sie configure ausführen und Qt 6 bauen, müssen Sie die VxWorks Development Shell in der Eingabeaufforderung öffnen.

  • Linux:
    cd <VxWorks installation directory>
    ./wrenv.sh -p vxworks
    export WIND_CC_SYSROOT=<path to VxWorks VSB directory>
  • Windows:
    cd <VxWorks installation directory>
    wrenv -p vxworks
    export WIND_CC_SYSROOT=<path to VxWorks VSB directory>

Vorbereiten der benutzerdefinierten CMake-Toolchain-Datei

Um Grafikbibliotheken aus dem BSP einzubinden, müssen Sie zunächst eine CMake-Toolchain-Datei erstellen. Ein Beispiel für eine CMake-Toolchain-Datei für ein BD-SL-i.MX6-Gerät:

# Copyright (C) 2024 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause

if(QT_VXWORKS_TOOLCHAIN_FILE)
    set(_original_toolchain_file "${QT_VXWORKS_TOOLCHAIN_FILE}")
elseif(DEFINED ENV{QT_VXWORKS_TOOLCHAIN_FILE})
    set(_original_toolchain_file "$ENV{QT_VXWORKS_TOOLCHAIN_FILE}")
else()
    message(FATAL_ERROR "QT_VXWORKS_TOOLCHAIN_FILE is not set.")
endif()

if(NOT EXISTS "${_original_toolchain_file}")
    message(FATAL_ERORR "${_original_toolchain_file} doesn't exists.")
endif()

include("${_original_toolchain_file}")
unset(_original_toolchain_file)

list(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES QT_VXWORKS_TOOLCHAIN_FILE)

set(_common_lib_path "${CMAKE_SYSROOT}/usr/lib/common")
set(EGL_INCLUDE_DIR ${CMAKE_SYSROOT}/usr/h/public CACHE PATH "Path to EGL include directory" FORCE)
set(EGL_LIBRARY ${_common_lib_path}/libgfxFslVivEGL.so CACHE PATH "Path to EGL lib" FORCE)
set(GLESv2_INCLUDE_DIR ${CMAKE_SYSROOT}/usr/h/public CACHE PATH "Path to GLES include directory" FORCE)
set(GLESv2_LIBRARY ${_common_lib_path}/libgfxFslVivGLESv2.so CACHE PATH "Path to GLES lib" FORCE)

set(VxWorksPlatformGraphics_DEFINES "-D_FSLVIV")
set(VxWorksPlatformGraphics_LIBRARIES_PACK
    "${_common_lib_path}/libgfxFslVivEGL.so"
    "${_common_lib_path}/libgfxFslVivGLESv2.so"
    "${_common_lib_path}/libgfxFslVivGAL.so"
    "${_common_lib_path}/libgfxFslVivGLSLC.so"
    "${_common_lib_path}/libgfxFslVivVDK.so"
    "${_common_lib_path}/libxml.so"
)

set(VxWorksPlatformGraphics_REQUIRED_LIBRARIES
    ${VxWorksPlatformGraphics_LIBRARIES_PACK}
    ${EGL_LIBRARY}
    ${GLESv2_LIBRARY}
)
unset(_common_lib_path)

Ein Beispiel für Intel NUC6i3SYH:

# Copyright (C) 2024 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause

if(QT_VXWORKS_TOOLCHAIN_FILE)
    set(_original_toolchain_file "${QT_VXWORKS_TOOLCHAIN_FILE}")
elseif(DEFINED ENV{QT_VXWORKS_TOOLCHAIN_FILE})
    set(_original_toolchain_file "$ENV{QT_VXWORKS_TOOLCHAIN_FILE}")
else()
    message(FATAL_ERROR "QT_VXWORKS_TOOLCHAIN_FILE is not set.")
endif()

if(NOT EXISTS "${_original_toolchain_file}")
    message(FATAL_ERORR "${_original_toolchain_file} doesn't exists.")
endif()

include("${_original_toolchain_file}")
unset(_original_toolchain_file)

list(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES QT_VXWORKS_TOOLCHAIN_FILE)

set(_common_lib_path "${CMAKE_SYSROOT}/usr/lib/common")
set(EGL_INCLUDE_DIR ${CMAKE_SYSROOT}/usr/h/public CACHE PATH "Path to EGL include directory" FORCE)
set(EGL_LIBRARY ${_common_lib_path}/libgfxMesaEGL.so CACHE PATH "Path to EGL lib" FORCE)
set(GLESv2_INCLUDE_DIR ${CMAKE_SYSROOT}/usr/h/public CACHE PATH "Path to GLES include directory" FORCE)
set(GLESv2_LIBRARY ${_common_lib_path}/libgfxMesaGL.so CACHE PATH "Path to GLES lib" FORCE)

set(VxWorksPlatformGraphics_DEFINES "-D__vxworks -D__VXWORKS")
set(VxWorksPlatformGraphics_LIBRARIES_PACK
    "${_common_lib_path}/libgfxMesaEGL.so"
    "${_common_lib_path}/libgfxMesaGL.so"
    "${_common_lib_path}/libgfxMesaSw.so"
    "${_common_lib_path}/libgfxMesa.so"
    "${_common_lib_path}/libgfxMesaDriI965.so"
    "${_common_lib_path}/libgfxLibDRM.so"
    "${_common_lib_path}/libxml.so"
)

set(VxWorksPlatformGraphics_REQUIRED_LIBRARIES
    ${VxWorksPlatformGraphics_LIBRARIES_PACK}
    ${EGL_LIBRARY}
    ${GLESv2_LIBRARY}
)
unset(_common_lib_path)

Ein Beispiel für I.MX8:

# Copyright (C) 2024 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause

if(QT_VXWORKS_TOOLCHAIN_FILE)
    set(_original_toolchain_file "${QT_VXWORKS_TOOLCHAIN_FILE}")
elseif(DEFINED ENV{QT_VXWORKS_TOOLCHAIN_FILE})
    set(_original_toolchain_file "$ENV{QT_VXWORKS_TOOLCHAIN_FILE}")
else()
    message(FATAL_ERROR "QT_VXWORKS_TOOLCHAIN_FILE is not set.")
endif()

if(NOT EXISTS "${_original_toolchain_file}")
    message(FATAL_ERORR "${_original_toolchain_file} doesn't exists.")
endif()

include("${_original_toolchain_file}")
unset(_original_toolchain_file)

list(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES QT_VXWORKS_TOOLCHAIN_FILE)

set(_common_lib_path "${CMAKE_SYSROOT}/usr/lib/common")
set(EGL_INCLUDE_DIR ${CMAKE_SYSROOT}/usr/h/public CACHE PATH "Path to EGL include directory" FORCE)
set(EGL_LIBRARY ${_common_lib_path}/libgfxNxpVivEGL.so CACHE PATH "Path to EGL lib" FORCE)
set(GLESv2_INCLUDE_DIR ${CMAKE_SYSROOT}/usr/h/public CACHE PATH "Path to GLES include directory" FORCE)
set(GLESv2_LIBRARY ${_common_lib_path}/libgfxNxpVivGLESv2.so CACHE PATH "Path to GLES lib" FORCE)

set(VxWorksPlatformGraphics_DEFINES "-D_NXPVIV -D__vxworks -D__VXWORKS__")
set(VxWorksPlatformGraphics_LIBRARIES_PACK
    "${_common_lib_path}/libgfxNxpVivGAL.so"
    "${_common_lib_path}/libgfxNxpVivEGL.so"
    "${_common_lib_path}/libgfxNxpVivGLSLC.so"
    "${_common_lib_path}/libgfxNxpVivGLESv2.so"
    "${_common_lib_path}/libgfxNxpVivGLESv1_CM.so"
    "${_common_lib_path}/libgfxNxpVivVSC.so"
    "${_common_lib_path}/libxml.so"
)

set(VxWorksPlatformGraphics_REQUIRED_LIBRARIES
    ${VxWorksPlatformGraphics_LIBRARIES_PACK}
    ${EGL_LIBRARY}
    ${GLESv2_LIBRARY}
)
unset(_common_lib_path)

Ausführen von Qt 6 Configure für das Target

Nachfolgend finden Sie ein Beispiel für eine Build-Konfiguration für das BD-SL-i.MX6. Für die meisten VxWorks-Boards sieht der configure-Befehl sehr ähnlich aus. Standardmäßig ist Qt 6 für die Verwendung von Shared Libraries konfiguriert. Um Qt 6 statisch zu bauen, fügen Sie die Option -static zu configure hinzu.

Stellen Sie sicher, dass die Umgebungsvariable {WIND_CC_SYSROOT} auf das VxWorks VSB-Root-Verzeichnis gesetzt ist.

./configure \
    -cmake-generator "Ninja" \
    -icu \
    -eglfs \
    -qpa eglfs \
    -submodules "qtbase,qtdeclarative,qtmultimedia,qtquick3d,qtgraphs,qtimageformats,qtsvg,qtshadertools,qtvirtualkeyboard" \
    -- \
    -B <target/build/directory> \
    -DQT_VXWORKS_TOOLCHAIN_FILE=<path/to/VSB/mk/toolchain.cmake> \
    -DFEATURE_vulkan=OFF \
    -DQT_QMAKE_TARGET_MKSPEC=vxworks-clang \
    -DQT_HOST_PATH=<path/to/Qt6/host/installation/dir> \
    -DCMAKE_STAGING_PREFIX:PATH=<path/to/Qt6/target/installation/dir> \
    -DCMAKE_TOOLCHAIN_FILE=<path/to/cmake/for/graphics/file/created/above> \

Es wird empfohlen, Qt 6 mit einem Shadow-Build zu erstellen. Siehe Qt-Konfigurationsoptionen für weitere Informationen.

Warnung: Wenn VxWorks mit RTP_MEM_FILL als false konfiguriert ist, dann benötigt Qt configure ein zusätzliches -DCMAKE_CXX_FLAGS="-DQT_RTP_MEM_FILL=1" Argument.

Nach der Konfiguration bauen und installieren Sie Qt 6 für VxWorks mit diesen Befehlen:

cd <host build directory>
cmake --build . --parallel
cmake --install .

Plattform-Plugins für VxWorks-Geräte

Qt für VxWorks unterstützt das EGLFS-Plattform-Plugin für eine native Fenstersubstitution. Lesen Sie mehr über seine Konfiguration in EGLFS.

Erstellen von Qt-Anwendungen

Um eine Qt-Anwendung zu erstellen, müssen Sie das QT_VXWORKS_TOOLCHAIN_FILE als Umgebungsvariable oder als Define setzen.

Ein Beispiel für die Erstellung der Qt-Demo clocks:

export WIND_CC_SYSROOT=<path/to/VxWorks/VSB/directory>
export QT_VXWORKS_TOOLCHAIN_FILE=<path/to/the/BSP/toolchain.cmake>
<path/to/Qt6/target/installation/dir>/bin/qt-cmake -G Ninja -S ~/Qt/Examples/Qt-6.9.0/demos/clocks -B <path/to/build/directory>
cd <path/to/build/directory>
cmake --build . --parallel

Qt-Anwendungen starten

Das folgende Beispiel zeigt, wie man eine Anwendung startet, wenn Qt 6 mit Shared Libraries gebaut wurde. Bei einem statisch erstellten Qt 6 brauchen Sie die Umgebungsvariable LD_LIBRARY_PATH nicht für die Qt-Bibliotheken zu verwenden, aber sie muss auf den Ort der gemeinsam genutzten VxWorks-Bibliotheken zeigen (zum Beispiel libc und OpenGL ES 2.0). Für die statischen Qt 6-Bibliotheken wird sie nicht benötigt.

putenv "LD_LIBRARY_PATH=/sd0:1/lib"
cd "/sd0:1"
rtpSp("<Qt 6 VxWorks application>", 200, 0x100000, 0, 0x01000000)

Debuggen von Qt-Anwendungen

Um Qt-Anwendungen zu debuggen, müssen Sie Ihrer VxWorks VSB Folgendes hinzufügen:

vxprj vsb config -s -add "_WRS_CONFIG_TCF_GDB_RSP=y"

Zu Ihrer VxWorks VIP-Konfiguration hinzufügen:

"INCLUDE_DEBUG_AGENT"
"INCLUDE_DEBUG_AGENT_START"
"INCLUDE_STANDALONE_SYM_TBL"

Von der Kommandozeile aus

  1. Starten Sie die zu debuggende Anwendung auf dem Gerät über SSH oder die serielle USB-Verbindung:
    rtpSp("<Qt 6 VxWorks application>", 200, 0x100000, 0, 0x01000000)
  2. Starten Sie den VxWorks-Debugger auf dem PC:
    vxgdb <binary to debug>
  3. Listen Sie die laufenden Prozesse im Debugger auf:
    monitor ps
  4. Hängen Sie den Debugger an die bereits laufende Anwendung an:
    "attach <id from monitor>"
  5. Verwenden Sie GDB-Befehle zum Debuggen.

Von der Workbench aus

  1. Erstellen Sie ein CMake-Echtzeitprozess-Projekt.

    Wählen Sie cmake RTP-Projekt

  2. Setzen Sie die VSB, die Debugging konfiguriert hat.
  3. Entfernen Sie set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static") aus CMakeLists.txt.
  4. Fügen Sie Qt CMake-bezogenen Code zur CMakeLists.txt hinzu, wie in Getting started with CMake beschrieben.
  5. Vor project() fügen Sie unset(CMAKE_TOOLCHAIN_FILE CACHE) und CMAKE_TOOLCHAIN_FILE hinzu, die auf die Qt6-Toolchain-Datei und QT_CHAINLOAD_TOOLCHAIN_FILE auf die VSB-Toolchain-Datei verweisen. Zum Beispiel:
    unset(CMAKE_TOOLCHAIN_FILE CACHE)
    set(CMAKE_TOOLCHAIN_FILE "/home/qtuser/VxWorks/qt/target_gdb/lib/cmake/Qt6/qt.toolchain.cmake")
    set(QT_CHAINLOAD_TOOLCHAIN_FILE "/home/qtuser/VxWorks/fsl_imx6_2_0_6_2_VSB_gdb/mk/toolchain.cmake")
  6. Erstellen Sie die Anwendung Project.
  7. Erstellen Sie eine neue Verbindung.

    Verbindung zum Gerät

  8. Starten Sie den RTP-Prozess zum Debuggen.

    Wählen Sie Run/Debug Real Time Process

  9. Klicken Sie auf Erweiterte Optionen.

    Einstellungen ausführen

  10. Setzen Sie die Stackgröße auf 0x100000.

    Erweiterte Einstellungen

Qt für VxWorks Eingabe-Plugins

VxWorks verwendet seine eigene Implementierung von libevdev, die eine API hat, die der von Linux sehr ähnlich ist, sich aber in den Fähigkeiten unterscheidet. Aus diesem Grund implementiert Qt für VxWorks separate Eingabe-Plugins für Maus, Tastatur und Touchscreen, die auf {inputs-linux-device.html}{Linux evdev} basieren, mit Unterschieden, die im Folgenden erläutert werden.

VxMouse

VxMouse verwendet das gleiche Konfigurationsschema wie EvdevMouse, mit Ausnahme einer anderen Umgebungsvariablen: QT_QPA_VXEVDEV_MOUSE_PARAMETERS. Außerdem ignoriert VxMouse die Parameter nocompress, dejitter und grab.

VxTastatur

VxKeyboard verwendet dasselbe Konfigurationsschema wie EvdevKeyboard, mit Ausnahme einer anderen Umgebungsvariablen: QT_QPA_VXEVDEV_KEYBOARD_PARAMETERS.

VxTouch

VxTouch verwendet das gleiche Konfigurationsschema wie EvdevTouch, mit Ausnahme der unterschiedlichen Umgebungsvariablen:

  • QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS
  • QT_QPA_VXEVDEV_DEBUG

Zusätzlich fügt VxTouch zwei neue Parameter hinzu:

ParameterBeschreibung
rangex=MIN_X,MAX_XÜberschreibt den minimalen und maximalen Berührungspunkt für die X-Achse
rangey=MIN_Y,MAX_YÜberschreibt den minimalen und maximalen Berührungspunkt für die Y-Achse

Beschränkungen

Video-Speicher

Auf Systemen mit einer bestimmten Menge an dediziertem Videospeicher ist möglicherweise besondere Vorsicht geboten, bevor Qt-Anwendungen ausgeführt werden, die auf Qt Quick oder Klassen wie QOpenGLWidget basieren. Die Standardeinstellung kann für solche Anwendungen unzureichend sein, insbesondere wenn sie auf einem Bildschirm mit hoher Auflösung (z. B. Full HD) angezeigt werden. In diesem Fall kann es zu unerwarteten Fehlern kommen. Es wird daher empfohlen, dafür zu sorgen, dass mindestens 128 MB GPU-Speicher zur Verfügung stehen. Bei Systemen, die keinen festen Speicherplatz für die GPU reserviert haben, stellt dies kein Problem dar.

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.