本文记录了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