第二章:开发环境搭建

好,咱们正式开始动手。这一章,说白了就是“把家伙事儿备齐”。

我见过太多人,一上来就急着写代码,结果编译不过去,折腾半天发现是环境没配好。嗯,磨刀不误砍柴工,咱们先把开发环境整利索了。

2.1 QNX SDP 安装与配置

QNX Software Development Platform(SDP)是咱们的基础。没有它,你连个Hello World都跑不起来。

2.1.1 获取安装包

我个人习惯去BlackBerry的官方站点下载。注意,QNX SDP有不同版本,咱们做AUTOSAR Adaptive集成,建议用7.1或更新的版本。为什么?因为对POSIX和C++17的支持更完善,AUTOSAR Adaptive的ara::com实现依赖这些。

下载时你会看到几个组件:

  • QNX SDP Host:安装在你的Linux主机上(Ubuntu 20.04/22.04 LTS我试过最稳)
  • QNX SDP Target:这是给目标板用的BSP和库文件
  • QNX Momentics IDE:基于Eclipse的IDE,我一般不用,但新手可以试试

2.1.2 安装步骤

安装其实不复杂,但有几个坑。我曾经在一台新机器上装了三遍才成功,就是因为没注意权限问题。

# 解压安装包
tar -xzf qnx-sdp-7.1.0-host-linux-x86_64.tar.gz

# 运行安装脚本
cd qnx-sdp-7.1.0
sudo ./install

# 安装过程中会让你选择安装路径,我习惯放在 /opt/qnx710
# 安装完成后,设置环境变量
export QNX_HOST=/opt/qnx710/host/linux/x86_64
export QNX_TARGET=/opt/qnx710/target/qnx7
export PATH=$QNX_HOST/usr/bin:$PATH
小提示:记得把环境变量写到 ~/.bashrc 里,不然每次开终端都要重新export。我吃过这个亏,调试到半夜发现是环境变量没生效。

2.1.3 验证安装

装完别急着高兴,先验证一下:

# 检查编译器
qcc --version
# 你应该能看到类似 "QCC version 7.1.0" 的输出

# 检查目标库
ls $QNX_TARGET/aarch64/lib
# 看看有没有 libc.so.7 之类的文件

如果都能看到,恭喜,QNX SDP这块算是拿下了。

2.2 AUTOSAR Adaptive 工具链安装

接下来是重头戏。AUTOSAR Adaptive的工具链,说白了就是一套代码生成器和运行时库。市面上有商业的(比如Vector、EB),也有开源的(比如Adaptive AUTOSAR on GitHub)。

我以开源的 Adaptive AUTOSAR for QNX 为例,因为咱们能拿到源码,出了问题好排查。

2.2.1 获取工具链

从GitHub上clone下来:

git clone https://github.com/adaptive-autosar/adaptive-autosar-qnx.git
cd adaptive-autosar-qnx

注意,这个仓库比较大,包含了很多子模块。我建议用 --recurse-submodules 参数一次性拉下来:

git clone --recurse-submodules https://github.com/adaptive-autosar/adaptive-autosar-qnx.git

2.2.2 安装依赖

工具链依赖一些Python库和CMake。我遇到过最头疼的是Python版本问题——有些脚本只支持Python 3.8+。

# 安装Python依赖
pip install -r requirements.txt

# 检查CMake版本(需要3.16以上)
cmake --version
注意:如果你用的是Ubuntu 18.04,默认的CMake版本可能不够。我曾经在这上面浪费了半天,最后手动编译了CMake 3.20才搞定。

2.2.3 配置工具链

工具链需要知道QNX SDP的位置。在 CMakeLists.txt 或者一个 .cmake 文件里指定:

# 创建一个 toolchain.cmake 文件
set(CMAKE_SYSTEM_NAME QNX)
set(CMAKE_SYSTEM_PROCESSOR aarch64)

set(QNX_HOST /opt/qnx710/host/linux/x86_64)
set(QNX_TARGET /opt/qnx710/target/qnx7)

set(CMAKE_C_COMPILER ${QNX_HOST}/usr/bin/qcc)
set(CMAKE_CXX_COMPILER ${QNX_HOST}/usr/bin/qcc)

嗯,这里要注意,QCC编译器默认是C语言的,编译C++要加 -lang-c++ 参数。我习惯在CMake里这样写:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lang-c++ -std=c++17")

2.3 交叉编译环境搭建

交叉编译,说白了就是在你的x86电脑上编译出能在ARM板子上跑的程序。QNX的交叉编译工具链已经包含在SDP里了,但咱们得把它和AUTOSAR Adaptive工具链串起来。

2.3.1 理解交叉编译链

QNX的交叉编译器叫 qcc,它其实是个封装器。你想想看,它背后调用了真正的GCC,但加上了QNX特有的头文件和库路径。

我刚开始用的时候,总搞不清 -V 参数是干嘛的。后来才明白,它是用来指定目标架构的:

# 编译一个简单的测试程序
qcc -Vgcc_ntoaarch64le -o hello hello.c

# -Vgcc_ntoaarch64le 表示目标架构是ARM 64位小端

2.3.2 集成AUTOSAR Adaptive与QNX

这一步是关键。AUTOSAR Adaptive的运行时库需要链接QNX的库。我建议创建一个统一的构建脚本:

#!/bin/bash
# build_adaptive.sh

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

# 清理之前的构建
rm -rf build
mkdir build
cd build

# 配置CMake
cmake .. \
    -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake \
    -DCMAKE_BUILD_TYPE=Release \
    -DTARGET_ARCH=aarch64

# 编译
make -j$(nproc)
重点:这里 -j$(nproc) 是用所有CPU核心并行编译,能快不少。但如果你内存不够(比如8GB以下),建议用 -j2,不然编译到一半会OOM。

2.3.3 验证交叉编译环境

写个简单的AUTOSAR Adaptive应用来测试:

// test_adaptive.cpp
#include <iostream>
#include <ara/core/instance_specifier.h>

int main() {
    ara::core::InstanceSpecifier specifier("test/app");
    std::cout << "AUTOSAR Adaptive on QNX works!" << std::endl;
    return 0;
}

编译它:

qcc -Vgcc_ntoaarch64le -lang-c++ -std=c++17 \
    -I$QNX_TARGET/usr/include \
    -I../adaptive-autosar-qnx/include \
    -o test_adaptive test_adaptive.cpp \
    -L$QNX_TARGET/aarch64/lib -lara_core

如果编译通过,说明环境搭建成功了。把生成的可执行文件拷贝到目标板上运行,你应该能看到输出。

2.3.4 常见问题与避坑

我遇到过几个典型问题,列出来供你参考:

问题 原因 解决方法
找不到 ara/core 头文件 头文件路径没加对 检查 -I 参数是否指向了正确的include目录
链接时提示 undefined reference 库文件顺序不对 -lara_core 放在源文件后面
运行时提示 cannot open shared object file 目标板上缺少动态库 ldd 检查依赖,把缺失的库拷贝到目标板
避坑指南:我曾经在链接阶段折腾了两天,最后发现是库的链接顺序问题。在QNX的链接器里,被依赖的库要放在依赖它的库后面。这个和Linux的GCC行为一致,但新手容易忽略。

2.4 环境验证与测试

最后,咱们跑一个完整的集成测试。我习惯写一个简单的CMake项目,把QNX和AUTOSAR Adaptive都集成进去:

# CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(adaptive_qnx_demo)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 找到AUTOSAR Adaptive包
find_package(ara-core REQUIRED)

add_executable(demo_app main.cpp)
target_link_libraries(demo_app ara-core)

然后编译:

mkdir build && cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake
make

如果一切顺利,你会得到一个 demo_app 可执行文件。把它扔到目标板上,跑一下:

# 在目标板上
./demo_app

看到输出了吗?嗯,环境搭建这块,咱们算是搞定了。

下一章,我会带你深入AUTOSAR Adaptive的运行时架构,看看ara::com到底是怎么工作的。到时候咱们再聊。