2、开发环境搭建:QNX Momentics IDE安装与配置,交叉编译工具链搭建,目标机与宿主机连接设置

说实话,从Linux转到QNX,第一个拦路虎就是开发环境。Linux下你习惯了gcc、make、vim一条龙,到了QNX这边,官方推荐的是Momentics IDE——一个基于Eclipse的集成环境。我刚开始也觉得有点别扭,但用顺手之后发现,它确实把很多底层细节封装好了。

这一章,我就带你一步步把环境搭起来。别急,踩过的坑我都标出来了。

2.1 QNX Momentics IDE 安装

QNX Momentics IDE,说白了就是QNX官方提供的集成开发环境。它基于Eclipse,但集成了QNX特有的编译器、调试器、系统分析工具。我个人习惯用7.0或7.1版本,这两个版本比较稳定。

安装步骤:

  1. 获取安装包:从QNX官网或你的License服务器下载。注意区分Host版本(运行在Windows/Linux上)和Target版本(运行在QNX上)。
  2. 运行安装程序:Linux下直接给执行权限然后运行。我遇到过权限问题,所以建议用普通用户安装,别用root。
  3. 选择组件:安装时勾选“QNX Momentics IDE”、“QNX SDK for Apps and Media”、“QNX Toolchain”。如果你做BSP开发,记得勾选“QNX BSP Development”。
  4. 配置Workspace:启动后选一个工作目录。我习惯放在~/qnx_workspace,方便管理。
小提示: 如果你在Ubuntu 20.04以上版本安装,可能会遇到GTK主题兼容问题。启动时加参数 ./qnxsdp-7.1.0-run --launcher.GTK_version 2 可以解决。

2.2 交叉编译工具链搭建

QNX的交叉编译工具链和Linux的gcc交叉编译器思路一样,但细节不同。QNX用的是自家魔改的GCC,针对不同架构有不同前缀。比如ARMv7的编译器叫qcc -Vgcc_ntoarmv7le,x86_64的叫qcc -Vgcc_ntox86_64

工具链路径配置:

安装完IDE后,工具链默认在/opt/qnx710/host/linux/x86_64/usr/bin/下。你需要把路径加到PATH里。我习惯在~/.bashrc里加一行:

export QNX_HOST=/opt/qnx710/host/linux/x86_64
export QNX_TARGET=/opt/qnx710/target/qnx7
export PATH=$QNX_HOST/usr/bin:$PATH

然后source ~/.bashrc。验证一下:

qcc --version
# 应该输出类似 QNX C/C++ Compiler 7.1.0 的信息

交叉编译一个Hello World:

写个简单的hello.c

#include <stdio.h>
int main() {
    printf("Hello from QNX!\n");
    return 0;
}

编译命令:

qcc -Vgcc_ntoarmv7le -o hello_arm hello.c

注意,这里-Vgcc_ntoarmv7le指定了目标架构。你想想看,如果忘了这个参数,默认编译出来的是x86_64的,放到ARM板子上肯定跑不起来。我曾经犯过这个错,折腾了半天才发现。

注意: QNX的qcc和Linux的gcc不完全兼容。比如-std=c11在qcc下可能不支持所有特性。建议用-std=gnu99,兼容性更好。

2.3 目标机与宿主机连接设置

环境搭好了,代码也编译了,怎么把程序弄到板子上跑?这就涉及到目标机和宿主机的连接。QNX支持多种连接方式:串口、以太网、USB。我个人最常用的是以太网,速度快,调试方便。

网络连接配置:

  1. 目标机端:在QNX系统里,用ifconfig查看IP。如果没有DHCP,手动设一个静态IP:ifconfig en0 192.168.1.100 netmask 255.255.255.0 up
  2. 宿主机端:确保和板子在同一个网段。比如你的板子是192.168.1.100,那你的电脑就设成192.168.1.x。
  3. 测试连通性:在宿主机上ping 192.168.1.100,能通就说明网络没问题。

QNX Momentics IDE连接目标机:

打开IDE,点击菜单栏 Window → Show View → Target Navigator。在Target Navigator视图里,右键选择 New QNX Target,填入:

  • Name:随便起,比如“MyBoard”
  • Hostname/IP:板子的IP地址
  • Port:默认8000(QNX的qconn服务端口)

点击Finish。如果连接成功,你会看到板子的进程列表、文件系统等信息。嗯,这里要注意:如果连不上,先检查板子上qconn服务有没有启动。在目标机上运行qconn,默认监听8000端口。

避坑指南: 我曾经遇到一个问题——板子能ping通,但IDE就是连不上。后来发现是防火墙把8000端口封了。在宿主机上执行 sudo ufw allow 8000 就解决了。另外,有些板子的qconn默认端口是8001,记得确认一下。

2.4 调试配置与运行

连接成功后,就可以在IDE里直接调试了。创建一个新的C/C++项目,选择 QNX Executable,然后写代码、编译、运行。IDE会自动把可执行文件通过qconn传到板子上,并启动调试器。

手动传输文件:

如果你不想用IDE,也可以用scpftp。QNX默认支持ftp,在宿主机上:

ftp 192.168.1.100
# 输入用户名密码(默认是root/空)
put hello_arm /tmp/hello_arm

然后在板子上chmod +x /tmp/hello_arm,直接运行。

小技巧: 我习惯写个Makefile,里面同时包含编译和上传命令。比如:
all:
    qcc -Vgcc_ntoarmv7le -o hello_arm hello.c
    scp hello_arm root@192.168.1.100:/tmp/
这样一条make命令就搞定了编译和部署,省事。

2.5 常见问题与解决

问题 原因 解决方法
IDE启动报错“Failed to create the Java Virtual Machine” 内存分配不足 修改eclipse.ini,把-Xmx512m改成-Xmx1024m
qcc编译报错“unrecognized command line option” 参数不兼容 检查是否用了Linux特有的gcc参数,比如-march=native
目标机连不上IDE qconn未启动或端口被防火墙拦截 目标机上运行qconn &,宿主机检查防火墙
程序运行时报“cannot find libc.so.7” 动态库路径不对 设置LD_LIBRARY_PATH,或者用-static静态编译

说实话,搭建环境这件事,第一次总是最痛苦的。但一旦配好了,后面就顺了。我建议你把每一步都记下来,尤其是那些踩过的坑。下次换台电脑或者换块板子,照着笔记来,十分钟就能搞定。

下一章,我们会聊聊QNX的进程管理和Linux的差异。准备好了吗?