linux_x86_64 虚拟机交叉编译aarch64平台qt源码

📅 2026/7/23 22:55:48 👁️ 阅读次数 📝 编程学习
linux_x86_64 虚拟机交叉编译aarch64平台qt源码

之前尝试过在linux_x86_64上用交叉编译工具链编译arm架构的qt源码, 最后虽然能成功编译, 但是在qtcreator里面调用工具链后会编译错误, 实在无法解决, 最后放弃。
这里只能劝大家,没事不要交叉编译这种qt量级的源码,整个过程相当痛苦,还是直接在原生的ARM架构下编译源码,不容易出错。
这里把遇到的亿点问题放到下面,内容有点乱,仅供参考。

交叉编译操作步骤

  1. Linaro交叉编译工具链下载
    gcc-linaro-4.9.4-2017.01-rc1-x86_64_aarch64-linux-gnu.tar
    是一个 Linaro 提供的基于gcc4.9.4版本的, 交叉编译工具链(cross-toolchain),用于在 x86_64 主机(如你的 PC)上编译 AArch64(ARM64)架构 的 Linux 目标代码。

  2. qt源码

  3. 解压,并测试工具是否能用
    tar -xf gcc-linaro-4.9.4-2017.01-rc1-x86_64_aarch64-linux-gnu.tar -C /opt
    设置临时环境变量
    export PATH=/...../gcc-linaro-4.9.4-2017.01-rc1-x86_64_aarch64-linux-gnu/bin:$PATH
    也即
    export PATH=/home/root19/ComplieChain/gcc-linaro-4.9.4-2017.01-rc1-x86_64_aarch64-linux-gnu/bin:$PATH
    编译example
    aarch64-linux-gnu-gcc hello.c -o hello_arm64

  4. 添加脚本
    1.替换qmake.conf: /home/root19/ComplieChain/qt-everywhere-src-5.14.2/qtbase/mkspecs/linux-arrch64-linaro-g++
    2.qt源码目录添加 configure.sh脚本,如果需要编译qml,opengl,webengine等模块,需要在文件中./configure部分,删掉-no-opengl类似这种的,如果不需要就加上
    3.qt源码上一级目录 添加gcc541Compile.sh脚本,修改QT_SOURCE_DIR_NAME为该文件夹下的qt源码文件夹名字
    4.修改三个脚本中的TOOLCHAIN_PATH变量为交叉编译工具链的下的bin目录

  5. 在qt源码上一级目录,即gcc541Compile.sh所在目录,运行该脚本

  6. 正常会编译一部分,然后提示出错std::numeric_limits,需要改源码,具体根据出错信息,查找出错文件的位置,我的是
    /home/root19/Qt/qt-everywhere-src-5.12.8/qtbase/include/QtCore/../../src/corelib/global/qendian.h ,直接粘贴到文件管理器,跳转到该文件,在#include部分添加 #include <limits>,有时候不只一个文件有问题,需要重新编译一下再看,再改


交叉编译问题

    • [ ]
  • [ ]
In file included from /home/root19/ComplieChain/qt-everywhere-src-5.14.2/qtbase/src/corelib/text/qbytearray.cpp:42:/home/root19/ComplieChain/qt-everywhere-src-5.14.2/qtbase/src/corelib/text/qbytearraymatcher.h: In static member function ‘static QStaticByteArrayMatcherBase::Skiptable QStaticByteArrayMatcherBase::generate(const char*, uint)’:/home/root19/ComplieChain/qt-everywhere-src-5.14.2/qtbase/src/corelib/text/qbytearraymatcher.h:103:38: error: ‘numeric_limits’ is not a member of ‘std’  103 |         const auto uchar_max = (std::numeric_limits<uchar>::max)(); 

在/home/root19/ComplieChain/qt-everywhere-src-5.14.2/qtbase/src/corelib/text qbytearray.h 添加 #include


QT项目编译问题

这里我用过一个开源报表库, 它需要手动编译, 所以发生了一些问题

1. kdreports库问题
2. qt库问题
  • [paths] 
    Prefix = ..
    
    ② 删掉qt.conf 目录需要和之前编译qt时候的一样
    ③ 重新清除编译qt