环境
硬件: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 这三个库。