环境:Ubuntu 18.04
交叉编译器:gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu
开发板类型:rk3399
1.安装交叉编译器
下载gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz
sudo tar jxvf gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz
2.设置环境变量
gedit ~/.bashrc
将gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu目录下bin的路径写在文件里
export PATH=$PATH:/用户目录/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin
3.测试交叉编译器是否可用
aarch64-linux-gnu-c++
linux-aarch64-gnu-g++
4.下载QT源码
在QT官网http://download.qt.io/ 下载相应的源码
并解压
sudo tar jxvf gqt-everywhere-src-5.12.2.tar.xz
5.将准备好的build_qt.sh脚本放到QT源码目录
#!/bin/sh
PREFIX=/用户目录/qt5.12.2_aarch64_linux/
SYSROOT=/用户目录/rk3399-build/sysroot
export PKG_CONFIG_SYSROOT_DIR=${SYSROOT}
export PKG_CONFIG_LIBDIR=${SYSROOT}/usr/lib/pkgconfig:${SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig:${SYSROOT}/lib/aarch64-linux-gnu/pkgconfig:${SYSROOT}/usr/share/pkgconfig
export PKG_CONFIG_PATH=${PKG_CONFIG_LIBDIR}
./configure -extprefix ${PREFIX} \
-xplatform linux-aarch64-gnu-g++ \
-sysroot ${SYSROOT} \
-opensource \
-release \
-shared \
-opengl es2 \
-directfb \
-confirm-license \
-pkg-config \
-qt-zlib \
-qt-libpng \
-qt-libjpeg \
-qt-xcb \
-qt-pcre \
-nomake examples \
-nomake tests \
-recheck-all
其中sysroot文件是之前在arm板上的头文件和库文件,这个后续补充
6.执行build_qt.sh脚本
./build_qt.sh
确认需要编译的库都是开启的,并将其中没有安装的安装
当时有三个未安装,gperf bison flex
sudo apt install gperf bison flex
安装之后删除一下
rm config.*
7.make
根据电脑性能来
make -j6
中途出现报错,发现是有的文件编译未完成,依赖项已经编译完成,导致找不到文件
make
make一下,将文件编译完成
继续
make -j6
中途遇到的问题:
①libpthread.so.0找不到,需要软连接
ln -s libpthread.so libpthread.so.0
②代码修改,编译过程中语法或编译器的问题,导致不能使用构造函数的方式,将代码修改一下:
for (const QRect &rect : region) {
DFBRegion dfbReg(rect.x() + offset.x(),rect.y() + offset.y(),rect.right() + offset.x(),rect.bottom() + offset.y());
m_dfbSurface->Flip(m_dfbSurface.data(), &dfbReg, DFBSurfaceFlipFlags(DSFLIP_BLIT|DSFLIP_ONSYNC));
}
for (const QRect &rect : region) {
DFBRegion dfbReg = {rect.x() + offset.x(),rect.y() + offset.y(),rect.right() + offset.x(),rect.bottom() + offset.y()};
m_dfbSurface->Flip(m_dfbSurface.data(), &dfbReg, DFBSurfaceFlipFlags(DSFLIP_BLIT|DSFLIP_ONSYNC));
}
③由于需要使用到arm板上的头文件和库,需要将sysroot中的文件放到本机的/usr/lib/ 和 /lib文件夹中
sudo cp aarch64-linux-gnu/ /lib/ -r
sudo cp aarch64-linux-gnu/ /usr/lib/ -r
④在编译中需要编译器需要使用本地的一些头文件或库的时候,会找到sysroot的文件中去,这个时候需要将/usr/lib/和/lib/中的aarch64-linux-gnu文件夹删除或改名,使编译器查找到本机的目录和文件
⑤编译过程中出错,安装相应的库等
sudo apt install libssl1.0-dev
sudo apt install libnss3-dev
8.make install
make install -j6
编译完成