前言

为了维护公司的早期项目,需要在ubuntu18.04虚拟机中安装QT4-ARM交叉开发环境,用一篇博文记录下来,供与我有相同需求的同仁参考。
事实上,如果使用默认linux-x86_64-g++安装QT4开发环境,整个配置过程会有很多问题,但这些问题,在安装QT4-ARM交叉环境中却并不出现。
尽管QT4仍然是一个可用的版本,但是它已经被停止维护了,升级到QT5或更高版本才是一个更好的选择,除了避免潜在的问题和风险,更为应用程序带来许多新的特性和改进。


1、安装交叉工具链

  • 打开以下链接:http://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabi/link

  • 找到适用我们系统的版本,下载:图1将gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi.tar.xz拷贝到/opt

  • 解压所选工具链:

sudo tar -xvf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi.tar.xz
  • 将解压缩的工具链目录添加到您的环境变量中,例如添加以下行到 ~/.bashrc 文件:
vim ~/.bashrc
export PATH=$PATH:/opt/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin
  • 运行 source ~/.bashrc 命令以更新环境变量。
source ~/.bashrc

现在应该已经成功地安装了 ARM 交叉编译工具链 4.9.4。

  • 验证一下:
arm-linux-gnueabi-g++ -v
。。。
gcc version 4.9.4 (Linaro GCC 4.9-2017.01) 

2、必要依赖库安装

sudo apt-get install build-essential libfontconfig1 mesa-common-dev libglu1-mesa-dev libpulse-dev libicu-dev libsqlite3-dev libssl-dev libxcb-xinerama0-dev libxkbcommon-dev libxkbcommon-x11-dev libasound2-dev libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev
  • build-essential: Linux 系统编译代码所需要的基础工具包,包括 GCC、G++ 等。
    libfontconfig1: 字体管理库。
  • mesa-common-dev: 提供了 Mesa 开源图形库的头文件,用于编译使用 OpenGL 和 Vulkan 图形 API 的程序。
  • libglu1-mesa-dev: OpenGL 实用程序(GLU)库的头文件和静态库。
    libpulse-dev: PulseAudio 音频服务器的开发包,用于支持 PulseAudio 音频输入/输出。
  • libicu-dev: 国际组件使用的 Unicode 环境的头文件和库。
  • libsqlite3-dev: SQLite 数据库引擎的开发包。
  • libssl-dev: OpenSSl 加密库的开发包。
  • libxcb-xinerama0-dev: XCB Xinerama 扩展库的开发包。
  • libxkbcommon-dev: 开发多语言键盘支持的 X11 库。
  • libxkbcommon-x11-dev: X11 键盘布局管理键库的开发包。
  • libasound2-dev: ALSA 音频架构库的头文件和开发包。
  • libgstreamer-plugins-base1.0-dev: GStreamer 插件基础库的开发包。
  • libgstreamer1.0-dev: GStreamer 基础库的开发包。
    这里的许多库对于Qt for ARM 交叉开发,并不是必须的。本人只是出于习惯,把它们全装上。实际上 Qt for ARM 可能还有更多的依赖库和工具,是否安装取决与具体应用,具体以 Qt for ARM 官方文档为准。

3、下载 、交叉编译、安装 tslib

以下是在 Ubuntu 18.04虚拟机使用 CMake 编译和安装 tslib 库的步骤:
(1) 下载 tslib 源代码

git clone https://github.com/libts/tslib.git

(2)进入 tslib 目录,并创建 build 目录

$ cd tslib
$ mkdir build
$ cd build

(3) cross-toolchain-file.txt
cross-toolchain-file.txt 文件通常是通过手动创建并编辑来实现交叉编译的。该文件包含了一些交叉编译需要用到的工具链信息,比如交叉编译工具链的名称、路径、编译器、链接器、库路径等等。在 CMake 中,可以使用 CMAKE_TOOLCHAIN_FILE 变量指定该文件的路径,以便在交叉编译时使用正确的工具链。在创建 cross-toolchain-file.txt 文件时,需要了解目标设备的架构、操作系统、工具链等信息,并且需要确保所选工具链与目标设备兼容。

下面是cross-toolchain-file.txt文件的示例:

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(TOOLCHAIN_PREFIX /opt/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin)
set(TOOLCHAIN_INCLUDE_PATH /opt/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/include)
set(TOOLCHAIN_LIBRARY_PATH /opt/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/lib)

set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}/arm-linux-gnueabi-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}/arm-linux-gnueabi-g++)
set(CMAKE_STRIP ${TOOLCHAIN_PREFIX}/arm-linux-gnueabi-strip)

set(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_LIBRARY_PATH})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

(4) 运行 CMake 并指定安装目录

$ cmake .. -DCMAKE_INSTALL_PREFIX=/home/linux/tslib-arm -DCMAKE_TOOLCHAIN_FILE=cross-toolchain-file.txt

(4) 编译并安装程序包

$ make
$ sudo make install

4、QT4源码下载

  • 打开以下链接:https://download.qt.io/archive/qt/4.8/4.8.7/link
  • 找到适用我们QT4版本,下载:
    图2
  • 解压QT4源码:
tar -zxvf qt-everywhere-opensource-src-4.8.7.tar.gz
  • 切换到解压后的 qt-everywhere-opensource-src-4.8.7 目录:
cd qt-everywhere-opensource-src-4.8.7/

5、QT4编译、安装

确认当前处在qt-everywhere-opensource-src-4.8.7 目录

  • 配置编译参数:
    在解压源代码后,需要对编译参数进行配置,并指定目标平台、交叉编译器、库文件等信息。具体的编译参数可以参考 Qt 官方文档或手册,或通过 ./configure -h 命令进行查看。
./configure -embedded arm -xplatform linux-arm-gnueabi-g++ -no-mouse-linuxtp -no-webkit -nomake examples -nomake demos -prefix /home/linux/qt4-arm -qt-mouse-tslib -I/home/linux/tslib/include/ -L/home/linux/tslib/lib/ -arch arm -shared -verbose
  • embedded arm:指定Qt正在为嵌入式ARM平台构建。

  • xplatform linux-arm-gnueabi-g++:将构建目标平台设置为使用GNU C++编译器的ARM架构的Linux系统。

  • no-mouse-linuxtp:忽略 Linux 上的鼠标支持。

  • no-webkit:排除 Qt 中的 WebKit 引擎。

  • nomake examples:不编译 Qt 示例程序。

  • nomake demos:不编译 Qt 演示程序。

  • prefix /home/linux/qt4-arm:设置编译后的Qt库的安装目录。

  • qt-mouse-tslib:启用使用tslib库支持的触摸屏支持。

  • I/home/linux/tslib/include/:设置tslib头文件的目录。

  • L/home/linux/tslib/lib/:设置tslib库文件的目录。

  • arch arm:将目标架构指定为ARM。

  • shared:创建共享库而不是静态库。

  • verbose:在构建过程中启用详细输出。

  • 开始编译:
    在完成参数配置后,使用 make 命令进行编译。编译时间会根据参数设置和机器配置而有所不同,可能需要半个小时或更长时间。

make
  • 安装程序包:

在编译完成后,使用 make install 命令将编译好的程序包安装到指定目录中。这个目录我们在前面的配置参数用-prefix 进行了指定,-prefix /home/linux/qt4-arm,在安装前请确认这个安装目录已经存在。

make install 

有两种方式使用tslib库,这两种方法的主要区别在于应用程序如何使用 tslib 库。
在使用 -qt-mouse-tslib 参数配置 Qt 编译选项时,Qt 库中的鼠标驱动将使用 tslib 库来读取触摸屏输入。这意味着 Qt 库为应用程序提供了 tslib 的接口,应用程序直接使用 Qt 库中 tslib 的函数读取触摸屏输入即可。如果采用这种方法,则在编译应用程序时,不需要显式地引用 tslib 库,因为 Qt 库已经包含了 tslib 的接口。
而如果将 tslib 作为外部库加入 Qt Creator,那么需要在编译应用程序时,显式地将 tslib 库链接到应用程序中。这样做的好处是,可以在应用程序中直接使用 tslib 提供的一些其他功能,而不局限于 Qt 库中已经实现的触摸屏输入功能。同时,在使用其他库时,也可以方便地链接 tslib 库,避免了重复编写或链接 tslib 库的工作。
因此,如果只是需要支持触摸屏输入功能,那么 -qt-mouse-tslib 参数是一个比较方便的选择;如果还需要使用 tslib 的其他功能或同时使用其他库,那么将 tslib 作为外部库加入 Qt Creator 中可能更为便捷。本文演示如何使用 -qt-mouse-tslib 参数将tslib库加入Qt4安装程序包中

6、安装和配置qtcreator

(1)安装qtcreator

sudo apt-get install qtcreator

(2)配置qtcreator

  • 打开 Qt Creator,选择「工具」-「选项」-「构建和运行」 - 「Qt Versions」,界面如图:
    图1
  • 切换到 「Comilers」,点击「Add」,进行如下图配置,点击「Apply」和「OK」保存设置:
    图2
  • 切换到「Kits」,点击「Add」,进行如下图配置,点击「Apply」和「OK」保存设置:
    图3

7、新建项目helloworld,使用tslib库

(1) 新建项目 helloworld

图4(2)选择正确的Kits

图5(3)生成如下图的项目:
图6(4)直接编译出现下面的错误:

图7(5)打开helloworld.pro文件,增加一行“LIBS +=-lts”
图8(6)保存后再次编译,通过:
图9

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐