2. QNX开发环境搭建:Momentics IDE安装、SDK配置、交叉编译工具链设置、目标机与宿主机连接
好,咱们直接进入正题。开发环境搭建这件事,说简单也简单,说复杂也复杂。我见过不少新手,卡在环境配置上好几天,最后发现是路径写错了。所以这一章,我会把每一步的关键点都给你讲透。
2.1 QNX Momentics IDE安装——别急着点下一步
Momentics IDE,说白了就是QNX官方基于Eclipse定制的集成开发环境。你可以在QNX官网的「Download」页面找到它。我个人习惯用7.1版本,稳定,坑少。
安装时注意几点:
- JDK版本要匹配:Momentics 7.1需要JDK 11以上。我遇到过有人装了JDK 8,IDE死活打不开,折腾半天才发现是版本问题。
- 安装路径不要有中文:这个老生常谈了,但总有人踩坑。路径里有空格都行,就是别用中文。
- 选择完整安装:安装向导会让你选组件,建议全选。虽然占用空间大一点,但后面省心。
qnxmomentics.ini 文件里,把 -Xmx 参数调大一点,比如 -Xmx2048m。不然编译大项目时容易内存溢出。
2.2 QNX SDK配置——选对版本很重要
SDK配置,其实就是告诉IDE你要用哪个版本的QNX系统库和工具链。QNX的SDK是跟着BSP走的,不同硬件平台对应不同的SDK。
配置步骤:
- 打开Momentics IDE,点击
Window → Preferences → QNX → QNX SDKs - 点击
Add,选择你下载的SDK根目录 - IDE会自动识别SDK版本和架构
嗯,这里要注意:一个工作空间可以配置多个SDK。比如我同时做ARM和x86的项目,就会把两个SDK都加进去。切换项目时,IDE会自动匹配对应的SDK。
libc.so.6 not found。后来发现是SDK版本比目标机上的系统版本新,库不兼容。所以,SDK版本必须和目标机上的QNX系统版本一致。
2.3 交叉编译工具链设置——这是核心
交叉编译,说白了就是在你的PC(x86架构)上编译出能在ARM或其它架构上运行的程序。QNX的工具链是 qcc,它封装了底层的gcc。
工具链的配置其实不需要手动做,SDK装好后,IDE会自动识别。但你要理解它的结构:
| 组件 | 说明 | 典型路径 |
|---|---|---|
| 编译器 | qcc(封装gcc) | ${QNX_HOST}/usr/bin/qcc |
| 链接器 | nto-<arch>-ld | ${QNX_HOST}/usr/bin/nto-aarch64-ld |
| 系统库 | libc.so, libm.so 等 | ${QNX_TARGET}/<arch>/lib |
| 头文件 | 系统API头文件 | ${QNX_TARGET}/usr/include |
你想想看,如果没有交叉编译工具链,你的PC程序怎么跑到ARM板子上?指令集都不一样。所以这个环节必须搞明白。
验证工具链是否正常,可以在终端里跑一下:
# 查看qcc版本
qcc --version
# 编译一个简单的hello world
qcc -Vgcc_ntoaarch64le hello.c -o hello
# 查看生成文件的架构
file hello
# 输出应该是:ELF 64-bit LSB executable, ARM aarch64
关键环境变量:
QNX_HOST:指向宿主机工具链路径QNX_TARGET:指向目标机系统库和头文件路径
这两个变量在IDE里是自动设置的。如果你用命令行编译,需要手动 source 一下SDK里的 qnxsdp-env.sh。
2.4 目标机与宿主机连接——让两边能说话
环境搭好了,代码也编译了,怎么把它弄到目标机上跑?这就涉及到连接方式了。QNX支持好几种方式,我按常用程度给你排个序:
2.4.1 网络连接(最常用)
通过以太网连接。目标机启动后,用 ifconfig 查看IP地址。宿主机这边,用 ping 测试连通性。
配置步骤:
- 在IDE中,打开
QNX Target Navigator视图 - 右键点击空白处,选择
New QNX Target - 输入目标机的IP地址和端口(默认8000)
- 点击
Test Connection,如果显示绿色对勾,就说明连上了
qconn 服务有没有启动。在目标机终端执行 qconn,它会监听8000端口。我遇到过好几次,目标机启动后qconn没自动跑起来,手动启动就好了。
2.4.2 串口连接(调试用)
当网络不通时,串口是最后的救命稻草。配置方法:
- 宿主机上安装串口驱动,比如PL2303或CP2102
- 用
screen或putty连接,波特率通常115200 - 在IDE中,Target Navigator里选择
Serial类型,配置端口和波特率
说实话,串口速度慢,传大文件很痛苦。我一般只用它来查看内核启动日志,或者做紧急调试。
2.4.3 USB连接(开发板常用)
有些开发板支持USB gadget模式,插上USB线就能识别为一个网络设备。配置方法类似网络连接,只是IP地址是虚拟的,比如 192.168.1.2。
CONFIG_USB_GADGET。
2.5 验证环境——跑一个Hello World
环境搭好没,跑个程序就知道了。我习惯写一个简单的多线程程序来验证:
#include <stdio.h>
#include <pthread.h>
void* thread_func(void* arg) {
printf("Hello from thread!\n");
return NULL;
}
int main() {
pthread_t tid;
pthread_create(&tid, NULL, thread_func, NULL);
pthread_join(tid, NULL);
printf("Hello from main!\n");
return 0;
}
编译命令:
qcc -Vgcc_ntoaarch64le -lpthread hello_thread.c -o hello_thread
然后通过IDE的Target Navigator,右键点击目标机,选择 Launch QNX Application,选择你的可执行文件。如果控制台输出了两行Hello,恭喜你,环境搭建成功了。
嗯,到这里,开发环境就搭好了。下一章我们会讲QNX系统的启动流程,从IPL到内核初始化,每一步我都会结合实际的BSP代码来讲。到时候见。