ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

QNX SDP 8.0开发环境搭建指南:从安装到运行第一个程序

QNX SDP 8.0开发环境搭建指南:从安装到运行第一个程序 先在开头说点实在的。QNX SDP 8.0 这套开发环境我前前后后折腾过不止一次。第一次是在一台只有 16G 内存的 Windows 笔记本上装完 SDP、建好工程、编译通过结果卡在“怎么把程序跑起来”这一步对着黑乎乎的终端窗口发懵。后来换到 Linux 宿主机又因为环境变量和 License 路径的问题绕了不少弯路。写这篇东西就是想把这些坑提前帮你填平。这篇主要针对三类人一是刚接触 QNX、想把它作为学习方向的学生或转行者二是做 Linux 嵌入式开发、想了解 QNX 与 Linux 在工具链和开发模式上有何异同的工程师三是项目里已经要用到 QNX需要在短时间把 SDP 8.0 环境搭起来跑通 demo 的开发者。读完你能学会三件事把 SDP 8.0 装好、验证工具链、跑通一个真实的 QNX 程序并且知道下一个阶段往哪个方向深入。1. 先花10分钟搞清楚这3个词再动手1.1 QNX到底是什么QNX 是一个实时操作系统属于微内核架构。和 Linux 那种宏内核不同QNX 的内核非常小主要只做中断处理、进程调度、IPC进程间通信和时钟管理其他系统服务比如驱动、文件系统、网络协议栈全部以独立进程的方式跑在内核之外。这意味着某一个驱动崩了不会导致整个系统崩溃最多重启那个进程恢复速度还很快。这种“打死一个不会团灭”的架构天然适合对安全等级要求极高的场景。所以你去翻车载系统会发现很多仪表盘、HUD、座舱域控制器跑的都是 QNX医疗设备、轨道交通、工业控制器里 QNX 也占了很大比重。最近这几年汽车软件化越来越明显QNX 在智能座舱和自动驾驶域控里的曝光度一下子高了不少招聘需求也跟着上来了。现在学 QNX方向上不吃亏。1.2 SDP 8.0包含哪些东西SDP 全称 Software Development Platform官方叫 QNX Software Development Platform。它不是单指一个编译器而是一整套用于开发 QNX 应用的平台工具。SDP 8.0 对应的是 QNX OS 8.0我理解你可以把它类比成 Linux 世界里一套完整的交叉编译工具链加 SDK 再加一个 IDE。SDP 8.0 里核心包含这几块QNX 工具链以 qcc 为编译前端的一套 GCC 交叉编译工具链实际是编译宿主上的代码生成跑在目标机上的可执行文件。目标机运行库也就是 QNX_TARGET 目录里面是目标机上程序运行所需的头文件、库文件、启动脚本等。QNX IDE基于 Eclipse 的一整套图形开发环境用来建工程、写代码、编译、远程部署、调试和分析系统性能。BSP板级支持包针对具体硬件平台的基础移植包SDP 里会带一些参考板级的 BSP方便你直接在硬件上跑系统。QNX 系统镜像与虚拟机支持可以快速启动一个 QNX 虚拟机用于学习验证这个对没有板子的人特别友好。1.3 这套环境能帮你做什么把 SDP 8.0 搭好之后你会获得一条非常完整的开发链路在宿主机上写代码交叉编译成目标架构比如 x86_64 或 AArch64的产物然后通过 IDE 或者命令行把产物部署到 QNX 环境里运行最后还能在 IDE 里打断点调试、看 CPU 负载、看线程调度情况。8.0 版本相比旧版本比较大的变化是加大了 Linux 友好度。你如果会 Linux 下那套交叉编译和 Makefile 的玩法转到 QNX 会非常顺。另外 8.0 在安全认证、图形栈、虚拟化方向都有加强这也是它想继续抓车载市场的一个信号。对学习来说SDP 8.0 的 IDE 和工具链比早期 QNX 开发要友好不再需要你对着命令行硬啃。2. 安装前的准备硬件、软件和License2.1 宿主机怎么选QNX SDP 8.0 对宿主机的选择我实测下来的感觉是能用 Linux 就尽量用 LinuxWindows 也能跑但会多一些小的边界问题。如果你机器上有 VMware 或者 VirtualBox也可以建一个 Ubuntu 22.04 的虚拟机专门用来跑 SDP这是很多同事推荐的模式干净、可控、出现问题好排查。硬件方面建议至少满足这些CPUx86_644 核以上比较舒服编译的时候可以并行。内存16GB 起步。你可能会同时开 IDE、QEMU 虚拟机、目标机文件系统内存低了会很卡尤其是用 IDE 的 QNX 虚拟机功能。磁盘预留 60GB 以上。SDP 本身加工具链大概 10 到 20 个 G虚拟机镜像和编译产物也会占不少宁可多留。操作系统Windows 10 或 11Ubuntu 20.04 LTS / 22.04 LTS 这类主流版本。Linux 发行版太新或太冷门容易碰到依赖库的问题不建议折腾。网络需要联网下载安装包、License 激活后续如果要在 QEMU 里部署程序宿主机的网络配置也会用到。2.2 获取安装包与License的完整路径QNX SDP 不是完全免费开源的你需要先去官网注册一个账号下载 SDP 8.0 的安装包并且申请评估版 License。评估版 License 一般能给你 30 天左右的完整功能试用足够你把环境跑通、把 tutorial 做完。如果是在公司项目里使用最好直接让公司走商业 License省得试用期到了之后某天突然不能编译。这里有一个很多人忽略的地方License 激活需要参考你宿主机网卡相关的机器信息。如果是虚拟机里跑那就以虚拟机的网卡为准所以尽量提前确定宿主机方案再申请 License不然后面换了机器或者改了网络License 可能就需要重新走一遍激活流程。下载安装包的时候留意版本和宿主机的匹配别下错。评估版一般会提供一个 Windows 的安装程序和一个 Linux 用的安装脚本或压缩包。装之前建议把杀毒软件、Windows Defender 的实时防护暂时关掉SDP 的工具链里有大量需要写入 PATH 的小工具某些杀毒软件会误报装到一半卡死很恶心。2.3 安装时的几个选择想清楚安装路径这个小事很多人不当回事结果后面吃了大亏。SDP 的安装路径绝对不能有中文不能有空格。我见过有人装在D:\Program Files\qnx800这种路径下结果一堆 Makefile 里的路径处理直接出错。建议装到D:\qnx800或者C:\qnx800Linux 下装到/opt/qnx800或者$HOME/qnx800都行。SDP 安装时会让你选择要安装哪些组件包括 IDE、目标机镜像、BSP 等。如果你是新手我建议全选别省这点磁盘。尤其“目标机运行库”和“系统镜像”这两块后面学习虚拟机调试和跑 demo 都会用到。装完之后把安装路径记下来后面配环境变量和找工具位置全靠它。3. 一步一步把SDP 8.0装起来3.1 Windows宿主机的安装流程Windows 下的安装其实更像传统软件下载安装包后双击运行跟着向导走。需要注意的是安装模式里通常会有“为当前用户安装”和“为所有用户安装”两个选择建议选择当前用户避免后续权限问题。安装完成后桌面上会出现 QNX SDP 8.0 相关的快捷方式但真正要用的环境变量脚本并没有自动加进系统 PATH。打开一个普通的 CMD 或者 PowerShell先输入qcc大概率提示找不到命令。这时候你需要先执行环境变量脚本。SDP 8.0 安装目录下一般有个类似qnx800-env.bat的文件CD 到安装目录执行它cd /d D:\qnx800 qnx800-env.bat qcc -V街面上很多教程会让你手动去系统设置里加 PATH但我不推荐因为 SDP 内部的环境变量不止 PATH 一个还有QNX_HOST、QNX_TARGET、MAKEFLAGS这些手动配置容易漏。直接用官方提供的 env 脚本是最省心的做法。每次打开新终端都要重新执行一次或者你可以把脚本路径写进快捷方式的目标里。3.2 Linux宿主机的安装流程Linux 下的安装方式更贴近嵌入式工具链的常规玩法。拿到安装包并解压后会有一个安装脚本直接用管理员权限执行。安装目录选好之后官方会提示你把环境脚本加入 shell 的启动配置。典型做法是把这段加到~/.bashrc里export QNX_BASE/opt/qnx800 source $QNX_BASE/qnx800-env.sh注意这里QNX_BASE这个变量名在不同版本里可能有习惯性用法但真正关键的是qnx800-env.sh里定义的QNX_HOST和QNX_TARGET。装完后执行source ~/.bashrc然后验证工具链which qcc echo $QNX_HOST echo $QNX_TARGET qcc -V我见过有人把qcc和系统里自带的gcc弄混两个命令输出不一样。qcc是 QNX 的编译器驱动它内部会调用 GCC 并且自动带上 QNX 的头文件和库的搜索路径直接用系统的gcc去编 QNX 程序是编不出来的这一点后面还会提到。3.3 验证工具链是否正常工作工具链装好之后最好做一个“冒烟测试”写一个最简单的 C 文件用 qcc 编一下看看能不能生成目标机格式的可执行文件。先写代码#include stdio.h int main(void) { printf(Hello from QNX SDP 8.0!\n); return 0; }执行编译。注意-V参数后面跟的是目标架构的变体名称。如果你的目标机是 64 位 x86那命令是qcc -V gcc_ntox86_64 hello.c -o hello_x86_64如果目标是 ARM64就写qcc -V gcc_ntoaarch64 hello.c -o hello_aarch64编译后可以用file命令看一下产物file hello_x86_64正常情况下你会看到这是一个 QNX 系统的可执行文件架构是 x86-64动态链接到 libc 之类的库。注意它不会显示成 Linux 的 ELF虽然同样是 ELF 格式但动态链接器路径和依赖库都是 QNX 的。到这一步工具链就算验证通过了。3.4 新手的第一个坑qcc和gcc不要混用这个问题值得单独拿出来说。很多从 Linux 转过来的使用者看到 qcc 用起来跟 gcc 差不多就以为两者可以互相替代。实际不是这样。qcc会在编译时偷偷注入 QNX 特有的一些宏定义、头文件搜索路径、库链接参数。你如果绕过 qcc 直接用 gcc编出来的东西要么是 Linux 的格式要么缺一堆 QNX 的系统调用相关定义根本没法在 QNX 目标机上跑。还有一个细节qcc默认会编译成动态链接的可执行文件依赖 QNX 目标机的libc.so。如果你想让产物不依赖目标机上的库可以加-static参数这样拷到任何同架构的 QNX 环境里都能直接跑。不过对于学习阶段动态链接就够了因为 IDE 部署程序时会自动把依赖的库打包过去。4. 进入QNX IDE从工程到调试4.1 创建QNX工程的关键选项纯命令行能跑通说明工具链没问题但 QNX 真正的开发体验还是要进 IDE。SDP 8.0 的 IDE 基于 Eclipse首次启动会让你选 workspace 目录。我建议别把 workspace 放在默认的“用户目录/文档”下面最好放在一个干净无空格的路径比如D:\qnx_workspace或~/qnx_workspace。新建工程的时候在 File - New 里选择 QNX Project语言选 C。最关键的一步是选择目标平台的变体。IDE 里一般会提供一个下拉框让你选 target 架构如果你现在用 QEMU 跑 x86_64 的镜像那就在工程属性里把 target 设成x86_64。这个配置和命令行参数gcc_ntox86_64是一一对应的选错的话编译出来的程序部署到目标机上直接报“Exec format error”或者“No such file or directory”。工程建好后IDE 会自动生成 Makefile你可以在工程名上右键选择 Build Project。首次构建会有一个漫长的过程因为要建立索引、生成依赖之后就会快很多。如果你机器性能一般建议在工程属性里把并行构建的线程数调上去默认可能只有 1 个改成和 CPU 核心数一样能明显加速。4.2 编译、部署、运行一条龙IDE 的本质优势在于“远程部署”这一套。QNX 的开发模式是 host-target 模式你写的代码在宿主机上编译但运行的地方是 QNX 目标机。目标机可以是 QEMU 虚拟机也可以是实际板子。IDE 通过 qconn 协议和 QNX 目标机通信qconn 就是跑在目标机上的一个服务进程默认端口是 8000。在 IDE 里右键工程选择 Run As - QNX C/C ApplicationIDE 会弹出运行配置。你需要指定目标机的 IP 地址。如果目标机是 QEMU 虚拟机并且网络模式配置得当你可以直接用 IDE 里自动发现的 Target 节点。Target Navigator 面板会列出在线目标机正常情况下能看到一个带 IP 的设备展开之后能看到进程列表和文件系统。Run 的时候IDE 会把可执行文件以及它依赖的库自动传到目标机上然后在目标机上启动进程并把 stdout 回显到 IDE 的控制台。这一步如果通了恭喜你你已经完成了一个完整的 QNX 应用开发闭环。这比命令行自己 scp 文件省事得多也是 IDE 最值钱的地方。4.3 调试器与System Profiler的入门用法程序跑通之后下一步可以试试调试。在工程上右键选择 Debug As - QNX C/C ApplicationIDE 会切到调试视角。QNX 的调试器底层是 GDB但用起来跟本地 GDB 不太一样你可以看到目标机上的线程列表、内存、变量可以在源码里打断点单步执行。调试的价值在于它能让你看到 QNX 实时系统下的调度行为。你可以在 IDE 里同时打开 System Profiler系统分析器能够抓取一段时间内的线程运行状态、中断、IPC 消息流动。对查性能问题、排查优先级反转这些实时系统特有的问题System Profiler 比任何 print 大法都管用。建议初学阶段就把这两个工具用起来别只停留在 console 打印。5. 让程序跑在“真环境”里虚拟机和BSP5.1 为什么推荐先用QEMU练手初学者上手 QNX最大的门槛是没有硬件。如果为了学 QNX 先买一块 ARM 开发板成本高、BSP 配置也复杂容易在硬件上卡两周。QEMU 提供了一条捷径你可以直接用 QEMU 启动一个 x86_64 的 QNX 系统镜像当成一台虚拟目标机来用。SDP 8.0 一般会提供适用于 QEMU 的镜像文件。这个镜像可以看作是“已经装好系统并从 QNX 内核启动完成”的一个磁盘镜像。用 QEMU 启动它的好处是架构简单、文档多、出错容易排查。你也可以快照系统状态玩坏了回滚一下就好完全不怕把环境搞挂。如果你用 IDE 自带的 QNX Virtual Machine 功能IDE 能自动配置 QEMU 并把目标机识别出来。但我建议至少手动跑一次 QEMU这样你心里对“虚拟目标机”到底是怎么工作的更清楚后面排障也能理解更多底层细节。5.2 启动QNX虚拟机并部署程序手动启动 QNX 虚拟机最基础的一条命令大概长这样qemu-system-x86_64 -m 4096 -smp 4 \ -drive fileqnx800-x86_64.img,formatqcow2 \ -netdev user,idnet0 -device e1000,netdevnet0 \ -display sdl注意-netdev user是 QEMU 的用户态网络也就是虚拟机的网络包透过宿主机模拟的 NAT 到达外网。QNX 目标机启动后会通过 DHCP 拿到一个类似10.0.2.15的地址。这个地址宿主机能直接访问也就是说 IDE 里的 Target Navigator 能够通过这个 IP 连上 qconn。部署程序时如果走命令行可以用 scp 把编译好的可执行文件拷过去然后在 QNX shell 里执行。QNX 系统里有一个 shell 自带的ls、cat、mount这些工具基本命令跟 Linux 是兼容的但用法细节可能略有不同。比如查看网络地址用的是ifconfig查看进程用pidin而不是ps这个需要习惯。如果走 IDE那就不用关心 scp 细节设置好 target 之后IDE 自动上传并启动。如果目标机在上电后没被 IDE 识别到优先检查 qconn 是否在目标机上运行、目标机和宿主机能不能互相 ping 通、目标机防火墙有没有拦截 8000 端口。5.3 有硬件后如何通过BSP移植虚拟机上玩明白之后如果手里有实际的 QNX 支持板卡就可以接触 BSP 的玩法。BSP 提供从 bootloader 到 QNX 内核启动的整套支持包括串口、网卡、存储、时钟等基础设备的驱动和配置。SDP 8.0 自带一些参考板卡的 BSP比如某些 x86 平台和主流 ARM 平台的参考实现。BSP 相关的开发步骤一般包括根据板卡硬件修改内核配置、编译镜像、把镜像烧写到板子、启动后确认串口输出和网络连通。这一步比虚拟机的复杂度会高一个量级因为要面对真实硬件的不确定性比如 DDR 初始化、PHY 芯片驱动、文件系统分区大小。好在你已经通过 QEMU 熟悉了一遍 QNX 的系统启动和程序部署流程剩下的其实就是硬件适配问题。6. 常见问题与避坑笔记6.1 License和环境变量类问题License 激活不了或者用几天后突然编译报错。先确认环境变量QNX_LICENSE_PATH是否指向了正确的路径很多环境脚本在切换终端后没有自动设置。其次确认网卡信息没有变化特别是虚拟机环境下每次新建虚拟机 MAC 地址可能都不同License 就会失效。升级硬件或者换网卡之前最好先解除激活。终端里输入 qcc 提示找不到命令。大概率是 source 环境脚本的动作没有做。Windows 下每次新开 CMD 都要重新执行qnx800-env.batLinux 下检查~/.bashrc是否真的加了 source 那行。另外确认安装路径里没有空格有空格的话很多脚本会直接爆炸。6.2 编译与架构相关的问题明明编译成功部署到目标机却报 “Exec format error”。这就是编译架构选错了。你在 IDE 工程属性里把 target 设成了 ARM 架构然后在 x86_64 的 QEMU 目标机上运行当然跑不了。命令行编译时尤其容易犯这个错因为-V gcc_ntoaarch64和-V gcc_ntox86_64就差几个字母。编译时报头文件找不到比如 pthread.h 或者 sys/neutrino.h 找不到。说明QNX_TARGET设置不正确或者你这个工具链在编译时不知道目标机运行库的位置。确认echo $QNX_TARGET的输出应该指向安装目录下的 target 目录里面应该有qnx8之类的子目录头文件在对应架构的 usr/include 下。symbol lookup error 或动态库找不到。如果你在宿主上编译时链接了一个目标机上不存在的库运行就会报这个错。先用ldd看看可执行文件依赖了哪些库然后在目标机上确认这些库是否存在。IDE 部署通常会帮你把库传过去命令行方式没这么智能。6.3 运行与调试连接的问题QEMU 启动了但网络不通。先确认 QEMU 的-netdev参数和-device都加了少了任何一行虚拟机就只有回环网卡。启动后进入 QNX shell用ifconfig查看网卡状态看是否有 DHCP 拿到的地址。用户态网络的默认网段是10.0.2.0/24网关是10.0.2.2跟虚拟机技术的 NAT 网络是同一个思路。IDE 的 Target Navigator 一直看不到目标机。先自己 ping 一下目标机 IP如果 ping 通了再确认目标机上 qconn 进程是否在跑。QNX 系统镜像默认可能没有启动 qconn需要你手动执行/usr/sbin/qconn或者在系统启动脚本里加入。如果目标机和宿主机之间有防火墙记得放行 8000 端口。调试时断点不生效或单步特别慢。一种原因是编译时开了高优化等级变量被优化掉了行号也对不上。调试用的工程建议用-O0 -g编译。另一种原因是目标机的负载很高或者 qconn 连接的链路不稳定虚拟机的网络模式如果配置复杂也可能导致调试体验很差。建议调试时把优化关掉并将目标机和宿主机放在同一个简单网络里。6.4 我的额外建议我自己在实际操作中的体会是学 QNX 跟学 Linux 嵌入式很像最重要不是记住某个命令而是理解“宿主机编译 目标机运行”这个模型。你只要把QNX_HOST、QNX_TARGET、qconn、目标架构这几个概念吃透遇到 90% 的问题都能自己推断出来。最后分享一个小技巧建议你准备两个 shell 窗口一个是宿主机窗口用来执行编译一个是 QNX 目标机的终端窗口用来跑命令。两个窗口并排摆着效果比你在 IDE 里来回切换要清晰得多。等你把命令行这套流程跑顺了再回到 IDE 里你会突然明白每个按钮背后到底帮你做了什么。
返回列表