1、确定QNX系统的架构
我们要如何确认QNX系统的架构呢?
连接我们的qnx开发板,输入下述指令。
uname -a
以我的开发板为例子,版本信息如下:
# uname -a
QNX localhost 7.0.X 2022/04/21-10:05:23EDT SA8155_ADP_Star_v1.0.0_UFS_NORMAL aarch64le
可以看到我们使用的是高通的SA8155芯片,系统架构为aarch64le
同时我们也可以看到QNX系统的版本为7.0.X。
注意上诉我们说的系统架构aarch64le,aarch64le和aarch64并不是相同的。
aarch64 (Big-Endian):
aarch64 表示 ARM 64 位架构的默认字节序,即大端序(Big-Endian)。
在大端序中,数据的高字节保存在内存的低地址处,而低字节保存在高地址处。
aarch64le (Little-Endian):
aarch64le 表示 ARM 64 位架构的小端序(Little-Endian)。
在小端序中,数据的低字节保存在内存的低地址处,而高字节保存在高地址处。
2、交叉编译链的选择
在第一步中我们查看到QNX的系统版本为7.0.X,因此我们采用的交叉编译链版本也要为qnx7系列。我这里选择的是qnx700的交叉编译。具体下载qnx700可以在网上着着,也可参考下面这个博主的文章QNX7开发指南,从而获取qnx交叉编译链。
3、Cmake的编写
cmake_minimum_required(VERSION 3.0)
project(xxx)
#设置编译参数
set(CMAKE_C_FLAGS "-Vgcc_ntoaarch64le")
set(CMAKE_CXX_FLAGS "-Vgcc_ntoaarch64le")
# 设置 CMake 的系统信息
set(CMAKE_SYSTEM_NAME QNX)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 指定头文件路径
include_directories(
xxx/include/
)
set(SRC_LIST
xxx/xxx.cpp
)
# 链接库文件路径
link_directories(
)
# 添加可执行文件目标
add_library(${PROJECT_NAME} SHARED ${SRC_LIST})
# 要链接的库
target_link_libraries(${PROJECT_NAME} PRIVATE
)
注意在填写编译参数时候,要根据第一步的获得的系统架构来设置,我的系统架构为aarch64le,在使用qcc命令查看一下qnx700支持的系统架构。
qcc -V
cc: targets available in /home/json/tools/qnx/qnx700/host/linux/x86_64/etc/qcc:
5.4.0,gcc_ntox86_gpp
5.4.0,gcc_ntoarmv7le_gpp
5.4.0,gcc_ntox86_cxx
5.4.0,gcc_ntox86_64_cxx
5.4.0,gcc_ntox86_64
5.4.0,gcc_ntoarmv7le
5.4.0,gcc_ntox86 (default)
5.4.0,gcc_ntoaarch64le_cxx
5.4.0,gcc_ntox86_64_gpp
5.4.0,gcc_ntoarmv7le_cxx
5.4.0,gcc_ntoaarch64le
5.4.0,gcc_ntoaarch64le_gpp
可以看到里面有个gcc_ntoaarch64le
所以我们设置编译参数为:
set(CMAKE_C_FLAGS "-Vgcc_ntoaarch64le")
set(CMAKE_CXX_FLAGS "-Vgcc_ntoaarch64le")
4、编译cmake
可以看到上诉我们的cmake写的很简单,有些编译参数是要在执行cmake时候设置的,比如编译的工具。
在linux中我们可以使用gcc编译,arm中我们可以使用arm-gcc编译,而在qnx中我们要使用qcc编译。
进入到我们的qnx700目录。
这样我们就找到了qcc的绝对路径。
/home/json/tools/qnx/qnx700/host/linux/x86_64/usr/bin/qcc
下面我们就可以编译cmake了
cmake -DCMAKE_C_COMPILER=/home/json/tools/qnx/qnx700/host/linux/x86_64/usr/bin/qcc -DCMAKE_CXX_COMPILER=/home/json/tools/qnx/qnx700/host/linux/x86_64/usr/bin/qcc ..
执行会看到如下效果:
-- The C compiler identification is QCC 5.4.0
-- The CXX compiler identification is QCC 5.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /home/json/tools/qnx/qnx700/host/linux/x86_64/usr/bin/qcc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /home/json/tools/qnx/qnx700/host/linux/x86_64/usr/bin/qcc - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
注意:Check for working C compiler:这一项目如果提示是qcc则设置成功,如果是cc或者gcc则说明设置失败。
有人可能会问了,为什么不在CmkaeLists.txt里面设置CMAKE_C_COMPILER和CMAKE_CXX_COMPILER,我也尝试过,在CmkaeLists.txt里面设置不起作用,cmake时候依然提示cc编译。
5、小记
我们在qcc所在目录可以看到:
切记,cmake里面的编译器设置千万不可以直接指定里面的gcc/g++工具,会出现很多头文件找不到,库链不到的错误。使用qcc编译,通过设置编译参数来选择性编译。
6、结语
此文看似简单,期间踩了太多的坑了。。。。。泪目
如有疑问可联系QQ:918619587
本文禁止转载