将 Kanzi 应用程序部署到 QNX¶
在您可以为目标平台构建 Kanzi 应用程序之前,请为目标平台设置和配置 Kanzi 构建环境。构建环境包括 Kanzi 构建系统用于为目标平台构建应用程序的工具。
要求¶
要构建和部署 Kanzi 应用程序到 QNX,您需要:
QNX 软件开发平台 7.1。
QNX 软件开发平台的库要求:
slog2
您可以在 https://blackberry.qnx.com 获取 QNX 开发工具。
对于基于 CMake 的平台包:CMake 3.25 和 Ninja 1.10.x
在将 Kanzi 应用程序部署到 QNX 目标设备前,确保该设备正在运行 QNX Screen 服务。请参阅 https://www.qnx.com/developers/docs/7.1/#com.qnx.doc.screen/topic/manual/cscreen_about.html。
支持的构建系统、STDLIB 实现和库链接。¶
Kanzi 平台包支持这些构建系统:
CMake。请注意,此平台包的名称中包含
-cmake。平台包包含
Engine/cmake/toolchains/<toolchain_file>.cmake文件,其中列出了创建该平台包时使用的 CMake 选项。
Kanzi 提供基于以下 STDLIB 实现的 QNX 平台包:
LLVM。平台包会在平台包归档文件的名称中明确标注
cxx。GNU。平台包会在平台包归档文件的名称中明确标注
gpp。
Kanzi 平台包支持这些库链接选项:
静态。
要构建使用静态链接库的应用程序,请使用 CMake 定义
-DBUILD_SHARED_LIBS:BOOL=OFF。如果未指定BUILD_SHARED_LIBS选项,则默认使用此设置。动态。
要构建使用动态链接库的应用程序,请使用 CMake 定义
-DBUILD_SHARED_LIBS:BOOL=ON
在 QNX 上使用 LLVM C++ 库时,当您在 Kanzi 应用程序中使用具有插件依赖项的 kzb 文件时,请不要使用运行时链接器。在构建应用程序可执行文件时,将插件 SO 链接到应用程序。请参阅 https://www.qnx.com/developers/docs/7.1/#com.qnx.doc.neutrino.sys_arch/topic/dll.html 和 https://www.qnx.com/developers/docs/7.1/#com.qnx.doc.neutrino.utilities/topic/q/qcc.html。
为 QNX 构建 Kanzi 应用程序。¶
使用 CMake 构建 Kanzi 应用程序¶
例如,使用 CMake 在 Linux 上为 QNX 7.1 构建 kzb_player 应用程序:
使用 LLVM STDLIB 实现,从 -cxx 平台包中,使用共享库链接:
cd Engine/applications/kzb_player mkdir build cd build cmake -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=../../cmake/toolchains/qnx710-aarch64-cxx-qnx_screen.cmake -DCMAKE_INSTALL_PREFIX=../bin -DKANZI_BUILD_SHARED_LIBS:BOOL=ON -DKanzi_DIR=../../lib/cmake/Kanzi -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON .. cmake --build . cmake --install .
使用 GNU STDLIB 实现,从 Non-cxx 平台包:
cd Engine/applications/kzb_player mkdir build cd build cmake -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=../../cmake/toolchains/qnx710-aarch64-gpp-qnx_screen.cmake -DCMAKE_INSTALL_PREFIX=../bin -DKanzi_DIR=../../lib/cmake/Kanzi -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON .. cmake --build . cmake --install .
将 Kanzi 应用程序部署到 QNX 设备¶
要将 Kanzi 应用程序部署到 QNX:
为 QNX 构建您的 Kanzi 应用程序。请参阅 为 QNX 构建 Kanzi 应用程序。。
将 QNX 设备连接到计算机。
从
<ProjectName>/Application/bin目录将以下文件复制到您的 QNX 目标设备:Kanzi 应用程序 exe 文件
您的 Kanzi 应用程序使用的 kzb 文件
application.cfg文件,其中包含您的 Kanzi 应用程序使用的所有 kzb 文件的列表。
在您的 QNX 目标设备上打开命令行,并为该设备上的 Kanzi 应用程序添加执行权限:
// Adds execution rights on the QNX target device // for the Kanzi application called MyApplication. chmod 755 MyApplication
在命令行上,启动您 QNX 目标设备上的应用程序:
// Starts the Kanzi application called MyApplication. ./MyApplication
打印屏幕显示信息¶
您可以列出您的 Kanzi 应用程序的 QNX Screen 显示信息。
要打印屏幕显示信息:
Deploy your Kanzi application to QNX. See 将 Kanzi 应用程序部署到 QNX 设备.
使用
-enum-qnx-displays命令行参数运行应用程序:./MyApplication -enum-qnx-displays
该应用程序为每个显示器打印此信息并退出:
显示 ID
显示器是否已连接
显示器是否可拆卸
显示器是否聚焦
显示器的当前分辨率
(可选) 如果您以 root 身份运行应用程序:
所有可用的视频模式
当前视频模式
设置 QNX Screen 使用标志¶
您可以以编程方式设置 QNX Screen 属性的使用标志。Screen 使用标志是您可以用来约束分配的 QNX 窗口缓冲区的属性。请参阅 QnxUsageFlags。
QNX 上的已知问题¶
当您运行多个 Kanzi 应用程序并收到如下错误时
error:generic:/home/admin/ws/0/ui/Engine/source/core.ui/platform/windowing/qnx_screen/kzs_window_native.cpp:179> Unable to retrieve window size Process 1482838 (ClusterApp) terminated SIGSEGV code=1 fltno=11 ip=000000121378c348(/var/data/j01/bin/kanzi/./ClusterApp@_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEED0Ev+0x0000000000007d78) mapaddr=00000000004d4348. ref=0000000000000010
在每个 Kanzi 应用程序中,您必须将
NativeWindowProperties::groupName设置为唯一的名称。请参阅 GroupName。QNX 不再推荐使用 QCC 作为 CXX 编译器。编译 QNX 应用程序时会失败,并出现错误
QCC is not a full path and was not found in the PATH.
为 3.9.4 之前的 Kanzi 版本编译 QNX 应用程序时,请在构建配置文件中将已弃用的 QCC 编译器命令替换为 q++ 命令。
对于 CMake,编辑
Engine/cmake/toolchains/qnx7*.cmake,替换set(CMAKE_CXX_COMPILER QCC)
通过
set(CMAKE_CXX_COMPILER q++)
对于 SCons,编辑:
Engine/configs/platforms/qnx/config.py,替换default.env["CC"] = os.path.join(toolchain_bin, "QCC") default.env["CXX"] = os.path.join(toolchain_bin, "QCC")
通过
default.env["CC"] = os.path.join(toolchain_bin, "q++") default.env["CXX"] = os.path.join(toolchain_bin, "q++")
Engine/scripts/build.py,替换re.compile(r'^([^/]*/)*QCC$'),
通过
re.compile(r'^([^/]*/)*q\+\+$'),