以下为从头编译方法:
1.将rk开发板上/usr/include和/usr/lib,/lib/aarch64-linux-gnu目录拷贝到虚拟机某个目录下,来构建sysroot目录。为何需要拷贝/lib,原因是/usr/lib下用到的相关库链接到了该目录。
我构建的sysroot路径为/root/work/code/software/target,在该目录下放开发板的根目录文件,注意目录要一致。

2.下载qt-everywhere-src-5.12.0.tar.xz , 配置*/qt-everywhere-src-5.12.0/qtbase/mkspecs/linux-aarch64-gnu-g++下的qmake.conf,参考与*/qt-everywhere-src-5.12.0/qtbase/mkspecs/devices下的文件。
#
# qmake configuration for building with aarch64-linux-gnu-g++
#
MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib
#QT_QPA_DEFAULT_PLATFORM = linuxfb
QT_QPA_DEFAULT_PLATFORM = eglfs
EGLFS_DEVICE_INTEGRATION = eglfs_mali
QMAKE_CFLAGS_RELEASE += -O2 -march=armv8-a -lts
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv8-a -lts
QMAKE_INCDIR += $$[QT_SYSROOT]/usr/include
QMAKE_LIBDIR += $$[QT_SYSROOT]/usr/lib \
# $$[QT_SYSROOT]/lib/aarch64-linux-gnu \
$$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu
QMAKE_RPATHLINKDIR += \
$$[QT_SYSROOT]/usr/lib \
$$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu
# $$[QT_SYSROOT]/lib/aarch64-linux-gnu
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
# modifications to g++.conf
QMAKE_CC = aarch64-linux-gnu-gcc
QMAKE_CXX = aarch64-linux-gnu-g++
QMAKE_LINK = aarch64-linux-gnu-g++
QMAKE_LINK_SHLIB = aarch64-linux-gnu-g++
# modifications to linux.conf
QMAKE_AR = aarch64-linux-gnu-ar cqs
QMAKE_OBJCOPY = aarch64-linux-gnu-objcopy
QMAKE_NM = aarch64-linux-gnu-nm -P
QMAKE_STRIP = aarch64-linux-gnu-strip
# modifications to g++.conf
#QMAKE_CC = /root/work/rk356x/RK356X_LINUX_SDK_RELEASE/rk356x/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc
#QMAKE_CXX = /root/work/rk356x/RK356X_LINUX_SDK_RELEASE/rk356x/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
#QMAKE_LINK = /root/work/rk356x/RK356X_LINUX_SDK_RELEASE/rk356x/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
#QMAKE_LINK_SHLIB = /root/work/rk356x/RK356X_LINUX_SDK_RELEASE/rk356x/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
# modifications to linux.conf
#QMAKE_AR = /root/work/rk356x/RK356X_LINUX_SDK_RELEASE/rk356x/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ar cqs
#QMAKE_OBJCOPY = /root/work/rk356x/RK356X_LINUX_SDK_RELEASE/rk356x/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-objcopy
#QMAKE_NM = /root/work/rk356x/RK356X_LINUX_SDK_RELEASE/rk356x/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-nm -P
#QMAKE_STRIP = /root/work/rk356x/RK356X_LINUX_SDK_RELEASE/rk356x/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-strip
QMAKE_INCDIR_OPENGL_ES2 = $$[QT_SYSROOT]/usr/include
QMAKE_LIBDIR_OPENGL_ES2 = $$[QT_SYSROOT]/usr/lib
#QMAKE_LIBS_OPENGL_ES2 = -lEGL -lGLESv2 -lmali
QMAKE_LIBS_OPENGL_ES2 += -lGLESv2 -lEGL -lmali
QMAKE_INCDIR_EGL = $$[QT_SYSROOT]/usr/include
QMAKE_LIBDIR_EGL = $$[QT_SYSROOT]/usr/lib
#QMAKE_LIBS_EGL = -lEGL -lGLESv2 -lmali
QMAKE_LIBS_EGL += -lEGL
load(qt_config)
3.在*/qt-everywhere-src-5.12.0下增加1.sh,配置脚本
#!/bin/sh
./configure \
-prefix /opt/qt5.12.0-arm64-eglx11 \
-sysroot /root/work/code/software/target \
-confirm-license \
-opensource \
-release \
-make libs \
-xplatform linux-aarch64-gnu-g++ \
-pch \
-qt-libjpeg \
-qt-libpng \
-qt-zlib \
-no-sse2 \
-no-openssl \
-no-cups \
-no-glib \
-no-dbus \
-no-xcb \
-no-separate-debug-info \
-opengl es2 \
-egl \
-eglfs \
-recheck-all
报错解决方法:
1. 6.3.0\include\c++\cstdlib:75:25: fatal error: stdlib.h: No such file or directory
小白一个,完全不知道这是什么鬼,然后就去相关路径下看,发现是有stdlib.h这个库存在的。网上也没有太多相关的资料,看到有的博文说加
-DENABLE_PRECOMPILED_HEADERS=OFF
试了一下发现没起作用。没办法了,只能自己再看看,根据错误提示找到cstdlib,发现里面存在以下定义
// Need to ensure this finds the C library's <stdlib.h> not a libstdc++
// wrapper that might already be installed later in the include search path.
#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS
#include_next <stdlib.h>
#undef _GLIBCXX_INCLUDE_NEXT_C_HEADERS
发下这里用了#include_next, 不太懂这个指令,查了一下发现是用于你不想使用库函数,而想用自己的函数时可以使用这个指令。但是看了注释又说确保这个可以找到C标准库的stdlib.h,而不是后面安装在搜索路径下的libstdc++包装器。关于c++方面还真是一窍不通啊,所以也不管三七二十一了,直接把#include_next 改成#include。虽然方式粗暴,但是最起码程序能跑了,但是这种方式只能作为一种暂时的手段吧,等后面学习得更深入了再说吧。当然还有一些说编译的时候加上 -I 参数的,试过了,也不好使,暂时不知道是什么原因,希望有大神看到能够给小弟一些指导。
更好的方法是使用buildroot编译好的qmake。buildroot编译后会生成qmake,/root/work/rk3568_sdk/rk3568_linux_touch/buildroot/output/rockchip_rk3568/host/bin/qmake,qtcreator直接引用此qmake即可。
本文介绍了在RK3399开发板上从头编译QT框架的过程,包括创建sysroot目录,配置QT源码,解决编译中遇到的头文件问题,以及使用buildroot编译的qmake进行编译。在解决编译错误时,通过修改#include_next为#include作为临时解决方案。最后提出使用buildroot生成的qmake作为更好的编译选项。
2757

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



