5. Qt环境搭建–Qt组件¶
Qt有非常多的模块,每个模块都有其特定的功能。 有很多模块在默认安装是不会启用的,需要我们手动配置。
首先我们需要了解一下Qt源码编译的过程,其实也无外乎四步:
源码,Qt官方提供了Qt源码,比如整个Qt的源码包,单个功能的模块包。需要什么去Qt官网下载什么。
配置,编译配置,比如设置工具链、设置我们想要使用的Qt功能、组件,指定安装位置等等
编译,上一步配置完毕之后,会生成Makefile,直接执行make就可以编译Qt。
安装,make install,会将编译好的库安装到我们指定目录。
这一章节主要针对Qt功能启用和组件配置。
野火提供了一键编译Qt的脚本build-qt.sh,里面有一些基础的配置,比如tslib,alsa等等。
脚本参考 embed_qt_develop_tutorial_code/script/build-qt.sh
本章启用Qt组件和配置功能主要是修改脚本build-qt.sh中的do_configure()函数。
#配置选项
do_configure () {
echo "\033[1;33mstart configure ${PACKAGE_NAME}...\033[0m"
export CC="${CROSS_CHAIN_PREFIX}-gcc"
export CXX="${CROSS_CHAIN_PREFIX}-g++"
./configure \
-prefix ${INSTALL_PATH} \
-xplatform ${PLATFORM} \
-release \
-opensource \
-confirm-license \
-no-openssl \
-no-opengl \
-no-xcb \
-no-eglfs \
-no-compile-examples \
-no-pkg-config \
-no-iconv \
-no-glib \
-tslib \
-I"${TSLIB_INC}" \
-L"${TSLIB_LIB}" \
-alsa \
-I"${ALSA_INC}" \
-L"${ALSA_LIB}" \
echo "\033[1;33mdone...\033[0m"
}
实际上这个函数就是去到Qt源码目录,在该源码目录执行 ./configure xxxx 。
configure 是一个命令行工具,它确定如何为特定平台构建Qt, 使能Qt中的功能,也可以确定Qt如何在主机平台上构建和部署应用程序。
我们可以去到qt5.11.3源码目录下,运行 ./configure -h 命令查看Qt支持的配置,运行configure后,会自动生成构建Qt的makefile。 build-qt.sh脚本也主要是配置 configure 后面的参数。
# ./configure -h
[....省略大部分的配置内容]
Optional Features:
--disable-option-checking ignore unrecognized --enable/--with options
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
--enable-silent-rules less verbose build output (undo: "make V=1")
--disable-silent-rules verbose build output (undo: "make V=0")
--disable-maintainer-mode
disable make rules and dependencies not useful (and
sometimes confusing) to the casual installer
--enable-dependency-tracking
do not reject slow dependency extractors
--disable-dependency-tracking
speeds up one-time build
--enable-static[=PKGS] build static libraries [default=no]
--enable-shared[=PKGS] build shared libraries [default=yes]
--enable-fast-install[=PKGS]
optimize for fast installation [default=yes]
--disable-libtool-lock avoid locking (might break parallel builds)
--enable-symbolic-functions
use -Bsymbolic-functions option if available
(optmization for size and speed)
--enable-debug enable assert call at the default error message
handler
--enable-resmgr support resmgr (optional)
--disable-aload disable reading /dev/aload*
--disable-mixer disable the mixer component
[....省略大部分的配置内容]
本章不需要逐一浏览,而是选择性查阅,也就是你想要用Qt什么功能,查阅相关的部分,按照步骤操作即可。
当然呢所有工作第一步还是 安装交叉编译工具链 , 如果已经安装直接跳过这一步即可。
5.1. 注意事项¶
再下面就是具体的安装步骤了,在开始安装之前呢,我们首先讲讲几个注意的地方,尤其是初学者。
使用脚本的目的就是方便读者,直接执行脚本就能编译出我们需要的环境,但是安装脚本我们只测试了Ubuntu18.04,所以希望初学者能够完全按照我们的流程来,先过一遍,再理解其中的原理。
embed_qt_develop_tutorial_code/script/ 存放着我们教程提到的所有脚本,建议先git我们的例程仓库,使用我们的脚本来安装环境,避免复制出错,切记脚本不要在共享文件夹中执行。
脚本会下载相关的组件的源码,会受网络影响较大,我们提供了脚本中的离线安装包,建议先下载云盘中的文件放到脚本所在的文件夹,再执行脚本。
每一个脚本执行完毕,建议去opt目录(安装目录)看看有没有生成bin文件夹以确定脚本是否真正执行成功。
每次重新配置build-qt.sh脚本之后都需要重新编译Qt源码,配置才会生效,如果遇到报错,建议直接删除已经解压的文件,重新来。
5.2. 让Qt支持触摸¶
tslib http://www.tslib.org/
tslib是一个用于触摸屏设备的开源函数库,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能, 通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口,比如Qt就是上层应用,数据通过tslib传入Qt应用程序, Qt应用程序就知道哪里被触摸了,然后进行正确的响应。而且通过这样一个函数库,可以将编程者从繁琐的数据处理中解脱出来, 因为触摸屏的坐标和液晶显示屏之间的坐标并不是一一对应的,所以,要让从触摸屏上得到的坐标正确转换为液晶显示屏上的坐标, 需要经过一个转换过程,而tslib就是完成这个功能的。因此在这里预先编译安装tslib,这样在后面编译Qt的时候才能将tslib打包编译进去。
5.2.1. 交叉编译tslib¶
野火提供 build-tslib.sh 脚本一键下载、配置、编译及安装 tslib
build-tslib.sh 脚本内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | #!/bin/sh
# set -v
HOST=arm-linux-gnueabihf
SCRIPT_PATH=$(pwd)
#添加交叉编译工具链路径
# CROSS_CHAIN_PREFIX=/opt/arm-gcc/bin/arm-linux-gnueabihf
CROSS_CHAIN_PREFIX=/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf
#修改源码包解压后的名称
MAJOR_NAME=tslib
#修改需要下载的源码前缀和后缀
OPENSRC_VER_PREFIX=1
OPENSRC_VER_SUFFIX=.21
PACKAGE_NAME=${MAJOR_NAME}-${OPENSRC_VER_PREFIX}${OPENSRC_VER_SUFFIX}
#定义压缩包名称
COMPRESS_PACKAGE=${PACKAGE_NAME}.tar.bz2
#定义编译后安装--生成的文件,文件夹位置路径
INSTALL_PATH=/opt/${PACKAGE_NAME}
#无需修改--下载地址
DOWNLOAD_LINK=https://github.com/libts/${MAJOR_NAME}/releases/download/${OPENSRC_VER_PREFIX}${OPENSRC_VER_SUFFIX}/${COMPRESS_PACKAGE}
#下载源码包
do_download_src () {
echo "\033[1;33mstart download ${PACKAGE_NAME}...\033[0m"
if [ ! -f "${COMPRESS_PACKAGE}" ];then
if [ ! -d "${PACKAGE_NAME}" ];then
wget -c ${DOWNLOAD_LINK}
fi
fi
echo "\033[1;33mdone...\033[0m"
}
#解压源码包
do_tar_package () {
echo "\033[1;33mstart unpacking the ${PACKAGE_NAME} package ...\033[0m"
if [ ! -d "${PACKAGE_NAME}" ];then
tar -xf ${COMPRESS_PACKAGE}
fi
echo "\033[1;33mdone...\033[0m"
cd ${PACKAGE_NAME}
}
#配置选项
do_configure () {
echo "\033[1;33mstart configure ${PACKAGE_NAME}...\033[0m"
export CC=${CROSS_CHAIN_PREFIX}-gcc
./configure \
--prefix=${INSTALL_PATH} \
--host=${HOST} \
echo "\033[1;33mdone...\033[0m"
}
#编译并且安装
do_make_install () {
echo "\033[1;33mstart make and install ${PACKAGE_NAME} ...\033[0m"
make && make install
echo "\033[1;33mdone...\033[0m"
}
#删除下载的文件
do_delete_file () {
cd ${SCRIPT_PATH}
if [ -f "${PACKAGE_NAME}" ];then
sudo rm -f ${PACKAGE_NAME}
fi
}
do_download_src
do_tar_package
do_configure
do_make_install
# do_delete_file
exit $?
|
野火此处选用的tslib版本也是比较新的,是2019年发布的版本tslib-1.21,更多版本大家可以在官方发布的github网站上选择: https://github.com/libts/tslib/releases ,然后只需要修改版本对应的前缀 OPENSRC_VER_PREFIX 与后缀 OPENSRC_VER_SUFFIX 即可。
选择刚刚安装的编译器:CROSS_CHAIN_PREFIX=/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf。
安装的路径是:INSTALL_PATH=/opt/${PACKAGE_NAME},即 /opt/tslib-1.21
整个脚本的执行顺序如下:
下载tslib源码
解压tslib源码文件
配置tslib源码, 配置的内容主要是指定编译器:
export CC=${CROSS_CHAIN_PREFIX}-gcc
; 指定安装路径--prefix=${INSTALL_PATH}
,即/opt/tslib-1.21; 指定平台:--host=${HOST}
。编译并且安装:
make && make install
。
需要使用 sudo 权限执行脚本 ,因为在/opt/目录下必须要有超级用户权限才可以正常安装。
sudo ./build-tslib.sh
5.2.2. configure配置¶
交叉编译完tslib之后,在opt目录下面会有tslib-1.21目录。
这时候,我们还需要配置build-qt.sh脚本,添加如下内容(默认已添加)
-tslib \
-I"${TSLIB_INC}" \
-L"${TSLIB_LIB}" \
目的是在Qt中启用tslib功能,并告诉configure交叉编译的tslib的头文件和库文件位置,以便configure生成makefile。
5.3. Qt使用Linux声卡¶
alsa https://www.alsa-project.org/wiki/Main_Page
高级Linux声音体系(英语:Advanced Linux Sound Architecture,缩写为ALSA),在Linux内核中,ALSA为声卡提供的驱动组件。 ALSA支持声卡的自动配置,以及可以完美的处理系统中的多个声卡设备,所以可能会使用到ALSA, 此时就预先将ALSA交叉编译完成,以便在交叉编译Qt时能将ALSA包含编译进去。
野火提供 build-alsa.sh 脚本一键下载、配置、编译及安装 alsa
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | #!/bin/sh
HOST=arm-linux-gnueabihf
SCRIPT_PATH=$(pwd)
#修改源码包解压后的名称
MAJOR_NAME=alsa-lib
#修改需要下载的源码前缀和后缀
OPENSRC_VER_PREFIX=1.2
OPENSRC_VER_SUFFIX=.2
PACKAGE_NAME=${MAJOR_NAME}-${OPENSRC_VER_PREFIX}${OPENSRC_VER_SUFFIX}
#定义压缩包名称
COMPRESS_PACKAGE=${PACKAGE_NAME}.tar.bz2
#定义编译后安装--生成的文件,文件夹位置路径
INSTALL_PATH=/opt/${PACKAGE_NAME}
#添加交叉编译工具链路径
# CROSS_CHAIN_PREFIX=/opt/arm-gcc/bin/arm-linux-gnueabihf
CROSS_CHAIN_PREFIX=/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf
#无需修改--下载地址
DOWNLOAD_LINK=ftp://ftp.alsa-project.org/pub/lib/${COMPRESS_PACKAGE}
#下载源码包
do_download_src () {
echo "\033[1;33mstart download ${PACKAGE_NAME}...\033[0m"
if [ ! -f "${COMPRESS_PACKAGE}" ];then
if [ ! -d "${PACKAGE_NAME}" ];then
wget -c ${DOWNLOAD_LINK}
fi
fi
echo "\033[1;33mdone...\033[0m"
}
#解压源码包
do_tar_package () {
echo "\033[1;33mstart unpacking the ${PACKAGE_NAME} package ...\033[0m"
if [ ! -d "${PACKAGE_NAME}" ];then
tar -xf ${COMPRESS_PACKAGE}
fi
echo "\033[1;33mdone...\033[0m"
cd ${PACKAGE_NAME}
}
#配置选项
do_configure () {
echo "\033[1;33mstart configure ${PACKAGE_NAME}...\033[0m"
mkdir -p ${INSTALL_PATH}/config
mkdir -p ${INSTALL_PATH}/plugin
export CC=${CROSS_CHAIN_PREFIX}-gcc
./configure \
--prefix=${INSTALL_PATH} \
--host=${HOST} \
# --enable-static \
--enable-shared \
--disable-python \
--with-configdir=${INSTALL_PATH}/config \
--with-plugindir=${INSTALL_PATH}/plugin
echo "\033[1;33mdone...\033[0m"
}
#编译并且安装
do_make_install () {
echo "\033[1;33mstart make and install ${PACKAGE_NAME} ...\033[0m"
make && make install
echo "\033[1;33mdone...\033[0m"
}
#删除下载的文件
do_delete_file () {
cd ${SCRIPT_PATH}
if [ -f "${PACKAGE_NAME}" ];then
sudo rm -f ${PACKAGE_NAME}
fi
}
do_download_src
do_tar_package
do_configure
do_make_install
# do_delete_file
exit $?
|
野火此处选用的alsa版本也是比较新的,是2020年发布的版本alsa-1.2.2,更多版本大家可以在官方发布源码的网站上选择: ftp://ftp.alsa-project.org/pub/lib ,只需要修改版本对应的前缀 OPENSRC_VER_PREFIX 与后缀 OPENSRC_VER_SUFFIX 即可。
交叉编译器选择刚刚安装的编译器:CROSS_CHAIN_PREFIX=/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf。
安装的路径是:INSTALL_PATH=/opt/${PACKAGE_NAME},即 /opt/alsa-1.2.2
整个脚本的执行顺序如下:
下载 alsa 源码
解压 alsa 源码文件
配置 alsa源码, 配置的内容主要是指定编译器:
export CC=${CROSS_CHAIN_PREFIX}-gcc
; 指定安装路径--prefix=${INSTALL_PATH}
,即/opt/alsa-1.2.2; 指定平台:--host=${HOST}
,除此之外还是要动态库的方式连接:--enable-shared
; 不使能Python:--disable-python
; 然后指定配置文件的路径:--with-configdir=${INSTALL_PATH}/config
;指定插件的路径:--with-plugindir=${INSTALL_PATH}/plugin
。编译并且安装:
make && make install
。
需要使用 sudo权限执行脚本 ,因为在/opt/目录下必须要有超级用户权限才可以正常安装。
sudo ./build-alsa.sh
5.3.1. config配置¶
交叉编译完alsa之后,在opt目录下面会有alsa-lib-1.2.2目录。
这时候,我们还需要配置build-qt.sh脚本,添加如下内容(默认已添加)
-alsa \
-I"${ALSA_INC}" \
-L"${ALSA_LIB}" \
目的是在Qt中启用alsa功能,并告诉configure交叉编译的alsa的头文件和库文件位置,以便configure生成makefile。
5.4. 编译SQLite插件¶
sqlite https://www.sqlite.org/index.html
SQLite是一款轻量级数据库,是一个关系型数据库(RDBMS)管理系统,它包含在一个相对小的C库中, 实现了自给自足的、无服务器的、零配置的、事务性的SQL数据库引擎。 在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。
它能够支持Windows/Linux/Unix/Android/IOS等等主流的操作系统,同时能够跟很多程序语言相结合,比如C#、PHP、Java等, 更重要的是 SQLite文件格式稳定,跨平台且向后兼容,开发人员保证至少在2050年之前保持这种格式。 而且速度极快,目前是在世界上最广泛部署的SQL 数据库,据官网统计活跃使用的SQLite数据库超过1万亿,
更重要的是SQLite源代码不受版权限制,任何人都可以免费使用于任何目的。
5.4.1. config配置¶
编译SQLite插件,并不需要交叉编译SQlite,直接在build-qt.sh脚本,添加如下内容
-sqlite \
当然我也顺便提供了交叉编译SQLite的脚本,方便同学使用SQLite。
5.4.2. 交叉编译SQLite¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | #!/bin/sh
HOST=arm-linux-gnueabihf
SCRIPT_PATH=$(pwd)
#修改源码包解压后的名称
MAJOR_NAME=sqlite-autoconf
#修改需要下载的源码前缀和后缀
OPENSRC_VER_PREFIX=335
OPENSRC_VER_SUFFIX=0500
PACKAGE_NAME=${MAJOR_NAME}-${OPENSRC_VER_PREFIX}${OPENSRC_VER_SUFFIX}
echo $PACKAGE_NAME
#定义压缩包名称
COMPRESS_PACKAGE=${PACKAGE_NAME}.tar.gz
#定义编译后安装--生成的文件,文件夹位置路径
INSTALL_PATH=/opt/${MAJOR_NAME}
#添加交叉编译工具链路径
# CROSS_CHAIN_PREFIX=/opt/arm-gcc/bin/arm-linux-gnueabihf
CROSS_CHAIN_PREFIX=/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf
#无需修改--下载地址
#https://www.sqlite.org/2021/sqlite-autoconf-3350500.tar.gz
#https://www.sqlite.org/2021/sqlite-autoconf-3350500.tar.bz2
DOWNLOAD_LINK=https://www.sqlite.org/2021/${COMPRESS_PACKAGE}
echo ${DOWNLOAD_LINK}
#下载源码包
do_download_src () {
echo "\033[1;33mstart download ${PACKAGE_NAME}...\033[0m"
if [ ! -f "${COMPRESS_PACKAGE}" ];then
if [ ! -d "${PACKAGE_NAME}" ];then
wget -c ${DOWNLOAD_LINK}
fi
fi
echo "\033[1;33mdone...\033[0m"
}
#解压源码包
do_tar_package () {
echo "\033[1;33mstart unpacking the ${PACKAGE_NAME} package ...\033[0m"
if [ ! -d "${PACKAGE_NAME}" ];then
tar -xf ${COMPRESS_PACKAGE}
fi
echo "\033[1;33mdone...\033[0m"
cd ${PACKAGE_NAME}
}
#配置选项
do_configure () {
echo "\033[1;33mstart configure ${PACKAGE_NAME}...\033[0m"
mkdir -p ${INSTALL_PATH}/config
mkdir -p ${INSTALL_PATH}/plugin
export CC=${CROSS_CHAIN_PREFIX}-gcc
./configure \
--prefix=${INSTALL_PATH} \
--host=${HOST}
echo "\033[1;33mdone...\033[0m"
}
#编译并且安装
do_make_install () {
echo "\033[1;33mstart make and install ${PACKAGE_NAME} ...\033[0m"
make && make install
echo "\033[1;33mdone...\033[0m"
}
#删除下载的文件
do_delete_file () {
cd ${SCRIPT_PATH}
if [ -f "${PACKAGE_NAME}" ];then
sudo rm -f ${PACKAGE_NAME}
fi
}
do_download_src
do_tar_package
do_configure
do_make_install
# do_delete_file
exit $?
|
需要使用 sudo权限执行脚本 ,因为在/opt/目录下必须要有超级用户权限才可以正常安装。
sudo ./build-sqlite3.sh
交叉编译完sqlite3之后,在opt目录下面会有sqlite-autoconf目录。