适用于 VxWorks 的 Qt
如需了解更多信息,请联系 The Qt Company:https://www.qt.io/contact-us/
Qt for VxWorks 许可
Qt for VxWorks 采用 Qt for Device Creation Professional (DCP) 许可协议提供。如需了解更多信息,请参阅Qt 定价。
支持的架构和 VxWorks 版本
Qt 6.10 已在 VxWorks 25.03 上通过验证。
支持的架构:
- ARM-v7—已在 BD-SL-i.MX6 上测试。使用的 BSP:fsl_imx6
- x86_64——已在 Intel NUC6i3SYH 上测试。使用的 BSP:itl_generic
如果您对后续版本的 Qt 感兴趣,请联系Qt 专业服务团队。
VxWorks 的要求
Qt Widgets 应用程序
- POSIX 支持
- 支持 C++17
Qt Quick 2 个应用程序
包含Qt Widgets 应用程序所需的所有功能,此外还包括以下功能:
- 用于 OpenGL ES 2.0 的 GPU 设备 (GPUDEV)
支持的模块
支持大多数核心Qt 模块以及部分附加模块。
支持的核心模块
| Qt 模块 | 备注 |
|---|---|
| Qt Core | 不支持QProcess 。QLocalSocket 和QLocalServer 仅支持SOCK_SEQPACKET。 |
| Qt GUI | 不适用 |
| Qt Network | 不适用 |
| Qt Qml | 不适用 |
| Qt Quick | 不适用 |
| Qt Quick Controls | 不适用 |
| Qt Quick Dialogs | 不适用 |
| Qt Quick Layouts | 不适用 |
| Qt Quick Test | 不适用 |
| Qt Test | 不适用 |
| Qt Widgets | 不适用 |
支持的附加组件
| Qt 扩展 |
|---|
| Qt Concurrent |
| Qt GRPC/Protobuf |
| Qt Graphs |
| Qt Image Formats |
| Qt Multimedia |
| Qt 本机接口 |
| Qt OpenGL |
| Qt Quick 3D |
| Qt Quick Compiler |
| Qt Quick Effects |
| Qt SQL |
| Qt SVG |
| Qt Virtual Keyboard |
注意: 在运行 configure 工具时,可通过 -skip <模块> 选项将 不受支持或未使用的模块显式排除在构建之外。
平台说明
Qt 已准备好供 RTP 应用程序使用,但不支持 DKM。
随着 Qt 5.0 的发布,Qt 不再包含自有的窗口系统实现:QWS 已不再是受支持的平台。对于单进程用例,Qt 平台抽象(Qt Platform Abstraction)是更优的解决方案。
有一个可在 VxWorks 上使用的插件:EGLFS。该插件的可用性取决于 Qt 的配置。
针对特定设备的配置
请安装 VxWorks SDK 并获取 WindRiver 许可证(安装程序和构建 VxWorks 镜像均需此许可证),以此准备好您的环境。请在 {https://gallery.windriver.com/portal/products} 中查找合适的安装程序。
为特定设备构建 Qt 需要编译主机上已安装 Qt 6、工具链以及 sysroot。详情请参阅《Qt 的交叉编译》。此外,某些设备需要针对 EGL 和 OpenGL 2.0 支持的厂商特定适配代码。
VxWorks 映像要求
VxWorks 版的 Qt 需要将特定的 VxWorks 映像包和组件嵌入到基础软件中,才能使 Qt 正常编译和运行。该列表绝非详尽无遗,因为它取决于您项目的硬件、软件和系统要求。不过,下表列出了某些功能(包括触摸屏支持)正常运行所必需的组件。 另请注意,这些要求可能会随 VxWorks 版本的变化而变化。
fsl_imx6 和 itl_generic BSP 的 VSB 配置示例
您需要在 VSB 中添加以下功能,以确保 Qt 正常运行。更多详细信息请查阅 WindRiver VxWorks 文档。
| 功能 | 备注 |
|---|---|
DSI_DSI_KERNEL | 不适用 |
IPNET_COREIP | 不适用 |
IPNET_DHCPC | 不适用 |
SDMMC_DEVICE | 不适用 |
SDMMC_HOST | 不适用 |
SDMMC_SDHC | 不适用 |
SDMMC_STORAGE | 不适用 |
SERVICE_UN | 不适用 |
SOCKET | 不适用 |
USB_EHCI | 不适用 |
USB_KEYBOARD | 不适用 |
USB_MOUSE | 不适用 |
USB_STORAGE | 不适用 |
USB_TOUCHSCREEN | 不适用 |
EVDEV | 不适用 |
EVDEV_LIB | 不适用 |
EVDEV_TI_TSC2004_TS | 不适用 |
EVDEV_EETI_EXC7200_TS | 不适用 |
AUDIO | 不适用 |
GPUDEV_FSLVIVGPU | fsl_imx6 特定 |
HASH | 不适用 |
OPENSSL | 不适用 |
RANDOM_ENTROPY_INJECT | 不适用 |
IPNET_SSH | 不适用 |
USER_MANAGEMENT | 不适用 |
ICU | 不适用 |
DRM | itl_generic 特定 |
ITLI915 | itl_通用 特定 |
LIBDRM | itl_generic 特定 |
MESA | itl_generic 和 nxp_imx8 特定 |
以下配置变量会被隐式添加,您需要将其删除:
| 变量 | 备注 |
|---|---|
_WRS_CONFIG_EVDEV_OPTIMIZED_MODE | 不适用 |
_WRS_CONFIG_EVDEV_DISPLAY_POINT_TRANSLATE | 不适用 |
_WRS_CONFIG_MESA_MANGLE | itl_通用特定 |
您需要在配置中添加以下变量:
| 变量 | 值 | 备注 |
|---|---|---|
_WRS_CONFIG_RTP_SSP | y | 不适用 |
_WRS_CONFIG_RTP_STACK_PROTECTOR | y | 不适用 |
_WRS_CONFIG_MESA_GPUDEV_INTEL_GEN90 | y | itl_generic 特定 |
_WRS_CONFIG_EVDEV_COMPATIBLE_MODE | y | 这是确保 Qt 能与触摸屏正常配合工作的必要条件。 |
fsl_imx6 和 itl_generic BSP 的 VIP 配置示例
更多详细信息请参阅 WindRiver VxWorks 文档。
| 软件包 | 注释 |
|---|---|
BUNDLE_POSIX | 此软件包对于与 Qt 所需的 POSIX 相关功能保持兼容性是必不可少的。 |
BUNDLE_RTP_DEPLOY | 不适用 |
BUNDLE_RTP_DEVELOP | 不适用 |
BUNDLE_STANDALONE_SHELL | 不适用 |
| 组件 | 备注 |
|---|---|
INCLUDE_TMP_DIR INCLUDE_RAM_DISK_FORMAT_HRFS | 若要使用QTemporaryFile ,必须包含这两个组件。请注意,还应考虑将TMP_DIR_SIZE 设置为适当的值 |
DRV_AUDIO_FSL_SSI | 不适用 |
DRV_AUDIO_FSL_SGTL5000 | 不适用 |
DRV_FSL_SDHC_CTRL | 不适用 |
DRV_IMX_SDHC_CTRL | 不适用 |
INCLUDE_EHCI_INIT | 不适用 |
INCLUDE_FSL_IMX6Q_SABRELITE | 不适用 |
DRV_MMCSTORAGE_CARD | 不适用 |
DRV_SDSTORAGE_CARD | 不适用 |
INCLUDE_AUDIO_LIB_CORE | 不适用 |
INCLUDE_AUDIO_LIB_WAV | 不适用 |
INCLUDE_CUSTOM_ENTROPY_ADD | 不适用 |
INCLUDE_DEBUG_AGENT_START | 不适用 |
INCLUDE_DEFAULT_TIMEZONE | 不适用 |
INCLUDE_DISK_UTIL | 不适用 |
INCLUDE_DOSFS | 不适用 |
INCLUDE_DSAPARAM_CMD | 不适用 |
INCLUDE_END | 不适用 |
INCLUDE_EVDEV_LIB_CORE | 不适用 |
INCLUDE_EVDEV_LIB_KBD | 不适用 |
INCLUDE_EVDEV_LIB_KBD_MAP_US | 不适用 |
INCLUDE_EVDEV_LIB_PTR | 不适用 |
INCLUDE_EVDEV_LIB_TS | 不适用 |
INCLUDE_GENDSA_CMD | 不适用 |
INCLUDE_GENRSA_CMD | 不适用 |
INCLUDE_GETADDRINFO | 不适用 |
INCLUDE_GETNAMEINFO | 不适用 |
INCLUDE_HRFS | 不适用 |
INCLUDE_HRFS_ACCESS_TIMESTAMP | 不适用 |
INCLUDE_HRFS_FORMAT | 不适用 |
INCLUDE_HRFS_HISPEED_WRITE_MODE | 不适用 |
INCLUDE_IFCONFIG | 不适用 |
INCLUDE_IO_REALPATH | 需要此组件才能启用 realpath 函数,该函数用于QFileInfo |
INCLUDE_IPATTACH | 不适用 |
INCLUDE_IPCOM_SYSLOGD_CMD | 不适用 |
INCLUDE_IPCOM_SYSVAR_CMD | 不适用 |
INCLUDE_IPCOM_USE_RAM_DISK | 不适用 |
INCLUDE_IPCOM_USE_TIME_CMD | 不适用 |
INCLUDE_IPDHCPC | 不适用 |
INCLUDE_IPDNSC | 不适用 |
INCLUDE_IPD_CMD | 不适用 |
INCLUDE_IPFTPC | 不适用 |
INCLUDE_IPFTP_CMD | 不适用 |
INCLUDE_IPIFCONFIG_CMD | 不适用 |
INCLUDE_IPNETSTAT_CMD | 不适用 |
INCLUDE_IPNSLOOKUP_CMD | 不适用 |
INCLUDE_IPPING_CMD | 不适用 |
INCLUDE_IPROUTE_CMD | 不适用 |
INCLUDE_IPTRACE_ROUTE_CMD | 不适用 |
INCLUDE_IPWRAP_GETHOSTBYADDR | 不适用 |
INCLUDE_IPWRAP_GETHOSTBYNAME | 不适用 |
INCLUDE_IPWRAP_GETNAMEINFO | 不适用 |
INCLUDE_IPWRAP_IFNAME | 不适用 |
INCLUDE_IPWRAP_ROUTECMD | 不适用 |
INCLUDE_MMAP | 不适用 |
INCLUDE_PING | 不适用 |
INCLUDE_PIPES | 不适用 |
INCLUDE_POSIX_MAPPED_FILES | 不适用 |
INCLUDE_POSIX_PIPES | 不适用 |
INCLUDE_POSIX_PTHREAD_SCHEDULER | 不适用 |
INCLUDE_POSIX_SHM | 不适用 |
INCLUDE_RAM_DISK | 不适用 |
INCLUDE_RAM_DISK_FORMAT_HRFS | 不适用 |
INCLUDE_RANDOM_NUM_GEN | 不适用 |
INCLUDE_ROMFS | 不适用 |
INCLUDE_ROUTECMD | 不适用 |
INCLUDE_SC_PIPE | 不适用 |
INCLUDE_SC_POSIX_PIPE | 不适用 |
INCLUDE_SD_BUS | 不适用 |
INCLUDE_SECURITY | 不适用 |
INCLUDE_SEC_KEY_STORE_CMD | 不适用 |
INCLUDE_SHELL | 不适用 |
INCLUDE_SSH | 不适用 |
INCLUDE_STANDALONE_SYM_TBL | 不适用 |
INCLUDE_STARTUP_SCRIPT | 不适用 |
INCLUDE_TMP_DIR | 不适用 |
INCLUDE_UN_COMP | 不适用 |
INCLUDE_USB_GEN2_KEYBOARD | 不适用 |
INCLUDE_USB_GEN2_MOUSE | 不适用 |
INCLUDE_USB_GEN2_STORAGE_INIT | 不适用 |
INCLUDE_USB_TOUCH_SCREEN | 不适用 |
INCLUDE_USB_TOUCH_SCREEN_INIT | 不适用 |
INCLUDE_USER_DATABASE | 不适用 |
INCLUDE_USER_IDENTIFICATION | 不适用 |
INCLUDE_VRFS | 不适用 |
INCLUDE_VXBUS_SHOW | 不适用 |
DRV_TOUCH_SCREEN_TI_TSC2004 | 不适用 |
DRV_TOUCH_SCREEN_EETI_EXC7200 | 不适用 |
INCLUDE_FBDEV_FSLIPU_0 | fsl_imx6 特定 |
INCLUDE_FBDEV_SPLASH | 不适用 |
INCLUDE_GPUDEV_FSLVIV_API | fsl_imx6 特定 |
INCLUDE_GPUDEV_FSLVIV_API_INIT | fsl_imx6 特定 |
INCLUDE_GPUDEV_ITLGMC_2 | itl_generic 特定 |
INCLUDE_I915 | itl_generic 特定 |
INCLUDE_MESA_FBDEV | itl_generic 特定 |
INCLUDE_MESA_GPUDEV_DRI | itl_generic 特定 |
INCLUDE_MESA_GPUDEV_DRI_I965 | itl_generic 特定 |
以下组件会被隐式添加,您需要将其删除:
| 图层 | 备注 |
|---|---|
INCLUDE_FTP | 不适用 |
INCLUDE_SHELL_SECURITY | 不适用 |
VIP参数
为了使 Qt 在 VxWorks 上正常运行,您需要添加以下参数:
| 参数 | 示例值 | 备注 |
|---|---|---|
SEC_VAULT_KEY_ENCRYPTING_PW | '"vxTarget"' | 不适用 |
UDB_STORAGE_PATH | '"/ram/vxUserDB.txt"' | 不适用 |
UDB_HASH_KEY | '"123456789"' | 不适用 |
UDB_HASH_KEY_LEN | 9 | 示例值,参见前文 |
FSLVIV_RTP_COMMAND_BUFFER_QUEUE | 32 | 针对“arm”架构 |
SYS_CLK_RATE | 100 | 不适用 |
RTP_PTHREAD_STACK_SIZE_DEFAULT | 262144 | 这是让 qtquick3d 示例正常运行的必要条件。可通过 PTHREAD_STACK_SIZE_DEFAULT 环境变量进行覆盖。 |
TMP_DIR_SIZE | 614400 | 通过 Qt Test 所需的最小值 |
NUM_FILES | 300 | 不适用 |
RTP_FD_NUM_MAX | 300 | 不适用 |
HRFS_DEFAULT_MAX_FILES | 300 | 不适用 |
ITLGMC_FBDEV_RESOLUTION_2 | '"1024x768-32"' | 通过 HDMI 连接的 Xenarc 706TSA 触摸屏的示例值。 |
RTP_MEM_FILL | True | 默认值为True ,为确保Qt正常运行,该值必须保持为True 。 |
为 VxWorks 构建 Qt 6
主机构建
要进行 Qt 的交叉编译,必须先拥有 Qt 的主机构建版本。这是因为在构建过程中,某些工具(例如moc 、rcc 、qmlcachegen 和qsb )会从主机构建中调用。您可以选择以下选项:
- 为宿主系统构建 Qt 源代码,
- 使用Qt Online Installer 安装主机构建。
不过,建议您确保也能在主机上为桌面目标构建 Qt,因为编译 VxWorks 时也需要相同的工具。
运行 Configure 脚本
用于在主机上配置、构建和安装 Qt 6 的命令如下:
./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 .这些命令将 Qt 6 安装到主机的<path_to_Qt 6_host_installation_dir> 目录下。
为目标系统构建 Qt 6
配置构建环境
在运行 configure 并构建 Qt 6 之前,必须在命令提示符下打开VxWorks 开发 shell。
- 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>
准备自定义 CMake 工具链文件
要引入 BSP 中的图形库,首先需要创建一个 CMake 工具链文件。以下是适用于 BD-SL-i.MX6 设备的 CMake 工具链文件示例:
# Copyright (C) 2024 The Qt Company Ltd.
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)以 Intel NUC6i3SYH 为例:
# Copyright (C) 2024 The Qt Company Ltd.
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)为目标设备运行 Qt 6 的 configure 命令
以下是针对 BD-SL-i.MX6 的构建配置示例。对于大多数 VxWorks 开发板,configure 命令的格式非常相似。默认情况下,Qt 6 配置为使用共享库。若要静态链接 Qt 6,请在 configure 命令中添加-static 选项。
请确保环境变量 {WIND_CC_SYSROOT} 已设置为 VxWorks VSB 根目录。
./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> \建议使用影子构建(shadow build)方式构建 Qt 6。更多信息请参阅《Qt 配置选项》。
警告:如果 VxWorks 的RTP_MEM_FILL 配置为 false,则 Qt 的 configure 需要额外的-DCMAKE_CXX_FLAGS="-DQT_RTP_MEM_FILL=1" 参数。
配置完成后,请使用以下命令为 VxWorks 构建并安装 Qt 6:
cd <host build directory>
cmake --build . --parallel
cmake --install .VxWorks 设备的平台插件
Qt for VxWorks 支持 EGLFS 平台插件,用于实现原生窗口替换。有关其配置的更多信息,请参阅EGLFS。
构建 Qt 应用程序
要构建 Qt 应用程序,必须将 QT_VXWORKS_TOOLCHAIN_FILE 设置为环境变量或宏定义。
以下是构建 Qt 时钟示例应用程序的示例:
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.10.0/demos/clocks -B <path/to/build/directory>
cd <path/to/build/directory>
cmake --build . --parallel设置环境变量
| 变量 | 描述 |
|---|---|
| QT_QPA_FONTDIR | 字体的路径。 |
| QT_QPA_EGLFS_FB | 帧缓冲区设备的路径。 |
| LD_LIBRARY_PATH | 动态库的路径。 |
| ICU_DATA | ICU 数据的路径。 |
| QT_QPA_EGLFS_INTEGRATION | Eglfs 集成,eglfs_viv 或eglfs_kms 。 |
| QT_QPA_EGLFS_KMS_CONFIG | kms.conf 的路径。 |
注意:QML 磁盘缓存无法正常工作;请使用以下变量将其禁用,以防止启动速度变慢:QML_DISABLE_DISK_CACHE 。
例如,在启动脚本中按以下方式设置环境变量:
putgenv("QT_QPA_FONTDIR=/bd0a/fonts")
putgenv("QT_QPA_EGLFS_FB=/dev/fb0")
putgenv("LD_LIBRARY_PATH=/bd0a/lib/gfx;/bd0a/lib/llvm;/bd0a/lib/icu")
putgenv("ICU_DATA=/bd0a/icu/icudt73l.dat")
putgenv("QT_QPA_EGLFS_INTEGRATION=eglfs_kms")
putgenv("QT_QPA_EGLFS_FB=/dev/fb0")
putgenv("QT_QPA_EGLFS_KMS_CONFIG=/bd0a/kms.conf")
putgenv("QML_DISABLE_DISK_CACHE=1")例如,针对英特尔 KabyLake 设备的 `kms.conf ` 文件可以如下所示:
{
"device": "/dev/dri/card0",
"hwcursor": false,
"pbuffers": true,
"outputs": [
{
"name": "DP",
"mode": "1920x1080"
}
]
}运行 Qt 应用程序
以下示例演示了如何使用 VxWorks 的rtpSp 命令启动应用程序:
rtpSp("<Qt 6 VxWorks application>", 200, 0x100000, 0, 0x01000000)调试 Qt 应用程序
要调试 Qt 应用程序,必须在 VxWorks VSB 中添加以下内容:
vxprj vsb config -s -add "_WRS_CONFIG_TCF_GDB_RSP=y"在您的 VxWorks VIP 配置中添加:
"INCLUDE_DEBUG_AGENT"
"INCLUDE_DEBUG_AGENT_START"
"INCLUDE_STANDALONE_SYM_TBL"从命令行
- 通过 SSH 或 USB 串行连接在设备上启动待调试的应用程序:
rtpSp("<Qt 6 VxWorks application>", 200, 0x100000, 0, 0x01000000) - 在 PC 上启动 VxWorks 调试器:
vxgdb <binary to debug> - 在调试器中列出正在运行的进程:
monitor ps - 将调试器附加到已运行的应用程序上:
"attach <id from monitor>" - 使用 GDB 命令进行调试。
来源Qt Creator
若要从Qt Creator 进行调试,请参阅Qt Creator :在VxWorks设备上调试C++应用程序。
从 Workbench 开始
- 创建一个 CMake 实时进程项目。

- 设置已配置调试功能的 VSB。
- 从 CMakeLists.txt 中删除 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")。
- 按照《CMake 入门指南》将 Qt CMake 相关代码添加到 CMakeLists.txt 中。
- 在
project()之前添加unset(CMAKE_TOOLCHAIN_FILE CACHE),并将CMAKE_TOOLCHAIN_FILE指向Qt6工具链文件,将QT_CHAINLOAD_TOOLCHAIN_FILE指向VSB工具链文件。例如: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") - 构建应用程序 Project。
- 创建一个新连接。

- 启动 RTP 进程以进行调试。

- 点击“高级选项”。

- 将堆栈大小设置为 0x100000。

VxWorks 的 Qt 输入插件
VxWorks 使用其自行实现的libevdev ,其 API 与 Linux 的非常相似,但在功能上有所不同。 因此,Qt 为 VxWorks 实现了单独的输入插件来处理鼠标、键盘和触摸屏,这些插件基于 {inputs-linux-device.html}{Linux evdev},具体差异将在下文说明。
VxMouse
VxMouse 采用与 EvdevMouse 相同的配置方案,仅环境变量QT_QPA_VXEVDEV_MOUSE_PARAMETERS 不同。此外,VxMouse 会忽略nocompress 、dejitter 和grab 参数。
VxKeyboard
VxKeyboard 采用与 EvdevKeyboard 相同的配置方案,仅环境变量不同:QT_QPA_VXEVDEV_KEYBOARD_PARAMETERS 。
VxTouch
VxTouch 采用与 EvdevTouch 相同的配置方案,仅环境变量不同:
QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERSQT_QPA_VXEVDEV_DEBUG
此外,VxTouch 还新增了两个参数:
| 参数 | 描述 |
|---|---|
rangex=MIN_X,MAX_X | 覆盖 X 轴触摸点的最小值和最大值 |
rangey=MIN_Y,MAX_Y | 覆盖 Y 轴触点范围的最小值和最大值 |
限制
视频内存
对于配备固定容量专用视频内存的系统,在运行基于Qt Quick 或QOpenGLWidget 等类的Qt应用程序前,可能需要格外注意。对于此类应用程序,默认设置可能不足,尤其是在高分辨率(例如全高清)屏幕上显示时。 在此情况下,应用程序可能会以意想不到的方式出现故障。因此,建议确保至少有 128 MB 的 GPU 内存可用。对于未为 GPU 预留固定内存量的系统,则不存在此问题。
© 2026 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.