将 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=qnx

    • CMake 定义 -DKANZI_QNX_STDLIB=qnx

  • GNU。基于 CMake 的平台包在平台包存档的名称中明确提到 gpp。

    当您使用此软件包构建应用程序时,使用:

    • SCons 标志 --stdlib=gnu

    • CMake 定义 -DKANZI_QNX_STDLIB=gnu

Kanzi 平台包支持这些库链接选项:

  • 静态。没有 scons 标志,因为它是默认选项。

    要构建具有静态链接库的应用程序,请使用 CMake 定义 -DKANZI_BUILD_SHARED_LIBS:BOOL=OFF。

  • 动态。

    要构建具有动态链接库的应用程序,使用:

    • SCons 标志 --dynamic

    • CMake 定义 -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 应用程序:

  1. 在 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。

  2. 使用构建参数运行 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:

  1. 为 QNX 构建您的 Kanzi 应用程序。请参阅 为 QNX 构建 Kanzi 应用程序。。

  2. 将 QNX 设备连接到计算机。

  3. 从 <ProjectName>/Application/output 目录复制到您的 QNX 目标设备:

    • Kanzi 应用程序 exe 文件

    • 您的 Kanzi 应用程序使用的 kzb 文件

    • application.cfg 文件,其中包含您的 Kanzi 应用程序使用的所有 kzb 文件的列表。

  4. 在您的 QNX 目标设备上打开命令行,并为该设备上的 Kanzi 应用程序添加执行权限:

    // Adds execution rights on the QNX target device
    // for the Kanzi application called MyApplication.
    chmod 755 MyApplication
    
  5. 在命令行上,启动您 QNX 目标设备上的应用程序:

    // Starts the Kanzi application called MyApplication.
    ./MyApplication
    

打印屏幕显示信息

您可以列出您的 Kanzi 应用程序的 QNX Screen 显示信息。

要打印屏幕显示信息:

  1. Deploy your Kanzi application to QNX. See 将 Kanzi 应用程序部署到 QNX 设备.

  2. 使用 -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 定义。

另请参阅

QNX 系统记录器 (slogger2)

QnxPipelineID

QnxUsageFlags

应用程序开发

部署 Kanzi 应用程序