在优快云上查阅了大部分qnx7.0平台编译qt源码的博客,都没有详细给出具体过程和报错处理方式,导致博主在编译时遇到诸多问题,耗时两周才成功编译qnx下aarch64架构版本的qt库,尝试过诸多版本的qt编译之后,发现都会编译过程中报错,譬如qt15.6和qt15.2.3,最终在qt5.9.7上成功编译,下面将仔细讲解编译过程。
环境为ubuntu 16.04 + qnx7.0交叉编译环境
第一步 准备qnx7.0交叉编译环境
将qnx编译环境拷贝到linux下,保证能够通过qnx脚本设置环境变量,如下图。
第二步 下载qt源码
目前下载编译版本为5.9.7,尝试过其他版本但是会编译失败。
下载地址为Index of /archive/qt/5.9/5.9.7/single
下载完成之后,将源码包拷贝到linux环境下,解压
解压完成之后进入目录,新建文件夹build
进入 build目录,准备编译
第三步 开始配置编译环境
编译出的目标架构为qnx7.0平台 aarch64架构,所以配置的时候需要选择aarch64,配置命令如下:
../configure -prefix /home/heyi/workplace/qt_qnx/install -xplatform qnx-aarch64le-qcc -nomake examples -nomake tests -no-compile-examples -release -confirm-license -opensource
配置解释:
-prefix /home/heyi/workplace/qt_qnx/install 表示要安装的目录,可以自定义
-xplatform qnx-aarch64le-qcc 编译平台,选择qnx64位
Nomake表示不编译指定模块,此处不编译qt自带的测试模块和例子,减少编译时间。
在执行配置命令之前需要先切换到root账户,执行命令
sudo -i
然后再次进入build目录,设置qnx环境变量,执行qnx交叉编译器的脚本。
source /opt/qnx700/qnxsdp-env.sh
然后执行configure
../configure -prefix /home/heyi/workplace/qt_qnx/install -xplatform qnx-aarch64le-qcc -nomake examples -nomake tests -no-compile-examples -release -confirm-license -opensource
会报如下错误:
提示未设置编译器,所以需要更改对应平台配置文件。
/home/heyi/workplace/qt_qnx/5.9.7/qt-everywhere-opensource-src-5.9.7/qtbase/mkspecs/common
在common目录下找到qcc-base-qnx-aarch64le.conf,然后编辑
如图所示,对应的CC编译器和C++编译器都没有指定,所以需要指定为配置好的qnx交叉编译器,配置好后如下图:
保存之后,然后再次执行配置指令(先删除build目录下之前配置失败产生的文件)
出现下图报错
提示找不到-lang-c++,这是一个格式相关的配置,打开对应配置文件删除-lang-c++
打开文件
然后和上一步一样,重新执行配置指令
提示找不到默认编译器,所以还需要设置默认编译器
QMAKE_COMPILER = /opt/qnx700/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.0.0-gcc
再次执行配置指令
配置成功
直接执行 make -j8 8:代表同时开启8多个线程编译,可根据自身电脑配置自定义
编译提示未识别改指令,应该就是删除-lang-c++造成的不识别宽字符问题。
打开文件删除-Wc即刻,如下图
删除之后,重新配置指令
重新编译
编译过程中可能会报错提示找不到sys/Keycodes.h,此原因是qnx7.0编译环境不全,导致有一些头文件找不到,所以需要在其他qnx7.0环境下找到此头文件并拷贝到真正编译的qnx环境下,由于我有两个qnx编译环境,所以找到了此头文件。
/home/heyi/workplace/sdp_qnx700/target/qnx7/usr/include/sys/Keycodes.h复制到/home/heyi/workplace/qnx700/target/qnx7/usr/include/sys,将下图所有的key相关的头文件全部拷贝过去。
然后再次执行编译,未提示报错,编译完成
执行make install
执行完毕,再查看一下编译出来的库是否是对应平台。
架构正确,编译全部完成。