QT 应用程序能够在 LCD 屏幕上显示的原理是什么?

111 篇文章 41 订阅

环境

硬件:i.MX6ULL、4.3 寸 RGB LCD 屏幕
软件:arm linux 系统、QT 应用程序(arm 架构)
宿主机:ubuntu16

前言

使用 QT Creator 在宿主机(ubuntu16.04)下交叉编译了一个 QT 应用程序(arm 架构),拷贝到板子后运行,能够在 LCD 上显示图像,
在这里插入图片描述

我就在想,这背后的整个(一系列)原理是什么?于是就有了今天这篇文章。

LCD 能够显示图案的原理是什么

LCD 驱动向 LCD 屏幕发送数据,LCD 就能根据数据显示图像。
在这里插入图片描述

LCD 驱动程序从哪里拿到一帧一帧的图像数据

从 /dev/fb。
framebuffer 作为 LCD 的帧缓存,LCD 控制器根据固定的频率,从 fb 中取走一幅图像数据,经过自身加工,将数据通过 RGB 接口发送给 LCD 屏幕。
在这里插入图片描述

QT 怎么和 fb 扯上关系的呢

通过环境变量 QT_QPA_PLATFORM,该变量指定了 QT 应用程序使用的 fb 设备

root@ATK-IMX6U:~# echo $QT_QPA_PLATFORM
linuxfb:tty=/dev/fb0

在这里插入图片描述

QT 应用程序在哪处代码写了会使用 QT_QPA_PLATFORM 环境变量

strings


QT 应用程序(lyj_test_0401)会使用环境变量 QT_QPA_PLATFORM,
但是,我不知道是“谁”决定了 QT 应用程序会使用这个环境变量,
那就使用 strings 查看 QT_QPA_PLATFORM 处于代码的什么位置

alientek@ubuntu16:~/alpha/alientek-alpha/qt-alientek/0401/build-lyj_test_0401-ATK_I_MX6U-Release$ file lyj_test_0401
lyj_test_0401: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.32, BuildID[sha1]=a32e521f27e5318e032bd9867de6a7c4e1b50df4, not stripped
alientek@ubuntu16:~/alpha/alientek-alpha/qt-alientek/0401/build-lyj_test_0401-ATK_I_MX6U-Release$ strings lyj_test_0401 | grep "QT_QPA_PLATFORM"

没有在 lyj_test_0401 中搜索到 QT_QPA_PLATFORM,说明,没有直接编码进应用程序中,那就看看是不是在动态库中

ldd


使用 ldd 查看 lyj_test_0401 依赖的动态库

root@ATK-IMX6U:~# ldd lyj_test_0401
        linux-vdso.so.1 (0x7ef29000)
        libQt5Widgets.so.5 => /usr/lib/libQt5Widgets.so.5 (0x76a95000)
        libQt5Gui.so.5 => /usr/lib/libQt5Gui.so.5 (0x76588000)
        libQt5Core.so.5 => /usr/lib/libQt5Core.so.5 (0x75fe8000)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x75ea7000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x75e7a000)
        libc.so.6 => /lib/libc.so.6 (0x75d41000)
        。。。

和 QT 相关的是 libQt5Widgets.so.5、libQt5Gui.so.5、libQt5Core.so.5 这三个,那就在这三个中查找下

alientek@ubuntu16:~$ strings /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib/libQt5Gui.so.5.12.9 | grep "QT_QPA_PLATFORM"
QT_QPA_PLATFORM_PLUGIN_PATH
QT_QPA_PLATFORM
QT_QPA_PLATFORMTHEME
Use QT_QPA_PLATFORM=wayland to run on Wayland anyway.

在 libQt5Gui.so.5.12.9 中查找到了字符串 QT_QPA_PLATFORM,说明
QT 应用程序(lyj_test_0401)会使用环境变量 QT_QPA_PLATFORM,这是由 libQt5Gui.so.5.12.9 动态库决定的。
在这里插入图片描述

QT 应用程序(lyj_test_0401)为什么会依赖 libQt5Gui.so 库

直接看 QT Creator 编译 log

21:44:42: Running steps for project lyj_test_0401...
21:44:42: Configuration unchanged, skipping qmake step.
21:44:42: Starting: "/usr/bin/make" -j1
arm-poky-linux-gnueabi-g++  -march=armv7ve -mfpu=neon  -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi -c -pipe --sysroot=/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi -O2 -DLINUX=1 -DLINUX=1 -DLINUX=1 -DLINUX=1 -DLINUX=1 -DLINUX=1 -std=gnu++11 -Wall -W -D_REENTRANT -fPIC -DQT_DEPRECATED_WARNINGS -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../lyj_test_0401 -I. -I/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/include/QtWidgets -I/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/include/QtGui -I/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/include/QtCore -I. -I. -I/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib/mkspecs/linux-oe-g++ -o mainwindow.o ../lyj_test_0401/mainwindow.cpp
arm-poky-linux-gnueabi-g++  -march=armv7ve -mfpu=neon  -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi -Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed --sysroot=/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi -Wl,-O1 -o lyj_test_0401 main.o mainwindow.o moc_mainwindow.o   /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib/libQt5Widgets.so /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib/libQt5Gui.so /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib/libQt5Core.so /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib/libGLESv2.so -lpthread   
21:44:44: The process "/usr/bin/make" exited normally.
21:44:45: Elapsed time: 00:03.

编译时使用到了 libQt5Gui.so 动态库
在这里插入图片描述

谁决定了编译时会使用 libQt5Gui.so 动态库

在这里插入图片描述
QT Creator 工程环境中指定了要使用 libQt5Widgets.so.5、libQt5Gui.so.5、libQt5Core.so.5 这三个库。
在这里插入图片描述

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Li-Yongjun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值