一个交叉编译环境搞3、4天还弄不好,一路过来全是坑,仅此以记录。
- 查看目标机条件
在目标机查看CPU架构,本次加固计算机CPU型号为FT2000/4, 架构aarch64
命令行输入 ldd --version,查看GLIBC版本,就是对应C和C++的标准(在交叉编译qt时需要保证工具链一致)
命令行输入gcc --version, gcc最高使用5.4.0版本,更高可能不兼容,低版本可以
- 虚拟机环境搭建
VM虚拟机加载Ubuntu系统(Ubuntu开发工具最全),安装了qt-opensource-linux-x64-5.12.10.run,MVS客户端,开发环境配置不是本次重点,不详细介绍了
- 下载交叉编译器
宿主机(虚拟机)是x86_64,目标机是aarch64
所以下载gcc-linaro-5.3.1-2016.05-x86_64_aarch64-linux-gnu.tar.xz,具体版本可用自己找。
解压缩,(一开始用的10.3版本,目标机不兼容)使用命令行sudo cp gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz /opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz,
xz -dk gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz
tar -xvf gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar
解压之后需要在/etc/profile文件末尾插入一行,sudo vi /etc/profile,然后按i插入
export PATH=/opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin:$PATH
插入之后按esc,输入:wq。
如果编辑profile键盘不好用,需要卸载vi-common,再重装vi。
修改之后source /etc/profile
命令行aarch64-none-linux-gnu-g++ --version查看是否成功
(可以尝试类似apt install gcc-arm-linux-gnueabi,看是否更简单)
查看GLIBC_版本是否与目标机一致,不一致会出现兼容问题。GLIBC向下兼容,比目标机版本号大不兼容。后面我又换成gcc5.3.1 和 qt5.7.0,使用的版本自行对应。
- 交叉编译QT
1、下载qt源码,qt-everywhere-src-5.12.10.tar.xz,然后解压缩
sudo xz -dk qt-everywhere-src-5.12.10.tar.xz
sudo tar -xvf qt-everywhere-src-5.12.10.tar
进入文件夹qt-everywhere-src-5.12.10内
修改qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf 编译器为交叉编译器,主要是14~23行
2、安装所依赖的库
1)、安装基础编译环境
sudo apt-get install libxcb-xinerama0-dev
sudo apt-get install build-essential perl python git
sudo apt-get install freeglut3-dev
sudo apt-get install libglew-dev libsdl2-dev libsdl2-image-dev libglm-dev libfreetype6-dev
2)、安装编译Libxcb的相关依赖
sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev
3)、安装编译Qt WebKit的相关依赖
sudo apt-get install flex bison gperf libicu-dev libxslt-dev ruby
4)、安装编译Qt WebEngine的相关依赖
sudo apt-get 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 libegl1-mesa-dev gperf bison
5)、安装编译Qt Multimedia的相关依赖
sudo apt-get install libasound2-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev
若是报错则安装最新版本
sudo apt -y install libasound2-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
6)、安装编译QDoc的相关依赖
sudo apt install libclang-6.0-dev llvm-6.0
7)、安装clang-8
sudo apt-get install clang
sudo apt-get install clang-8
8)、进入文件夹qt-everywhere-src-5.12.10内,执行命令行,
./configure -release -opensource -confirm-license -xplatform linux-aarch64-gnu-g++ -prefix /usr/local/Qt-5.14.2-aarch64 -c++std c++11 -nomake examples -make libs -skip qtpurchasing -skip qtvirtualkeyboard -skip qtwayland -skip qtwebchannel -skip qtwebsockets -skip qtdatavis3d -skip qtgamepad -skip qtlocation -skip qtremoteobjects -skip qtscript -skip qtscxml -skip qtsensors -skip qtspeech -skip qtsvg -skip qtwebengine -skip qtwebview -skip qtwinextras -skip qtx11extras -skip qtxmlpatterns -opengl -silent -qpa linuxfb
./configure -release -opensource -confirm-license -xplatform linux-aarch64-gnu-g++ -prefix /usr/local/Qt-5.14.2-aarch64 -c++std c++11 -nomake examples -no-opengl -silent
./configure -release -opensource -confirm-license -xplatform linux-arm-gnueabi-g++ -prefix /usr/local/Qt-5.7.0-aarch64 -c++std c++11 -nomake examples -no-opengl -silent -make libs -pkg-config -xkbcommon -qpa xcb
./configure -release -opensource -confirm-license -xplatform linux-aarch64-gnu-g++ -prefix /usr/local/Qt-5.12.10-aarch64 -c++std c++11 -nomake examples -no-opengl -silent -make libs -qpa xcb
./configure -release -opensource -confirm-license -prefix /usr/local/Qt-5.12.12 -c++std c++11 -nomake examples -no-opengl -nomake tests -skip qtwebengine -silent -qpa xcb
参数选项可以根据需求自己配置,configure打印结果中用到的qt模块要检查一遍,缺东西的话重新configure,多configure几次什么也不影响。
9)、交叉编译
执行sudo make -j 8
-j 8是多核并行执行的核数,根据自己配置的虚拟机来定
10)、安装
如果make没报错的话,执行命令:
sudo make install
可以到文件夹/usr/local/Qt-5.14.2-aarch64查看
- 交叉编译程序
QT现在高级了,可以添加交叉编译器,在菜单工具->选项 中配置套件
编译器已自动检测到GCC(/opt/gcc-arm那个),没检测到重启系统试一下,实在不行可以手动添加
手动设置交叉编译的QT库
然后手动添加套件
叹号也没关系,因为缺少调试器
给项目工程添加生成配置,构建了一个aarch64-GCC的release版本
执行qmake,构建项目
不幸的是,交叉编译的时候忘了选qtchart模块了,编译报错提示缺少这个so,没关系可以追加。
Index of /archive/qt/5.14/5.14.2/submodules
去官网下载模块的源码qtcharts-everywhere-src-5.14.2.tar.xz
然后拷贝到/home/ycz下解压,这次交叉编译简单,直接用qt打开qtcharts-everywhere-src-5.14.2中的qtcharts.pro工程,使用aarch64-GCC套件进行编译。
编译成功后,进入build-qtcharts-aarch64_GCC-Release目录,命令行执行
sudo make install
文件夹/usr/local/Qt-5.14.2-aarch64查看已经有了qtchart部分,再重新编译自己的工程ok。
- 移植
把交叉编译后的Qt-5.14.2-aarch64 和 程序,拷贝到目标机,
修改/etc/profile增加QT库的路径,详见脚本env.sh;再执行source /etc/profile
再执行install.sh或启动程序
- (跳过此步)移植XCB
由于银河麒麟V10的窗口系统使用的是Xserver + Xwayland方式,wayland端需要xcb库的支持才能正常显示,在交叉编译QT前需要添加对XCB的支持。
https://www.x.org/releases/individual/xcb/
下载xcb-proto.1.11.tar.gz
解压后,./configure --prefix=/opt/gcc-linaro-5.3.1-2016.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu --host=aarch64-linux-gnu --enable-option-checking
Make
Make install
还需要sudo apt-get install xsltproc
交叉编译X11
- linuxdeployqt打包
照着 银河麒麟桌面操作系统V10 Qt应用开发者打包指南.pdf 在目标机上装上linuxdeployqt和appimage,注意不能用最新版本,会报缺少qtquick和qtwebengine,下载了2021和2020年的版本可以用,版本大概是linuxdeployqt 6
在新建的文件夹里拷过来执行程序,新建一个desktop文件,找个图标。就可以打包了
Linuxdeployqt *.desktop -appimage
可能会缺些库,把用到的qt交叉编译的库拷进来。
再使用install.sh的脚本,就可以实现安装运行了。