基于A40I/T3 SDK平台的QT4.8移植和应用开发连载(三)-盈鹏飞嵌入式

本文记录了QT4.8图形界面在全志A40I/T3 SDK平台上的移植过程,说明过程中可能会技术瑕疵,希望大家提供宝贵意见。
本文移植的平台来自于盈鹏飞嵌入式的CoM-X40I/T3A平台(处理器分别时是全志的A40I/T3)。

以下是盈鹏飞嵌入式CoM-X40I核心模块的简要介绍:

 CoM-X40I V1.1产品特性:

  1. 采用Allwinner公司Cortex-A7四核A40i处理器,运行最高速度为1.2GHZ;
  2. 支持Mali-400MP2 GPU,支持OpenGL ES 2.0 / OpenVG 1.1 standard
  3. 支持1080P 视频编码,支持H.264,VP8;多格式1080P 60fps视频解码 (H.265,H.264,VC-1, MPEG-1/2/4, VP8) 
  4. 支持双屏异显;支持HDMI V1.4A/RGB888/LVDS,分辨率最高1920x1080;T3处理器不支持HDMI;
  5. 支持512-2G  Bytes DDR3 SDRAM;
  6. 支持EMMC 4G-64G大容量电子盘,可启动;
  7. 支持SDIO3.0,USB2.0 HOST&OTG,2路I2C,6路UART,2路SPI,2路PWM
  8. 支持双路以太网,一路10/100M;一路10/100/1000M;
  9. 可定制宽温产品,替换AM335X
  10. 稳定的操作系统的支持,可预装Android7.0或者LINUX 3.10(可预装Preempt Linux系统)
  11. 超小体积,邮票孔设计160pins, 尺寸为:45*45MM

以下是以CoM-X40I为核心板主板-SBC-X40I的功能图:

以下为基于A40I/T3 SDK平台的QT4.8移植和应用开发连载(三)内容:

3 编译安装qt4.8库

3.1快速编译QT4.8库

Qt4.8库的源代码放在<SDK>/buildroot-201611/dl目录下,文件名为qt-everywhere-opensource-src-4.8.7.tar.gz,直接在<SDK>的根目录下执行./ comp_qtLib-487_only.sh即可。

Host#cd <SDK>

注意:<SDK>指的是SDK存放的根目录,根据具体情况而定

Host# ./ comp_qtLib-487_only.sh

comp_qtLib-487_only.sh的内容如下:

#!/bin/bash

echo "ui_autobuild:build.sh"

cd  buildroot-201611/dl

if [ x$1 != "x" ];then

    AWQT_VERSION=$1

else

  AWQT_VERSION=4.8.7

fi

echo "in param is AWQT_VERSION=${AWQT_VERSION}"

if [ -d qt-everywhere-opensource-src-${AWQT_VERSION} ];then

(

    echo "qt-everywhere-opensource-src-${AWQT_VERSION} have been compiled before,skip!!!"

    cd ../../

    ./build.sh

    ./build.sh pack

)

else(

    echo "ui_autobuild:tar qt-everywhere-opensource-src-${AWQT_VERSION}.tgz"

tar  -zxvf  qt-everywhere-opensource-src-${AWQT_VERSION}.tar.gz

#解释:把代码解压缩出来

    echo "ui_autobuild:cp setenvs_qt4.sh"

cp  -f  setenvs_qt4.sh  qt-everywhere-opensource-src-${AWQT_VERSION}/

#解释:把一个环境变量设置的脚本拷贝到qt代码的目录下

    echo "ui_autobuild:source  setenvs_qt4.sh"

    cd qt-everywhere-opensource-src-${AWQT_VERSION}/

source  ./setenvs_qt4.sh

#解释: 在qt代码的目录下,执行设置环境变量的脚本

    echo "ui_autobuild:makeconfig"

makeconfig

#解释:设置好环境变量,进行 qt编译前的配置

    echo "ui_autobuild:makeall"

    make -j6

    echo "ui_autobuild:makeinstall"

makeinstall

#解释:把编译好的 qt库拷贝到目标板未打包的根文件系统下

    cd ../../../

    ./build.sh

    echo "ui_autobuild: pack"

    ./build.sh pack

)

fi

comp_qtLib-487_only.sh脚本中分别调用了makeconfig和makeinstall,他们来自于setenvs_qt4.sh脚本,setenvs_qt4.sh的内容如下:

#!/bin/sh

source ../../../misc_config

if [ ${MISC_GNUEABI} == "gnueabihf" ];then

echo "update g++"

cp -rf ../qt_patch/hf_qt4.8/linux-arm-gnueabi-g++/ mkspecs/qws/

fi

AW_QT_VER=$MISC_QTVER

AW_LICHEE_ROOT=$PWD/../../../

export QT_BUILD_ROOT=$PWD

export TSLIB_INSTALL=/usr/local/tslib1.4

export QT_INSTALL_DIR=$QT_BUILD_ROOT/Qt-$AW_QT_VER

export PATH=$AW_LICHEE_ROOT/out/${MISC_CHIP}/linux/common/buildroot/host/usr/bin/:$PATHexport

SYSROOT=$AW_LICHEE_ROOT/out/${MISC_CHIP}/linux/common/buildroot/host/usr/arm-buildroot-linux-${MISC_GNUEABI}/sysroot

export

CROSS_COMPILE_DIR=$AW_LICHEE_ROOT/out/${MISC_CHIP}/linux/common/buildroot/host/opt/ext-toolchain/bin/

export CROSS_COMPILE=$CROSS_COMPILE_DIR/arm-linux-${MISC_GNUEABI}-

#export CPLUS_INCLUDE_PATH=$PWD/qtbase/src/3rdparty/angle/include:$CPLUS_INCLUDE_PATHexport QMAKEDIR=$QT_BUILD_ROOT/qmake

export PATH=$CROSS_COMPILE_DIR:$QT_INSTALL_DIR/bin:$TSLIB_INSTALL/include:$TSLIB_INSTALL/lib:$PATHfunction cqtroot

{

cd $QT_BUILD_ROOT

}

#-no-c++11

function makeconfig

{

cp $AW_LICHEE_ROOT/tools/pack/chips/${MISC_CHIP}/hal/gpu/fbdev/lib/* $SYSROOT/lib/ -rf mkdir -p $QT_INSTALL_DIR

$QT_BUILD_ROOT/configure \

-opensource \

-confirm-license \

-prefix $QT_INSTALL_DIR \

-release -shared \

-Declarative \

-embedded arm \

-xplatform qws/linux-arm-gnueabi-g++ \

-depths 16,18,24,32 \

-fast -optimized-qmake \

-pch \

-qt-sql-sqlite \

-qt-libjpeg -qt-zlib \

-qt-libpng -qt-freetype \

-no-largefile \

-little-endian -host-little-endian \

-no-qt3support\

-no-libtiff -no-libmng -no-opengl \

-no-mmx -no-sse -no-sse2 -no-3dnow -no-openssl\

-no-webkit -no-qvfb \

-exceptions \

-xmlpatterns \

-script \

-scripttools \

-no-glib \

-no-phonon \

-svg \

-no-nis \

-no-cups \

-no-pch \

-no-glib \

-no-xcursor -no-xfixes -no-xrandr -no-xrender \

-no-separate-debug-info \

-make libs \

-make examples -make demos -nomake tools -nomake docs \

-force-pkg-config \

-no-rpath \

-qt-gfx-linuxfb \

-no-gfx-transformed \

-no-gfx-multiscreen \

-no-gfx-vnc \

-no-gfx-qvfb \

-qt-kbd-linuxinput \

-qt-kbd-tty  \

-no-kbd-qvfb \

-armfpa \

  -no-mouse-qvfb \

-DQT_QLOCALE_USES_FCVT \

-DQT_NO_QWS_CURSOR \

-no-opengl \

-qt-mouse-tslib

# -I/usr/local/tslib/include \

# -L/usr/local/tslib/lib

# -qt-mouse-linuxinput -qt-mouse-pc \

# -egl

# -opengl es2

}

function makeall

{

make -j -C $QT_BUILD_ROOT

}

function makeinstall

{

make -C $QT_BUILD_ROOT install

local

QT_TARGET_INSTALL=$AW_LICHEE_ROOT/out/${MISC_CHIP}/linux/common/buildroot/target/usr/local/Qt-$AW_QT_VER

mkdir -p $QT_TARGET_INSTALL

cp -rf $QT_INSTALL_DIR/*  $QT_TARGET_INSTALL

cp                                                      -rf                                            ../qt_patch/fonts  

$AW_LICHEE_ROOT/out/${MISC_CHIP}/linux/common/buildroot/target/usr/local/Qt-$AW_QT_VER/lib/

cp -rf ../qt_patch/fonts  $AW_LICHEE_ROOT/out/${MISC_CHIP}/linux/common/buildroot/target/usr/share/

cp                       $AW_LICHEE_ROOT/tools/pack/chips/${MISC_CHIP}/hal/gpu/fbdev/lib/*

$AW_LICHEE_ROOT/out/${MISC_CHIP}/linux/common/buildroot/target/usr/lib/ -rf

cp                       $AW_LICHEE_ROOT/tools/pack/chips/${MISC_CHIP}/hal/gpu/fbdev/bin/*

$AW_LICHEE_ROOT/out/${MISC_CHIP}/linux/common/buildroot/target/bin/ -rf

}

makeconfig这个函数是配置qt4.8,用户可根据实际需求增加和删除qt4.8里面的相关组件。

makeinstall这个函数是将编译好的qt4.8的库拷贝到目标板的根文件系统,目录就在

<SDK>/out/sun8iw11p1/linux/common/buildroot/target/usr/local/Qt-4.8.7

注意:<SDK>指的是SDK存放的根目录,根据具体情况而定

3.2 编译QT4.8库时链接tslib

编译QT4.8时,大多数情况下需要链接tslib。如何链接呢?链接tslib库需要配置qmake.conf文件。在setenvs_qt4.sh脚本中,可看到如下指令:

cp -rf ../qt_patch/hf_qt4.8/linux-arm-gnueabi-g++/ mkspecs/qws/

这个指令的目的是拷贝已经准备好的qmake.conf文件新加压出来的qt4.8的代码中,以便于编译时引用。

盈鹏飞嵌入式的SDK已经处理好了qmake.conf文件,该文件位于<SDK>/buildroot-201611/dl/qt_patch/hf_qt4.8/linux-arm-gnueabi-g++目录下。

注意:<SDK>指的是SDK存放的根目录,根据具体情况而定可正常工作的qmake.conf的文件内容如下:

#

# qmake configuration for building with arm-linux-gnueabihf-g++

#

MAKEFILE_GENERATOR      = UNIX

CONFIG                 += incremental

QMAKE_INCREMENTAL_STYLE = sublib

include(../../common/linux.conf)

include(../../common/gcc-base-unix.conf)

include(../../common/g++-unix.conf)

include(../../common/qws.conf)

#add by embfly,23-07-20

#User specific Path - To Be edited by User

#QT4.8 QMAKE.CONF Configuration must use an absolute path

AW_LICHEE_ROOT   = /home/ping/workspace/a40i/lichee

AW_SYSROOT    

=$$AW_LICHEE_ROOT/out/sun8iw11p1/linux/common/buildroot/host/usr/arm-buildroot-linux-

gnueabihf/sysroot

#TSLIB_INCDIR            =

#TSLIB_LIBDIR            =

#tslib.h/libts.so in SYSROOT dir/usr/include &lib

#but can not compile ,the err is "test tslib err";

#QMAKE_INCDIR +=$$AW_SYSROOT/usr/include

#QMAKE_LIBDIR +=$$AW_SYSROOT/usr/lib

#recompilie the tslib1.4 code ,and provice the absolute path

QMAKE_INCDIR +=$$AW_LICHEE_ROOT/tslib1.4/include

QMAKE_LIBDIR +=$$AW_LICHEE_ROOT/tslib1.4/lib

#and end

#QMAKE_INCDIR =/usr/local/tslib1.4/include

#QMAKE_LIBDIR =/usr/local/tslib1.4/lib

# modifications to g++.conf

QMAKE_CC                = arm-linux-gnueabihf-gcc -lts

QMAKE_CXX               = arm-linux-gnueabihf-g++ -lts

QMAKE_LINK              = arm-linux-gnueabihf-g++ -lts

QMAKE_LINK_SHLIB        = arm-linux-gnueabihf-g++ -lts

QMAKE_CFLAGS +=-mfpu=neon -marm -mcpu=cortex-a7

QMAKE_CXXFLAGS +=-mfpu=neon -marm -mcpu=cortex-a7

# modifications to linux.conf

QMAKE_AR                = arm-linux-gnueabihf-ar cqs

QMAKE_OBJCOPY           = arm-linux-gnueabihf-objcopy

QMAKE_NM                = arm-linux-gnueabihf-nm -P

QMAKE_STRIP             = arm-linux-gnueabihf-strip

#add by embfly,23-07-20

QMAKE_INCDIR_EGL

+=                                                                     

$$AW_LICHEE_ROOT/tools/pack/chips/sun8iw11p1/hal/gpu/fbdev_hf/include

QMAKE_LIBDIR_EGL

+=

$$AW_LICHEE_ROOT/tools/pack/chips/sun8iw11p1/hal/gpu/fbdev_hf/lib

QMAKE_LIBS_EGL         += -lEGL -lGLESv2

#and end

QMAKE_INCDIR_OPENGL_ES2

+=$$AW_LICHEE_ROOT/tools/pack/chips/sun8iw11p1/hal/gpu/fbdev_hf/include

QMAKE_LIBDIR_OPENGL_ES2

+=$$AW_LICHEE_ROOT/tools/pack/chips/sun8iw11p1/hal/gpu/fbdev_hf/lib

QMAKE_LIBS_OPENGL_ES2 += -lGLESv2

load(qt_config)

重点说明:

1. QT4.8的qmake.conf文件不能引用环境变量,只能使用绝对路径。如果用户更换了<SDK>的路径,qmake.conf也要一并修改,修改AW_LICHEE_ROOT的值即可。

AW_LICHEE_ROOT   = /home/ping/workspace/a40i/lichee

2. QT4.8的qmake.conf文件不能引用环境,而QT5.X是可以引用环境变量的。

3. QT4.8的qmake.conf不支持SYSROOT,而QT5.X是支持SYSROOT环境变量的。

4. 因此tslib的链接必须如下配置:

#recompilie the tslib1.4 code ,and provice the absolute path

QMAKE_INCDIR +=$$AW_LICHEE_ROOT/tslib1.4/include

QMAKE_LIBDIR +=$$AW_LICHEE_ROOT/tslib1.4/lib

至此,QT4.8的库和TSLIB库均已经移植完成,同时这些库都已经拷贝到未来打包到主板根文件系统的目录下。光有这些库还不行,还需要配置这些库的环境变量,也就是说提前把这些库运行时所需的环境变量预制到主板的跟文件系统中。

3.3 单步编译QT4.8库

Qt4.8的代码放在<SDK>/buildroot-201611/dl目录下,文件名为qt-everywhere-opensource-src-4.8.7.tar.gz,先把该文件解压出来,同时把编译Qt4.8的脚本(setenvs_qt4.sh)拷贝到qt4.8代码所在目录:

Host#cd <SDK>/buildroot-201611/dl

注意:<SDK>指的是SDK存放的根目录,根据具体情况而定

Host# tar –zxvf qt-everywhere-opensource-src-4.8.7.tar.gz

Host# cp build_tslib1.4.sh qt-everywhere-opensource-src-4.8.7

Host# cd qt-everywhere-opensource-src-4.8.7

Host# ./ setenvs_qt4.sh

Host# makeconfig

Host# make –j16

Host# makeinstall

执行完以上指令后,会在<SDK>/buildroot-201611/dl/ qt-everywhere-opensource-src-4.8.7/Qt-4.8.7生成库文件。同样这个库也会拷贝到生成主板根文件系统的目录<SDK>/out/sun8iw11p1/linux/common/buildroot/target/usr/local/Qt-4.8.7。

重点说明:

1)makeconfig和makeinstall来源于setenvs_qt4.sh脚本的执行。当执行setenvs_qt4.sh脚本后,可以通过export指令查看当前是这两个函数变量的。

2)Host# ./ setenvs_qt4.sh,这个指令中,如果发现setenvs_qt4.sh没有执行权限,可以使用chmod增加执行权限,执行指令如下:

Host# chmod +x setenvs_qt4.sh

3)如下指令的-j16参数,是根据编译主机决定。假如主机CPU处理器8核16线程的,那么参数是-16.

如果主机处理器是8核线程,那么参数是-8.参与编译过程的处理器线程越多,那么编译速度越块。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值