rk3399 编译qt

本文介绍了在RK3399开发板上从头编译QT框架的过程,包括创建sysroot目录,配置QT源码,解决编译中遇到的头文件问题,以及使用buildroot编译的qmake进行编译。在解决编译错误时,通过修改#include_next为#include作为临时解决方案。最后提出使用buildroot生成的qmake作为更好的编译选项。

以下为从头编译方法:

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即可。

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunxiaopengsun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值