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

本文记录了QT4.8图形界面在全志A40I/T3 SDK平台上的移植过程,说明过程中可能会技术瑕疵,希望大家提供宝贵意见。

本文移植的平台来自于盈鹏飞嵌入式的CoM-X40I/T3A平台(处理器分别时是全志的A40I/T3)。

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

CoM-X40I产品特性:

采用Allwinner公司Cortex-A7四核A40i处理器,运行最高速度为1.2GHZ;

支持Mali-400MP2 GPU,支持OpenGL ES 2.0 / OpenVG 1.1 standard

支持1080P视频编码,支持H.264,VP8;多格式1080P 60fps视频解码 (H.265,H.264,VC-1, MPEG-1/2/4, VP8) 

支持双屏异显;支持HDMI V1.4A/RGB888/LVDS,分辨率最高1920x1080;T3处理器不支持HDMI;

支持512-2G  Bytes DDR3 SDRAM;

支持EMMC 4G-64G大容量电子盘,可启动;

支持SDIO3.0,USB2.0 HOST&OTG,2路I2C,6路UART,2路SPI,2路PWM

支持双路以太网,一路10/100M;一路10/100/1000M;

可定制宽温产品,替换AM335X

稳定的操作系统的支持,可预装Android7.0或者LINUX 3.10(可预装Preempt Linux系统)

超小体积,邮票孔设计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/shsource ../../../misc_configif [ ${MISC_GNUEABI} == "gnueabihf" ];then 

echo "update g++" cp -rf ../qt_patch/hf_qt4.8/linux-arm-gnueabi-g++/ mkspecs/qws/fiAW_QT_VER=$MISC_QTVERAW_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/:$PATH

export

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.参与编译过程的处理器线程越多,那么编译速度越块。

Host# make –j16

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容