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版本,这两个版本比较稳定。
安装步骤:
- 获取安装包:从QNX官网或你的License服务器下载。注意区分Host版本(运行在Windows/Linux上)和Target版本(运行在QNX上)。
- 运行安装程序:Linux下直接给执行权限然后运行。我遇到过权限问题,所以建议用普通用户安装,别用root。
- 选择组件:安装时勾选“QNX Momentics IDE”、“QNX SDK for Apps and Media”、“QNX Toolchain”。如果你做BSP开发,记得勾选“QNX BSP Development”。
- 配置Workspace:启动后选一个工作目录。我习惯放在
~/qnx_workspace,方便管理。
./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板子上肯定跑不起来。我曾经犯过这个错,折腾了半天才发现。
-std=c11在qcc下可能不支持所有特性。建议用-std=gnu99,兼容性更好。
2.3 目标机与宿主机连接设置
环境搭好了,代码也编译了,怎么把程序弄到板子上跑?这就涉及到目标机和宿主机的连接。QNX支持多种连接方式:串口、以太网、USB。我个人最常用的是以太网,速度快,调试方便。
网络连接配置:
- 目标机端:在QNX系统里,用
ifconfig查看IP。如果没有DHCP,手动设一个静态IP:ifconfig en0 192.168.1.100 netmask 255.255.255.0 up。 - 宿主机端:确保和板子在同一个网段。比如你的板子是192.168.1.100,那你的电脑就设成192.168.1.x。
- 测试连通性:在宿主机上
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端口。
sudo ufw allow 8000 就解决了。另外,有些板子的qconn默认端口是8001,记得确认一下。
2.4 调试配置与运行
连接成功后,就可以在IDE里直接调试了。创建一个新的C/C++项目,选择 QNX Executable,然后写代码、编译、运行。IDE会自动把可执行文件通过qconn传到板子上,并启动调试器。
手动传输文件:
如果你不想用IDE,也可以用scp或ftp。QNX默认支持ftp,在宿主机上:
ftp 192.168.1.100
# 输入用户名密码(默认是root/空)
put hello_arm /tmp/hello_arm
然后在板子上chmod +x /tmp/hello_arm,直接运行。
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的差异。准备好了吗?