之前尝试过在linux_x86_64上用交叉编译工具链编译arm架构的qt源码, 最后虽然能成功编译, 但是在qtcreator里面调用工具链后会编译错误, 实在无法解决, 最后放弃。
这里只能劝大家,没事不要交叉编译这种qt量级的源码,整个过程相当痛苦,还是直接在原生的ARM架构下编译源码,不容易出错。
这里把遇到的亿点问题放到下面,内容有点乱,仅供参考。
交叉编译操作步骤
-
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 目标代码。 -
qt源码
-
解压,并测试工具是否能用
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 -
添加脚本
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目录 -
在qt源码上一级目录,即gcc541Compile.sh所在目录,运行该脚本
-
正常会编译一部分,然后提示出错
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库问题
-
② 删掉qt.conf 目录需要和之前编译qt时候的一样[paths] Prefix = ..
③ 重新清除编译qt-
