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 脚本内容如下:

embed_qt_develop_tutorial_code/script/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 即可。

    qt_cross_compiling001.png
  • 选择刚刚安装的编译器:CROSS_CHAIN_PREFIX=/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf。

  • 安装的路径是:INSTALL_PATH=/opt/${PACKAGE_NAME},即 /opt/tslib-1.21

整个脚本的执行顺序如下:

  1. 下载tslib源码

  2. 解压tslib源码文件

  3. 配置tslib源码, 配置的内容主要是指定编译器: export CC=${CROSS_CHAIN_PREFIX}-gcc; 指定安装路径 --prefix=${INSTALL_PATH} ,即/opt/tslib-1.21; 指定平台: --host=${HOST}

  4. 编译并且安装: 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

embed_qt_develop_tutorial_code/script/build-alsa.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
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 即可。

    qt_cross_compiling002.png
  • 交叉编译器选择刚刚安装的编译器: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

整个脚本的执行顺序如下:

  1. 下载 alsa 源码

  2. 解压 alsa 源码文件

  3. 配置 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

  4. 编译并且安装: 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

embed_qt_develop_tutorial_code/script/build-sqlite3.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
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目录。