用于 VxWorks 的 Qt
如需了解更多信息,请联系 Qt 公司: https://www.qt.io/contact-us/
Qt for VxWorks 许可
Qt for VxWorks 采用 Qt for Device Creation Professional (DCP) 许可。有关详细信息,请参阅Qt 定价。
支持的体系结构和 VxWorks 版本
Qt 6.9 已在 VxWorks 24.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 布局 | 不适用 |
Qt Quick 测试 | 不适用 |
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 编译器 |
Qt Quick Effects |
Qt SQL |
Qt SVG |
Qt Virtual Keyboard |
注意: 在运行 configure 工具时,可以通过 -skip <module> 选项明确地将不支持或未使用的模块排除在编译之外。
平台注意事项
Qt 准备用于 RTP 应用程序,不支持 DKM。
Qt 5.0 发布后,Qt 不再包含自己的窗口系统实现:QWS 不再是受支持的平台。对于单进程用例,Qt 平台抽象是一种更优的解决方案。
有一个插件可以在 VxWorks 上使用:EGLFS。该插件的可用性取决于 Qt 的配置。
为特定设备配置
通过安装 VxWorks SDK 和获取 WindRiver 许可证来准备环境,安装程序和构建 VxWorks 映像都需要 WindRiver 许可证。在 {https://gallery.windriver.com/portal/products} 中搜索相应的安装程序。
为特定设备构建 Qt 需要为编译主机安装 Qt 6、工具链和系统根。此外,某些设备还需要供应商特定的适配代码,以支持 EGL 和 OpenGL 2.0。
VxWorks 映像要求
Qt for VxWorks 需要在基础软件中嵌入特定的 VxWorks 映像捆绑包和组件,才能使 Qt 正常编译和运行。该列表并不完整,因为它取决于项目的硬件、软件和系统要求。不过,下表列出了某些功能(包括触摸屏支持)必须使用的组件。请注意,这些要求可能会随 VxWorks 版本的变化而变化。
fsl_imx6 和 itl_generic BSP 的 VSB 配置示例
要使 Qt 正常工作,您需要在 VSB 中添加以下功能。有关详细信息,请查阅 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 specific |
ITLI915 | itl_generic specific |
LIBDRM | 特定于 itl_generic |
MESA | 特定于 itl_generic |
以下配置变量是隐式添加的,需要删除:
变量 | 注释 |
---|---|
_WRS_CONFIG_EVDEV_OPTIMIZED_MODE | 不适用 |
_WRS_CONFIG_EVDEV_DISPLAY_POINT_TRANSLATE | 不适用 |
_WRS_CONFIG_MESA_MANGLE | itl_generic specific |
您需要在配置中添加以下变量:
变量 | 值 | 注释 |
---|---|---|
_WRS_CONFIG_RTP_SSP | y | 不适用 |
_WRS_CONFIG_RTP_STACK_PROTECTOR | y | 不适用 |
_WRS_CONFIG_MESA_GPUDEV_INTEL_GEN90 | y | itl_generic specific |
_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 specific |
INCLUDE_I915 | itl_generic specific |
INCLUDE_MESA_FBDEV | 特定于 itl_generic |
INCLUDE_MESA_GPUDEV_DRI | 特定于 itl_generic |
INCLUDE_MESA_GPUDEV_DRI_I965 | 特定于 itl_generic |
以下组件是隐式添加的,您需要将其删除:
层 | 注释 |
---|---|
INCLUDE_FTP | 不适用 |
INCLUDE_SHELL_SECURITY | 不适用 |
贵宾参数
要在 VxWorks 上正常运行 Qt,您需要添加以下参数:
参数 | 示例值 | 注释 |
---|---|---|
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 内部测试的最小值 |
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 ,需要保持True 才能使 Qt 正常工作。 |
为 VxWorks 构建 Qt 6
主机构建
要交叉编译 Qt,必须有 Qt 的主机构建。这是因为在编译过程中,某些工具(如moc
,rcc
,qmlcachegen
和qsb
)会从主机编译中调用。您有以下选项:
- 为主机构建 Qt 源代码、
- 使用Qt Online Installer 安装主机构建。
不过,建议您确保也能在主机上为桌面目标编译 Qt,因为为 VxWorks 编译时也需要相同的工具。
运行配置脚本
为主机配置、编译和安装 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 .
这些命令会在<path_to_Qt 6_host_installation_dir>
中为主机安装 Qt 6。
为目标机构建 Qt 6
设置构建环境
在运行 configure 并构建 Qt 6 之前,必须在命令提示符下打开VxWorks Development 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. # 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)
英特尔 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)
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)
为目标运行 Qt 6 配置
下面是 BD-SL-i.MX6 的构建配置示例。对于大多数 VxWorks 板,配置命令看起来非常相似。默认情况下,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> \
建议使用影子编译构建 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.9.0/demos/clocks -B <path/to/build/directory> cd <path/to/build/directory> cmake --build . --parallel
运行 Qt 应用程序
下面的示例展示了如何在使用共享库构建 Qt 6 时启动应用程序。对于静态构建的 Qt 6,不需要为 Qt 库使用LD_LIBRARY_PATH
环境变量,但它需要指向 VxWorks 共享库(例如 libc 和 OpenGL ES 2.0)的位置。Qt 6 静态库则不需要。
putenv "LD_LIBRARY_PATH=/sd0:1/lib" cd "/sd0:1" 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 命令进行调试。
从工作台
- 创建 CMake 实时进程项目。
- 设置已配置调试的 VSB。
- 从 CMakeLists.txt 中移除 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")。
- 按照CMake 入门,在 CMakeLists.txt 中添加 Qt CMake 相关代码。
- 在
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")
- 构建应用程序项目。
- 创建新连接。
- 启动 RTP 进程进行调试。
- 点击高级选项。
- 将堆栈大小设置为 0x100000。
Qt for VxWorks 输入插件
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
使用与 EvdevKeyboard 相同的配置方案,只是环境变量不同: 。QT_QPA_VXEVDEV_KEYBOARD_PARAMETERS
VxTouch
VxTouch
使用与 EvdevTouch 相同的配置方案,只是环境变量不同:
QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS
QT_QPA_VXEVDEV_DEBUG
此外,VxTouch 还增加了两个新参数:
参数 | 参数 |
---|---|
rangex=MIN_X,MAX_X | 覆盖 X 轴触摸点最小值和最大值 |
rangey=MIN_Y,MAX_Y | 覆盖 Y 轴触摸点最小值和最大值 |
限制
视频内存
在运行基于Qt Quick 或类(如QOpenGLWidget )的 Qt XML 应用程序之前,使用固定数量专用视频内存的系统可能需要格外小心。默认设置可能无法满足此类应用程序的需要,尤其是在高分辨率(如全高清)屏幕上显示时。在这种情况下,它们可能会出现意想不到的故障。因此,建议确保至少有 128 MB 的 GPU 内存可用。对于没有为 GPU 预留固定内存量的系统,这不是问题。
© 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.