Qt6.5.3在Ubuntu20.04下已经安装运行,创建工程运行OK;需要将工程移植到aarch64平台,记录搭建交叉编译环境和配置流程。
1. 安装交叉编译工具链和cmake等依赖
vim README.md, 查看依赖项

sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
sudo apt-get install ninja-build cmake
ubuntu20.04已经安装了python3,但是没有python命令,建立软连接:
sudo ln -s /usr/bin/python3 /usr/bin/python
查询编译器版本
aarch64-linux-gnu-g++ -v
Using built-in specs.
COLLECT_GCC=aarch64-linux-gnu-g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/aarch64-linux-gnu/9/lto-wrapper
Target: aarch64-linux-gnu
注意安装的aarch64-linux-gnu-gcc的库路径在/usr/aarch64-linux-gnu
2. 下载Qt6.5.3源码 qt-everywhere-src-6.5.3.tar.xz
Index of /official_releases/qt/6.5/6.5.3/single
3. tar -xvf解压源码后,已经存在qtbase/mkspecs/devices/linux-aarch64-gnu-g++配置,在源目录下建立toolchain文件:
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++)
set(TOOL_CHAIN_INCLUDE /usr/aarch64-linux-gnu/include)
set(TOOL_CHAIN_LIB /usr/aarch64-linux-gnu/lib)
set(CMAKE_FIND_ROOT_PATH /usr/aarch64-linux-gnu)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(ENV{CMAKE_INCLUDE_PATH} ${TOOL_CHAIN_INCLUDE})
set(ENV{CMAKE_LIBRARY_PATH} ${TOOL_CHAIN_LIB})
执行配置命令:
./configure -qt-host-path /opt/Qt/6.5.3/gcc_64 -prefix /opt/qt6-arm64 -release -opensource -confirm-license -platform linux-aarch64-gnu-g++ -device linux-aarch64-gnu-g++ -no-pch -no-opengl -no-openssl -qt-sqlite -qt-zlib -qt-libjpeg -qt-libpng -qt-freetype -qt-pcre -qt-harfbuzz -skip qtvirtualkeyboard,qtdoc,qml,qt3d,qtcharts -submodules qtserialport -- -DCMAKE_TOOLCHAIN_FILE=toolchain
其中-prefix为保存Qt库的路径,-xplatform为目标平台;关键点QT6.5的交叉编译,需要指定一个同版本的本地已安装的QT6.5路径,-qt-host-path指向的路径需要到src层,即6.5.3/gcc_64。
-no-pch 是不使用预编译
-qt-sqlite -qt-zlib -qt-libjpeg -qt-libpng -qt-freetype -qt-pcre -qt-harfbuzz -qt 是指使用qt内置的三方库, -system是指使用系统提供的库,比如-system-zlib-- -DCMAKE_TOOLCHAIN_FILE=toolchain 指定cmake 参数 CMAKE_TOOLCHAIN_FILE,这里使用configure进行配置,所有的cmake参数 都需要使用 -- 来进行传入 ;
-skip QT6.5 支持多个使用逗号分隔,例如 -skip qtimageformats,qtsvg
-submodules QT6.5编译项,使用该参数则仅编译该参数指明的模块及其依赖的模块,而不是全部模块。如果需要多个模块则使用逗号分隔, 例如 -submodules qtsvg,qtserialport
配置过程如果出错,根据提示安装需要的库;多次尝试后删除源码,重新解压后配置OK。
4. 执行编译,文件比较多,编译时间较长
cmake --build . --parallel
[85/10419] Compiling syncqt
[1/1] Cleaning all built files...
Cleaning... 2 files.
[1/2] Building CXX object CMakeFiles/syncqt.dir/main.cpp.o[2/2] Linking CXX executable /home/user_xx/qt6/qt-everywhere-src-6.5.3/qtbase/libexec/syncqt
......
[3888/10419] Check QtPdf support
QtPdf will not be built: Build requires CMake 3.19 or higher.
[3889/10419] Check QtWebEngine support
QtWebEngine will not be built: Build requires CMake 3.19 or higher......
编译过程还出现
FAILED: qtbase/plugins/platforms/libqlinuxfb.so
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: cannot find -ludev
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: cannot find -lmtdev
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: cannot find -lts
根据之前文章拷贝libudev库到/usr/aarch64-linux-gnu/lib目录
https://blog.csdn.net/river0351/article/details/146151739?spm=1001.2014.3001.5502
然后手动编译libmtdev 和tslib库,然后拷贝编译的so文件到/usr/aarch64-linux-gnu/lib目录
wget https://bitmath.org/code/mtdev/mtdev-1.1.6.tar.gz
wget https://github.com/libts/tslib/releases/download/1.22/tslib-1.22.tar.gz
./configure --host=aarch64-linux-gnu --prefix=$PWD/build
make
make installmtdev需要修改config-aux/config.sub文件增加aarch64项(在avr32后)
如不想编译 Linux Framebuffer 插件,可以在配置时禁用:-no-linuxfb
5. 编译完成,安装
sudo cmake --install .
6. 创建环境变量
vim ~/.bashrc
添加
#add qt aarch64 env
export PATH=/opt/qt6-arm64/bin:$PATH
export LD_LIBRARY_PATH=/opt/qt6-arm64/lib:$LD_LIBRARY_PATH
export QT_PLUGIN_PATH=/opt/qt6-arm64/plugins:$QT_PLUGIN_PATH
export QML2_IMPORT_PATH=/opt/qt6-arm64/qml:$QML2_IMPORT_PATH
执行命令让环境变量生效 sudo -s source ~/.bashrc
7. 配置QtCreator kits
在QtCreator里添加Qt Versions和qmake,增加kits

创建一个nonQt工程,编译OK!

5010

被折叠的 条评论
为什么被折叠?



