第二章:开发环境搭建
好,咱们正式开始动手。这一章,说白了就是“把家伙事儿备齐”。
我见过太多人,一上来就急着写代码,结果编译不过去,折腾半天发现是环境没配好。嗯,磨刀不误砍柴工,咱们先把开发环境整利索了。
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
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
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 检查依赖,把缺失的库拷贝到目标板 |
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到底是怎么工作的。到时候咱们再聊。