在 Ubuntu x86_64 上交叉编译支持 OpenGL/WebEngine 的 QT6 库(Linux aarch64 平台)
1. 为什么需要交叉编译QT6在嵌入式开发领域ARM架构的设备越来越普及从树莓派到各种工业控制设备很多都采用了aarch64架构。但开发者常用的开发环境往往是x86_64架构的Ubuntu系统这就带来了一个难题如何高效地为ARM设备开发QT应用我去年接手过一个车载中控项目目标平台是瑞芯微RK3588芯片系统是定制化的ARM64 Linux。最初尝试直接在设备上编译QT6结果发现这个四核Cortex-A76的开发板编译一个完整QT6库需要近8小时期间还经常因为内存不足崩溃。后来改用交叉编译同样的工作在我的i7笔记本上只需要45分钟效率提升立竿见影。交叉编译最大的优势在于开发效率x86_64主机通常有更强的CPU和更大内存环境统一避免每台设备都要配置开发环境调试便利可以在宿主机上使用更完善的工具链2. 搭建交叉编译环境2.1 系统准备我推荐使用Ubuntu 22.04 LTS作为基础系统这个版本对QT6的支持最完善。实测在20.04上会遇到一些依赖库版本问题而更新的版本又可能引入兼容性问题。首先更新系统sudo apt update sudo apt upgrade -y2.2 安装交叉编译工具链对于aarch64目标平台我们需要安装对应的工具链sudo apt install gcc-aarch64-linux-gnu g-aarch64-linux-gnu \ binutils-aarch64-linux-gnu build-essential crossbuild-essential-arm64验证安装是否成功aarch64-linux-gnu-gcc --version应该能看到类似这样的输出aarch64-linux-gnu-gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.02.3 安装QT6依赖库QT6的依赖比QT5更加模块化我们需要根据实际需求安装# 基础图形库依赖 sudo apt install libxcb-xinerama0-dev libxkbcommon-dev libxkbcommon-x11-dev \ libx11-xcb-dev libxrender-dev libxi-dev # OpenGL相关 sudo apt install libgl1-mesa-dev libglu1-mesa-dev libegl1-mesa-dev \ libgles2-mesa-dev freeglut3-dev # WebEngine特殊依赖 sudo apt install libssl-dev libxcursor-dev libxcomposite-dev libxdamage-dev \ libxrandr-dev libdbus-1-dev libfontconfig1-dev libcap-dev libxtst-dev \ libpulse-dev libudev-dev libpci-dev libnss3-dev libasound2-dev libxss-dev \ libevent-dev libvpx-dev libsnappy-dev libjsoncpp-dev libwebp-dev \ libopus-dev libminizip-dev libxslt1-dev3. 获取和配置QT6源码3.1 下载QT6源码QT官方提供了在线安装器和源码包两种方式。对于交叉编译我推荐使用源码包wget https://download.qt.io/official_releases/qt/6.5/6.5.2/single/qt-everywhere-src-6.5.2.tar.xz tar xvf qt-everywhere-src-6.5.2.tar.xz cd qt-everywhere-src-6.5.23.2 配置交叉编译参数创建编译配置脚本configure.sh#!/bin/bash ./configure \ -prefix /opt/qt6-arm64 \ -opensource \ -confirm-license \ -release \ -shared \ -xplatform linux-aarch64-gnu-g \ -nomake examples \ -nomake tests \ -pkg-config \ -sysroot / \ -opengl es2 \ -qt-libjpeg \ -qt-libpng \ -qt-zlib \ -qt-freetype \ -qt-harfbuzz \ -qt-pcre \ -skip qt3d \ -skip qtactiveqt \ -skip qtcharts \ -skip qtdatavis3d \ -skip qtgamepad \ -skip qtlocation \ -skip qtlottie \ -skip qtmacextras \ -skip qtnetworkauth \ -skip qtpurchasing \ -skip qtquick3d \ -skip qtquicktimeline \ -skip qtscript \ -skip qtscxml \ -skip qtsensors \ -skip qtspeech \ -skip qtvirtualkeyboard \ -skip qtwayland \ -skip qtwebchannel \ -skip qtwebglplugin \ -skip qtx11extras \ -skip qtxmlpatterns关键参数说明-xplatform linux-aarch64-gnu-g指定交叉编译目标平台-opengl es2使用OpenGL ES 2.0这是大多数ARM设备的支持标准-skip参数用于跳过不需要的模块可以显著减少编译时间3.3 配置平台描述文件需要修改QT的平台描述文件cd qtbase/mkspecs/linux-aarch64-gnu-g nano qmake.conf修改内容如下MAKEFILE_GENERATOR UNIX CONFIG incremental QMAKE_INCREMENTAL_STYLE sublib include(../common/linux.conf) include(../common/gcc-base-unix.conf) include(../common/g-unix.conf) # modifications to g.conf QMAKE_CC aarch64-linux-gnu-gcc QMAKE_CXX aarch64-linux-gnu-g QMAKE_LINK aarch64-linux-gnu-g QMAKE_LINK_SHLIB aarch64-linux-gnu-g # modifications to linux.conf QMAKE_AR aarch64-linux-gnu-ar cqs QMAKE_OBJCOPY aarch64-linux-gnu-objcopy QMAKE_NM aarch64-linux-gnu-nm -P QMAKE_STRIP aarch64-linux-gnu-strip load(qt_config)4. 处理OpenGL和WebEngine的特殊依赖4.1 OpenGL ES配置ARM平台通常使用Mali或Adreno GPU需要特别配置OpenGL ESsudo mkdir -p /usr/local/aarch64-linux-gnu/include/GLES2 sudo cp /usr/include/GLES2/* /usr/local/aarch64-linux-gnu/include/GLES2/在配置脚本中添加QMAKE_INCDIR_OPENGL_ES2 /usr/local/aarch64-linux-gnu/include/GLES2 QMAKE_LIBDIR_OPENGL_ES2 /usr/lib/aarch64-linux-gnu QMAKE_LIBS_OPENGL_ES2 -lGLESv24.2 WebEngine编译技巧QT WebEngine基于Chromium编译过程最为复杂。需要额外准备# 安装GN和Ninja构建工具 sudo apt install ninja-build wget https://storage.googleapis.com/gn-artifacts/gn-linux-x64.zip unzip gn-linux-x64.zip sudo mv gn /usr/local/bin/ # 设置WebEngine专用环境变量 export PKG_CONFIG_PATH/usr/lib/aarch64-linux-gnu/pkgconfig export PKG_CONFIG_LIBDIR/usr/lib/aarch64-linux-gnu在配置脚本中添加WebEngine支持-webengine-opengl \ -webengine-embedded-build \ -webengine-pepper-plugins \ -webengine-printing-and-pdf \ -webengine-proprietary-codecs \ -webengine-spellchecker \ -webengine-webchannel \ -webengine-webrtc5. 编译和安装5.1 执行编译先运行配置脚本chmod x configure.sh ./configure.sh然后开始编译make -j$(nproc)这个过程可能需要2-4小时取决于你的CPU性能。我建议在晚上开始编译第二天早上就能看到结果。5.2 安装到目标目录编译完成后安装sudo make install这会将编译好的QT6库安装到/opt/qt6-arm64目录。你可以将这个目录打包复制到目标设备上使用。6. 常见问题解决6.1 链接器错误如果遇到类似cannot find -lGLESv2的错误需要检查是否正确安装了libgles2-mesa-dev包是否正确设置了QMAKE_LIBDIR_OPENGL_ES2路径6.2 WebEngine编译失败WebEngine编译失败通常是因为内存不足建议至少16GB内存网络问题Chromium需要下载大量依赖工具链不完整确保安装了所有WebEngine依赖6.3 运行时错误在目标设备上运行时如果出现GLIBC版本不匹配说明宿主机的工具链版本太高。解决方法使用老版本的Ubuntu如18.04作为编译环境在目标设备上更新glibc7. 验证编译结果在目标设备上创建一个简单的测试程序// main.cpp #include QApplication #include QLabel int main(int argc, char *argv[]) { QApplication app(argc, argv); QLabel label(QT6交叉编译成功); label.show(); return app.exec(); }编译测试程序/opt/qt6-arm64/bin/qmake -project /opt/qt6-arm64/bin/qmake make运行程序应该能看到一个显示QT6交叉编译成功的窗口。