将 Kanzi 应用程序部署到 QNX¶
在您可以为目标平台构建 Kanzi 应用程序之前,请为目标平台设置和配置 Kanzi 构建环境。构建环境包括 Kanzi 构建系统用于为目标平台构建应用程序的工具。
您可以在 Kanzi 安装中下载用于虚拟机 (x86_64) 的 QNX 7.0。用于嵌入式的 QNX aarch64 和 x86_64 可根据请求提供。
要求¶
要构建和部署 Kanzi 应用程序到 QNX,您需要:
QNX 软件开发平台 7.0.0 或 7.1。
QNX 软件开发平台的库要求:
slog2
您可以在 https://blackberry.qnx.com 获取 QNX 开发工具。
对于基于 SCons 的平台包:
对于 SCons 3.0.0 到 4.2.0,Python 3.5 或更新版本。
对于 SCons 4.3.0 或更新版本,Python 3.6 或更新版本。
对于基于 Cmake 的平台包:CMake 3.21 和 Ninja 1.10.x
在将您的 Kanzi 应用程序部署到 QNX 目标设备之前,确保将设备运行 QNX Screen 服务。请参阅 http://www.qnx.com/developers/docs/7.0.0/index.html#com.qnx.doc.screen/topic/manual/cscreen_about.html。
支持的构建系统、STDLIB 实现和库链接。¶
Kanzi 平台包支持以下构建系统:
SCons。请注意,该平台包名称中不包含
SCons。当您提取此平台包时,您可以在
Engine/configs/platforms/<QNX platform version>目录中找到它。平台包包含
SConstruct和config.py文件。CMake。请注意,该平台包的名称中包含
-cmake。当您提取此平台包时,您可以在
Engine/cmake/toolchains/<QNX platform version>中找到它。平台包包含
<QNX platform version>.cmake文件,其中列出了用于创建它的 CMake 选项。
Kanzi 提供基于以下 STDLIB 实现的 QNX 平台包:
LLVM。您可以通过平台包存档名称中的
_cxx或-cxx来识别此实现。当您使用此软件包构建应用程序时,使用:
SCons 标志
--stdlib=qnxCMake 定义
-DKANZI_QNX_STDLIB=qnx
GNU。基于 CMake 的平台包在平台包存档的名称中明确提到
gpp。当您使用此软件包构建应用程序时,使用:
SCons 标志
--stdlib=gnuCMake 定义
-DKANZI_QNX_STDLIB=gnu
Kanzi 平台包支持这些库链接选项:
静态。没有
scons标志,因为它是默认选项。要构建具有静态链接库的应用程序,请使用 CMake 定义
-DKANZI_BUILD_SHARED_LIBS:BOOL=OFF。动态。
要构建具有动态链接库的应用程序,使用:
SCons 标志
--dynamicCMake 定义
-DKANZI_BUILD_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 为 QNX 7.1 构建 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.cmake -DPLATFORM_BACKEND=qnx_screen -DCMAKE_INSTALL_PREFIX=../bin -DKANZI_QNX_STDLIB=qnx -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.cmake -DPLATFORM_BACKEND=qnx_screen -DCMAKE_INSTALL_PREFIX=../bin -DKANZI_QNX_STDLIB=gnu -DKanzi_DIR=../../lib/cmake/Kanzi -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON .. cmake --build . cmake --install .
使用 CMake 为 QNX 7.0 构建 Kanzi 应用程序。¶
在某些支持 QNX 7.0 的设备上,并非所有 ES 3.2 功能都能正常工作。要解决这些问题,请使用这些定义通过 CMake 为 GL_ES 3.1 构建 Kanzi 应用程序:
-DKANZI_GLES_LINKED:STRING=31-DKANZI_GLES_DLOAD:STRING=31
例如,使用 CMake 在 Linux 上为 QNX 7.0 构建 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/qnx700-aarch64.cmake -DPLATFORM_BACKEND=qnx_screen -DCMAKE_INSTALL_PREFIX=../bin -DKANZI_QNX_STDLIB=qnx -DKANZI_BUILD_SHARED_LIBS:BOOL=ON -DKANZI_GLES_LINKED:STRING=31 -DKANZI_GLES_DLOAD:STRING=31 -DKanzi_DIR=../../lib/cmake/Kanzi -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON .. cmake --build . cmake --install .
使用 GNU STDLIB 实现,从非 cxx 平台包中,使用静态库链接:
cd Engine/applications/kzb_player mkdir build cd build cmake -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=../../cmake/toolchains/qnx700-aarch64.cmake -DPLATFORM_BACKEND=qnx_screen -DCMAKE_INSTALL_PREFIX=../bin -DKANZI_QNX_STDLIB=gnu -DKANZI_BUILD_SHARED_LIBS:BOOL=OFF -DKANZI_GLES_LINKED:STRING=31 -DKANZI_GLES_DLOAD:STRING=31 -DKanzi_DIR=../../lib/cmake/Kanzi -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON .. cmake --build . cmake --install .
使用 SCons 为 QNX 构建 Kanzi 应用程序。¶
SCons 在您运行 scons 命令的平台的配置目录中运行 SConstruct 文件。SConstruct 文件是构建应用程序的入口点,包含有关 Kanzi Engine 位置的信息,并运行这些文件:
<KanziWorkspace>/Engine/configs/platforms/common/config.py包括 Kanzi 库定义和在为所有平台构建时使用的通用构建标志。<KanziWorkspace>/Engine/configs/platforms/<PlatformName>/config.py包含 Kanzi 平台特定的构建标志和定义,以及工具链。当您想要自定义平台的构建配置时,请编辑此文件。例如,要匹配您的平台 SDK 和板级支持包的位置。<ProjectName>/Application/configs/platforms/common/config.py包含可选的、项目特定的通用配置参数。<ProjectName>/Application/configs/platforms/<PlatformName>/config.py包含可选的、项目特定的平台配置参数。
要使用 Scons 为 QNX 构建 Kanzi 应用程序:
在 Kanzi Studio 中选择 File > Open Kanzi Command Prompt,并在 Kanzi Command Prompt 中,在您要构建 Kanzi 应用程序 (
<ProjectName>/Application/configs/platforms/<PlatformName>) 的平台的配置目录中。例如,要为 Linux 构建您的 Kanzi 应用程序,请在
<ProjectName>/Application/configs/platforms/linux_x11_glx_cpp98目录中打开 Kanzi Command Prompt。使用构建参数运行
scons命令以用于您的 Kanzi 应用程序。语法
scons <library> <type> <name>参数
library(可选) 图形库:
ES2使用 OpenGL ES 2.0 构建应用程序。ES3使用 OpenGL ES 3.0 构建应用程序。
type(可选) 构建类型:
Release使用启用编译器优化的方式构建应用程序。发布选项构建的文件比调试选项更小。使用此选项用于生产目的。默认值。Debug构建应用程序时禁用编译器优化,并包含可与调试器一起使用的完整调试信息。调试选项构建的文件较大,调试应用程序运行较慢。使用此选项用于开发目的。Profiling在启用编译器优化的情况下构建应用程序,并将应用程序链接到 Profiling 构建。当您想要测量 Kanzi Engine 不同部分的性能时,请使用此选项。例如,当您想要了解 Kanzi 在应用程序启动期间用于不同任务的时间,或者应用程序的哪些部分运行时间较长时。请参阅 测量应用程序性能。
name(可选) 项目的名称。
示例
// Builds the application with the default settings as specified // in config.py and SConstruct configuration files. scons
// Builds the debug version of the application. scons debug
// Builds the debug version of the application with the // OpenGL ES 3.0 graphics library from the |ks| // project named MyProject. scons ES3 debug MyProject
Scons 在 <ProjectName>/Application/output 目录中构建 Kanzi 应用程序的源代码和二进制文件。
将 Kanzi 应用程序部署到 QNX 设备¶
要将 Kanzi 应用程序部署到 QNX:
为 QNX 构建您的 Kanzi 应用程序。请参阅 为 QNX 构建 Kanzi 应用程序。。
将 QNX 设备连接到计算机。
从
<ProjectName>/Application/output目录复制到您的 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.
当您为 Kanzi 版本低于 3.9.4 的 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\+\+$'),
当您使用 QNX 7.0.0 并通过 QNX 软件中心更新您的 QNX 软件时,编译 Kanzi 应用程序会失败,并出现错误。
Kanzi-3_6_5-qnx700_screen_aarch64-es3-freetype-static/Engine/include/kanzi/core/cpp/cstdio.hpp:42:12: error: 'std::snprintf' has not been declared
QNX 在软件开发平台的某次更新中引入此错误,原因为更新的头文件中缺失
std::snprintf。解决方法:要消除编译错误,请在预处理器标志中添加
-DKZ_USE_C99_SNPRINTF定义。