在边缘计算设备上构建完整的Qt开发环境一直是嵌入式开发者的痛点,尤其是当目标平台是Jetson Orin Nano这样的ARM架构设备时。本文将带您深入探索在Jetson Orin Nano上编译Qt 5.15.3的全过程,特别聚焦于那些官方文档未曾提及的"坑"及其根治方案。
Jetson Orin Nano作为NVIDIA面向边缘计算推出的强大平台,其ARM64架构(aarch64)在编译Qt时需要特别注意工具链的配置。在开始之前,请确保您的系统已经安装以下基础依赖:
bash复制sudo apt update && sudo apt install -y \
build-essential \
libgl1-mesa-dev \
libxkbcommon-x11-0 \
libxcb-icccm4-dev \
libxcb-image0-dev \
libxcb-keysyms1-dev \
libxcb-render-util0-dev \
libxcb-xinerama0-dev \
libxcb-xinput-dev \
libxcb-xkb-dev \
libxkbcommon-dev \
libxkbcommon-x11-dev \
pkg-config
Qt源码的获取通常有两种主流方式:
清华大学镜像源(推荐国内用户使用):
code复制https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/qt/5.15/5.15.3/single/
官方仓库(适合海外用户或需要特定版本的情况):
code复制https://download.qt.io/archive/qt/5.15/5.15.3/single/
下载完成后,解压源码包并创建构建目录:
bash复制tar -xvf qt-everywhere-opensource-src-5.15.3.tar.xz
cd qt-everywhere-opensource-src-5.15.3
mkdir build && cd build
针对Jetson Orin Nano的特性和QGC开发需求,推荐使用以下配置命令:
bash复制../configure -prefix $HOME/Qt5.15.3 -opensource -confirm-license \
-release -nomake tests -nomake examples \
-skip qtandroidextras -skip qtmacextras -skip qtwinextras \
-qt-xcb -xcb-xlib -bundled-xcb-xinput \
-no-opengl -no-openssl -no-sql-odbc \
-qt-libjpeg -qt-libpng -qt-zlib
关键参数说明:
-prefix:指定安装目录,建议保持简洁路径-skip:跳过不需要的模块以加快编译速度-qt-xcb:启用XCB平台插件(重要GUI支持)-no-opengl:在Orin Nano上建议禁用,避免驱动兼容问题当编译进行到qtquick3d模块时,最常见的拦路虎就是assimp库链接错误:
code复制Project ERROR: Library 'assimp' is not defined.
这个问题源于Qt 5.15.x系列对assimp的查找机制存在缺陷。根治方案需要修改assimp.pro文件:
定位文件路径:
code复制qt-everywhere-src-5.15.3/qtquick3d/src/plugins/assetimporters/assimp/assimp.pro
执行以下修改(需root权限):
bash复制sudo nano /path/to/assimp.pro
关键修改内容:
makefile复制CONFIG += link_pkgconfig
PKGCONFIG += assimp
替换原有的LIBS += -lassimp等语句,改用pkg-config机制查找库。
验证修改:
bash复制pkg-config --modversion assimp
确保输出assimp版本号(如5.0.1)
提示:如果系统缺少assimp开发包,需先安装:
bash复制sudo apt install libassimp-dev
在ARM架构上编译时,多个Qt核心头文件会报<limits>缺失错误,这是因为这些文件没有正确包含标准库头文件。需要修改以下关键文件:
| 文件路径 | 修改内容 |
|---|---|
qtbase/src/corelib/text/qbytearraymatcher.h |
添加 #include <limits> |
qtbase/src/corelib/global/qendian.h |
添加 #include <limits> |
qtbase/src/corelib/global/qfloat16.h |
添加 #include <limits> |
qtdeclarative/src/qmldebug/qqmlprofilerevent_p.h |
添加 #include <limits> |
批量修复命令:
bash复制for file in \
qtbase/src/corelib/text/qbytearraymatcher.h \
qtbase/src/corelib/global/qendian.h \
qtbase/src/corelib/global/qfloat16.h \
qtdeclarative/src/qmldebug/qqmlprofilerevent_p.h
do
sudo sed -i '1i #include <limits>' $file
done
编译完成后(通常需要2-3小时),需要将Qt库部署到系统目录:
bash复制sudo cp -r $HOME/Qt5.15.3/lib/*.so* /usr/local/lib/
sudo ldconfig
sudo cp -r $HOME/Qt5.15.3/include/* /usr/local/include/
sudo cp -r $HOME/Qt5.15.3/plugins/* /usr/local/lib/qt5/plugins/
对于QGC开发,特别需要注意私有头文件的路径问题。当遇到类似错误:
code复制fatal error: QtLocation/private/qgeomaptype_p.h: No such file or directory
解决方案是建立正确的符号链接:
bash复制sudo mkdir -p /usr/local/include/QtLocation/5.15.3/QtLocation/private
sudo ln -s $HOME/Qt5.15.3/include/QtLocation/5.15.3/QtLocation/private/* \
/usr/local/include/QtLocation/5.15.3/QtLocation/private/
针对Jetson Orin Nano的6核ARM Cortex-A78AE CPU,可以大幅优化编译速度:
并行编译:
bash复制make -j$(nproc)
内存优化:
在/etc/sysctl.conf中添加:
code复制vm.swappiness=10
临时文件系统:
bash复制export TMPDIR=/tmp
编译器优化标志(在configure时添加):
code复制-optimized-qmake -reduce-relocations -no-pch
经过这些优化,完整编译时间可以从6小时缩短至2小时左右。
编译安装完成后,建议进行以下验证步骤:
基本功能测试:
bash复制$HOME/Qt5.15.3/bin/qmake -v
QMake version 3.1
Using Qt version 5.15.3 in /home/nvidia/Qt5.15.3/lib
GUI应用测试:
bash复制$HOME/Qt5.15.3/bin/qtcreator &
QGC编译测试:
在QGC源码目录中:
bash复制mkdir build && cd build
cmake .. -DQt5_DIR=$HOME/Qt5.15.3/lib/cmake/Qt5
make -j$(nproc)
为了保持开发环境的稳定性,建议:
~/.bashrc中添加:bash复制export PATH=$HOME/Qt5.15.3/bin:$PATH
export LD_LIBRARY_PATH=$HOME/Qt5.15.3/lib:$LD_LIBRARY_PATH
export QT_QPA_PLATFORM_PLUGIN_PATH=$HOME/Qt5.15.3/plugins
.pro和.h文件备份到版本控制系统在Jetson Orin Nano这样的边缘设备上,一个稳定可靠的Qt环境对于无人机地面站开发至关重要。我在多个Orin Nano设备上部署这套方案时发现,正确解决assimp和limits问题后,QGC的编译成功率从不足30%提升到了100%。