Qt 相关 编译流程及交叉编译 部署所遇到的问题总结-持续更新
准备环境和工具
1、主机环境 ubuntu20
2、交叉编译器 gcc-linaro-6.3.1…arm-linux-gnuebihf
3、QT5源码包qt-5.11.3_sources
下载qt-5.11.3的包,自己想办法下载 网盘啥的 都ok,再访问下载目录就可以显示了。
Index of /archive/qt
4、依赖库安装
sudo apt install g++ make qt3d5-dev-tools -ysudo apt install qml-module-qtquick-xmllistmodel -ysudo apt install qml-module-qtquick-virtualkeyboard qml-module-qtquick-privatewidgets qml-module-qtquick-dialogs qml -ysudo apt install libqt53dquickscene2d5 libqt53dquickrender5 libqt53dquickinput5 libqt53dquickextras5 libqt53dquickanimation5 libqt53dquick5 -ysudo apt install qtdeclarative5-dev qml-module-qtwebengine qml-module-qtwebchannel qml-module-qtmultimedia qml-module-qtaudioengine -y
5、解包交叉编译器和qt源码
tar -xvf gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf.tar
可以选择将gcc编译器,移动到opt目录下
tar -xvf qt-everywhere-src-5.11.3.tar.xz
cd qt-everywhere-src-5.11.3
5、修改qmake.conf
路径: qt-everywhere-src-5.11.3/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf
这里需要先配置下交叉变异工具路径 本机qt程序编译也会调用
#
# qmake configuration for building with arm-linux-gnueabi-g++
#MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublibinclude(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)# modifications to g++.conf
#交叉编译工具 带有-lts的会编译失败不知道为什么
#QMAKE_CC = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcc -lts
#QMAKE_CXX = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-g++ -lts
#QMAKE_LINK = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-g++ -lts
#QMAKE_LINK_SHLIB = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-g++ -ltsQMAKE_CC = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcc
QMAKE_CXX = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-g++
QMAKE_LINK = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-g++ # modifications to linux.conf
#交叉编译工具
QMAKE_AR = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-objcopy
QMAKE_NM = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-nm -P
QMAKE_STRIP = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-strip
load(qt_config)#tslib路径(交叉编译库)
QMAKE_INCDIR=/opt/tslib-1.21/include
QMAKE_LIBDIR=/opt/tslib-1.21/lib
6、configure配置脚本文件
为了防止代码污染,可以先新建一个build目录
mkdir build && cd build (特别说明 这个build 目录 不能在qt 源代码目录下,默认编译仅支持顶级编译,可以在其他目录 脱离qt源码目录随便创建一个文件夹编译)
#!/bin/sh
../configure \
-prefix /opt/rk3288/qt-5.11.3/ \
-xplatform linux-arm-gnueabi-g++ \
-gui \
-widgets \
-release \
-opensource \
-confirm-license \
-no-openssl \
-no-opengl \
-skip qtdeclarative #这行是可选的,加上会不编译qml quick模块,需要就删掉这一行
7、特别说下 -skip qtdeclarative这一条,名字很坑完全看不出和quick有什么关系,网上很多都说编译会报错就加上这个,也可能是因为用不到quick为了缩小体积,很多配置文件都把这个给加上了,但是这个是qml quick模块,需要这部分功能的一定不要加,而且我这边编译也没报错。
8、build (-j8 8指的是cpu核心数)
make -j8
sudo make -j8 install
9、编译报错处理
1),error1 :qt-everywhere-src-5.11.3/qtbase/src/corelib/global/qrandom.cpp:455:62: error: no matching function for call to ‘std::mersenne_twister_engine
方法:在qrandom.cpp 的219行,增加一条定义
typedef quint32 result_type;
qsizetype fillBuffer(void *, qsizetype) Q_DECL_NOTHROW{// always use the fallbackreturn 0;}
#endif // Q_OS_WINRTtypedef quint32 result_type;static SystemGenerator &self();void generate(quint32 *begin, quint32 *end) Q_DECL_NOEXCEPT_EXPR(FillBufferNoexcept);
2),error: ‘SIOCGSTAMP’ undeclared (first use in this function); did you mean ‘SIOCGARP’?
解决:找到socketcanbackend.cpp并打开,添加头文件
#include <linux/sockios.h>
即可解决问题
3),python: not found
解决:在终端输入命令
sudo ln -s /usr/bin/python3 /usr/bin/python 将Python和Python3 连接到一起
4),缺少 libxcb*
解决:sudo apt-get install libxcb*
备注:
ubuntu20的 系统vi编辑器过老,需要升级下
1、打开终端。
2、更新软件包列表:
sudo apt-get update
3、安装或更新 vim:
sudo apt-get install --only-upgrade vim
或者直接升级所有软件包:
sudo apt-get upgrade vim
如果系统提示需要升级,输入 Y 确认。
admin1@admin:/opt/gcc-arm-linux-gnueabihf-8.3.0/bin$ find "$(pwd)" -maxdepth 1
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-addr2line
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/runtest
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcc
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gdb
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-c++filt
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-strip
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-c++
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-elfedit
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-readelf
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-g++
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gprof
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-strings
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-ld.gold
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcov
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-ld
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcc-6.3.1
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-size
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcov-tool
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-objdump
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-dwp
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-as
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcc-ar
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-ld.bfd
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/gdbserver
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-ar
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-ranlib
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-nm
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-objcopy
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-cpp
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcc-nm
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcc-ranlib
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gfortran
下方为编译qt开发工具
../configure \
-prefix /opt/qt-5.11.3/ \
-gui \
-widgets \
-release \
-opensource \
-confirm-license \
-no-openssl \
-no-opengl
之后
make -j8
sudo make -j8 install
上述编译完成之后
sudo apt install qtcreator
问题
可能遇到的问题
ubuntu安装qt时编译出现cstddef:50:10: fatal error: ‘stddef.h’ file not found
sudo apt-get install libclang-common-8-dev
,这条命令完美解决
补充 :
设置文件权限
sudo chmod -R 777 /home/
更改用户组权限
sudo chown admin1:admin1 /home
MAC M2下
当出现 版本不匹配 这样做
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.15CONFIG+=sdk_no_version_check
如果 报错 不影响运行 可以关闭插件中
ClangCodeModel
这个配置是基于 gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf
#
# qmake configuration for building with arm-linux-gnueabi-g++
#MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublibinclude(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)# modifications to g++.conf
QMAKE_CC = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-gcc
QMAKE_CXX = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-g++
QMAKE_LINK = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-g++QMAKE_CC = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-gcc
QMAKE_CXX = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-g++
QMAKE_LINK = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-g++# modifications to linux.conf
QMAKE_AR = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-objcopy
QMAKE_NM = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-nm -P
QMAKE_STRIP = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-strip
load(qt_config)
推荐几个主流 Linaro 工具链版本选择参考
Linaro 工具链版本 | GCC 版本 | 对应 glibc 范围 | 使用场景 |
---|---|---|---|
6.3.1-2017.02 | 6.3.1 | glibc 2.23 | 嵌入式 Linux 4.x 常见 |
7.5.0-2019.12 | 7.5.0 | glibc 2.27~2.28 | ARMv7 硬浮点常见 |
8.3.0-2019.03 | 8.3.0 | glibc 2.28~2.29 | 新平台(如 RK3399) |
aarch64-linux-gnu-9.x | 9.x | glibc 2.31+ | 64 位 ARM(Cortex-A72) |
当嵌入式linux内置qt版本与开发机器编译版本不一致
- 本机编译机器运行正常,但部署远端会发生异常
处理
在远端嵌入式linux机器上进入
/usr/lib/arm-linux-gnueabihf/qt5/qml/QtQuick/Controls.2
嵌入式linux机器qt相关东西一般在这里
随意打开一个 例如 menu.qml vi 编辑后查看内部 import 的相关版本
- 此相关问题 导致的原因在于本地编译qt库与远端设备不同步导致的
- 我是这么确定版本的,那位有更好的方式,可以评论分享下
注意
qt 库编译 - 路径禁止包含中文 --卡了一段时间没想到是因为这个
当开发机器选择远端编译环境运行部署的时候如果提示
qt.qpa.screen: QXcbConnection: Could not connect to display :0
Could not connect to any X display.
- 1、先确认远端是否有
echo $DISPLAY # 如果有输出则说明有图形界面
若上述条件满足 则直接登陆远端设备 直接执行下方指令
- 临时放开所有本地用户的访问权限(不安全,只用于调试):
xhost +local:
或者执行
- (注意:这会放开所有访问权限,不建议在公共或生产环境使用)
xhost +
成功再次编译项目运行到远端
2025-5-29 新增
- 补充 远端登陆设置或许会失败,我是直接在远端机器上执行了( 接上边 xhost 执行结果)
调整设备方向 - 临时生效
xrandr -o normal # 正常显示(默认)
xrandr -o left # 逆时针旋转 90 度
xrandr -o right # 顺时针旋转 90 度
xrandr -o inverted # 180 度旋转(上下颠倒)
值 | 含义 |
---|---|
0 | 正常方向 |
1 | 顺时针旋转 90° |
2 | 旋转 180° |
3 | 逆时针旋转 90° |
查看屏幕旋转方向
cat /sys/class/graphics/fb0/rotate
依次设置
1 就是上边的值echo 1 | sudo tee /sys/class/graphics/fb0/rotate 运行机器黑屏了
此方案 部分机器不兼容 设置后 屏幕黑屏 比如我这边的 因此暂时用的是临时生效方案
- 如何让设备永久生效的方法 我还没找到 ,有那位大佬知道的 麻烦评论下
Qt串口
.pro 文件 QT+= serialport 追加上
大概长下边这个样子
QT += quick serialport
- 新建串口管理类
SerialManager.h
#ifndef SERIALMANAGER_H
#define SERIALMANAGER_H#include <QObject>
#include <QSerialPort>
#include <QSerialPortInfo>class SerialManager : public QObject {Q_OBJECTQ_PROPERTY(QString receivedData READ receivedData NOTIFY receivedDataChanged)public:explicit SerialManager(QObject *parent = nullptr);~SerialManager();Q_INVOKABLE QStringList availablePorts();Q_INVOKABLE bool openPort(const QString &portName, int baudRate);Q_INVOKABLE void sendData(const QString &data);Q_INVOKABLE void sendHexData(const QString &hexString);Q_INVOKABLE void closePort();QString receivedData() const;Q_INVOKABLE void clearReceivedData();signals:void receivedDataChanged();private slots:void handleReadyRead();private:QSerialPort *serial;QString m_receivedData;
};#endif // SERIALMANAGER_H
.cpp
#include "serialmanager.h"
#include <QDebug>
#include <QSerialPortInfo>
#include <QRegularExpression>SerialManager::SerialManager(QObject *parent): QObject(parent), serial(new QSerialPort(this)) {connect(serial, &QSerialPort::readyRead, this, &SerialManager::handleReadyRead);
}SerialManager::~SerialManager() {closePort();
}QStringList SerialManager::availablePorts() {QStringList list;for (const QSerialPortInfo &info : QSerialPortInfo::availablePorts()) {list << info.portName(); // 示例:ttyUSB0、ttyXRUSB1 等}return list;
}bool SerialManager::openPort(const QString &portName, int baudRate) {if (serial->isOpen())serial->close();QString fullName = portName;if (!portName.startsWith("/dev/"))fullName = "/dev/" + portName;serial->setPortName(fullName);bool okRate = serial->setBaudRate(baudRate);qDebug() << "[串口] 设置波特率结果:" << okRate;serial->setDataBits(QSerialPort::Data8);serial->setParity(QSerialPort::NoParity);serial->setStopBits(QSerialPort::OneStop);serial->setFlowControl(QSerialPort::NoFlowControl);bool success = serial->open(QIODevice::ReadWrite);if (success) {qDebug() << "[串口] 打开成功:" << fullName << "波特率:" << baudRate;} else {qWarning() << "[串口] 打开失败:" << fullName << serial->errorString();}return success;
}void SerialManager::sendData(const QString &data) {if (serial->isOpen()) {QByteArray sendBytes = data.toUtf8();serial->write(sendBytes);qDebug() << "[串口] 发送数据:" << sendBytes.toHex(' ').toUpper();} else {qWarning() << "[串口] 发送失败,串口未打开";}
}
void SerialManager::sendHexData(const QString &hexString) {if (!serial->isOpen()) {qWarning() << "[串口] 串口未打开,无法发送";return;}QString cleaned = hexString;cleaned.remove(QRegularExpression("[\\s:]")); // 去掉空格、冒号等QByteArray bytes;for (int i = 0; i < cleaned.length(); i += 2) {QString byteStr = cleaned.mid(i, 2);bool ok;char byte = byteStr.toUInt(&ok, 16);if (ok) {bytes.append(byte);} else {qWarning() << "[串口] 无效HEX:" << byteStr;}}// 计算异或校验值char xorChecksum = 0;for (char b : bytes) {xorChecksum ^= b;}bytes.append(xorChecksum); // 添加校验值serial->write(bytes);qDebug() << "[串口] 发送HEX:" << bytes.toHex(' ').toUpper();
}void SerialManager::closePort() {if (serial->isOpen()) {serial->close();qDebug() << "[串口] 已关闭";}
}void SerialManager::handleReadyRead() {
// QByteArray buffer = serial->readAll();
// m_receivedData += QString::fromUtf8(buffer); // 累加缓存
// qDebug() << "[串口] 收到数据:" << buffer.toHex(' ').toUpper();
// emit receivedDataChanged();QByteArray raw = serial->readAll();m_receivedData += QString::fromUtf8(raw.toHex(' ').toUpper());emit receivedDataChanged();qDebug() << "[串口] 收到数据 HEX:" << raw.toHex(' ').toUpper();
}QString SerialManager::receivedData() const {return m_receivedData;
}void SerialManager::clearReceivedData(){SerialManager::m_receivedData.clear();
}
代码处理完成后
main.cpp 先导包
#include "serialmanager.h"
然后 main 方法里 - 这个位置应该是有要求的 似乎要注册在 QQmlApplicationEngine engine后,至于为啥,暂时我还不知道 看样子 跟什么引擎加载执行顺序有点关系,不大懂
SerialManager serial;
engine.rootContext()->setContextProperty("SerialManager", &serial);
查询系统版本
市面上常用的一般 rk3288 3399 3568 等 使用一些三方sdk时候对系统版本可能会有一定要求 因此
- 注意 这个东西 其实就跟检查 android系统版本一个道理,看sdk是否兼容你手头android机器 (只是这里是linux设备)
dmesg | grep -i rockchip
查询结果
linaro@linaro-alip:~$ dmesg | grep -i rockchip
[ 0.000000] Machine model: rockchip,rk3288w
[ 1.362200] rockchip-system-monitor rockchip-system-monitor: system monitor probe
[ 1.432715] [drm] Rockchip DRM driver version: v1.0.1
[ 1.438287] rockchip-drm display-subsystem: devfreq is not set
[ 1.445867] rockchip-drm display-subsystem: bound ff930000.vop (ops 0xc0b66d80)
[ 1.454484] rockchip-drm display-subsystem: bound ff940000.vop (ops 0xc0b66d80)
[ 1.468904] dwhdmi-rockchip ff980000.hdmi: registered DesignWare HDMI I2C bus driver
[ 1.476830] dwhdmi-rockchip ff980000.hdmi: Detected HDMI TX controller v2.01a with HDCP (DWC HDMI 2.0 TX PHY)
[ 1.488432] rockchip-drm display-subsystem: bound ff980000.hdmi (ops 0xc0b5d7e0)
[ 1.495929] rockchip-drm display-subsystem: failed to bind ff960000.dsi (ops 0xc0b5dc40): -517
[ 1.506020] rockchip-drm display-subsystem: master bind failed: -517
[ 1.831657] Rockchip WiFi SYS interface (V1.00) ...
[ 3.166007] rockchip-iodomain ff770000.syscon:io-domains: wifi supplied by 1800000 uV
[ 3.174444] rockchip-iodomain ff770000.syscon:io-domains: sdcard supplied by 3300000 uV
[ 3.188498] rockchip-thermal ff280000.tsadc: Missing rockchip,grf property
[ 3.195872] rockchip-thermal ff280000.tsadc: tsadc is probed successfully!
[ 3.282915] rockchip_cpuclk_pre_rate_change: Invalid rate : 500000000 for cpuclk
[ 3.347270] dwmmc_rockchip ff0c0000.dwmmc: IDMAC supports 32-bit address mode.
[ 3.354582] dwmmc_rockchip ff0c0000.dwmmc: Using internal DMA controller.
[ 3.361374] dwmmc_rockchip ff0c0000.dwmmc: Version ID is 270a
[ 3.367172] dwmmc_rockchip ff0c0000.dwmmc: DW MMC controller at irq 29,32 bit host data width,256 deep fifo
[ 3.376928] dwmmc_rockchip ff0c0000.dwmmc: 'clock-freq-min-max' property was deprecated.
[ 3.392435] dwmmc_rockchip ff0c0000.dwmmc: GPIO lookup for consumer cd
[ 3.392444] dwmmc_rockchip ff0c0000.dwmmc: using device tree for GPIO lookup
[ 3.392469] dwmmc_rockchip ff0c0000.dwmmc: using lookup tables for GPIO lookup
[ 3.392477] dwmmc_rockchip ff0c0000.dwmmc: lookup for GPIO cd failed
[ 3.392486] dwmmc_rockchip ff0c0000.dwmmc: GPIO lookup for consumer wp
[ 3.392493] dwmmc_rockchip ff0c0000.dwmmc: using device tree for GPIO lookup
[ 3.392515] dwmmc_rockchip ff0c0000.dwmmc: using lookup tables for GPIO lookup
[ 3.392522] dwmmc_rockchip ff0c0000.dwmmc: lookup for GPIO wp failed
[ 3.393713] rockchip-iodomain ff770000.syscon:io-domains: Setting to 3300000 done
[ 3.401326] rockchip-iodomain ff770000.syscon:io-domains: Setting to 3300000 done
[ 3.441675] dwmmc_rockchip ff0c0000.dwmmc: 1 slots initialized
[ 3.447804] dwmmc_rockchip ff0d0000.dwmmc: IDMAC supports 32-bit address mode.
[ 3.455056] dwmmc_rockchip ff0d0000.dwmmc: Using internal DMA controller.
[ 3.461838] dwmmc_rockchip ff0d0000.dwmmc: Version ID is 270a
[ 3.467619] dwmmc_rockchip ff0d0000.dwmmc: DW MMC controller at irq 30,32 bit host data width,256 deep fifo
[ 3.477364] dwmmc_rockchip ff0d0000.dwmmc: 'clock-freq-min-max' property was deprecated.
[ 3.485474] dwmmc_rockchip ff0d0000.dwmmc: No vmmc regulator found
[ 3.491650] dwmmc_rockchip ff0d0000.dwmmc: No vqmmc regulator found
[ 3.497927] dwmmc_rockchip ff0d0000.dwmmc: GPIO lookup for consumer wp
[ 3.497933] dwmmc_rockchip ff0d0000.dwmmc: using device tree for GPIO lookup
[ 3.497951] dwmmc_rockchip ff0d0000.dwmmc: using lookup tables for GPIO lookup
[ 3.497957] dwmmc_rockchip ff0d0000.dwmmc: lookup for GPIO wp failed
[ 3.498096] dwmmc_rockchip ff0d0000.dwmmc: allocated mmc-pwrseq
[ 3.529250] dwmmc_rockchip ff0d0000.dwmmc: 1 slots initialized
[ 3.529531] dwmmc_rockchip ff0f0000.dwmmc: IDMAC supports 32-bit address mode.
[ 3.529559] dwmmc_rockchip ff0f0000.dwmmc: Using internal DMA controller.
[ 3.529566] dwmmc_rockchip ff0f0000.dwmmc: Version ID is 270a
[ 3.529591] dwmmc_rockchip ff0f0000.dwmmc: DW MMC controller at irq 31,32 bit host data width,256 deep fifo
[ 3.529600] dwmmc_rockchip ff0f0000.dwmmc: 'clock-freq-min-max' property was deprecated.
[ 3.529619] dwmmc_rockchip ff0f0000.dwmmc: No vmmc regulator found
[ 3.529622] dwmmc_rockchip ff0f0000.dwmmc: No vqmmc regulator found
[ 3.529628] dwmmc_rockchip ff0f0000.dwmmc: GPIO lookup for consumer wp
[ 3.529630] dwmmc_rockchip ff0f0000.dwmmc: using device tree for GPIO lookup
[ 3.529639] dwmmc_rockchip ff0f0000.dwmmc: using lookup tables for GPIO lookup
[ 3.529642] dwmmc_rockchip ff0f0000.dwmmc: lookup for GPIO wp failed
[ 3.535202] dwmmc_rockchip ff0d0000.dwmmc: card claims to support voltages below defined range
[ 3.554856] dwmmc_rockchip ff0f0000.dwmmc: 1 slots initialized
[ 3.556632] rockchip-dmc dmc: unable to get devfreq-event device : dfi
[ 3.563689] rockchip-pinctrl pinctrl: pin gpio4-30 already requested by ff0d0000.dwmmc; cannot claim for wireless-wlan
[ 3.563693] rockchip-pinctrl pinctrl: pin-150 (wireless-wlan) status -22
[ 3.563697] rockchip-pinctrl pinctrl: could not request pin 150 (gpio4-30) from group wifi-wake-host on device rockchip-pinctrl
[ 3.566081] [drm] Rockchip DRM driver version: v1.0.1
[ 3.566263] rockchip-drm display-subsystem: devfreq is not set
[ 3.566819] rockchip-drm display-subsystem: bound ff930000.vop (ops 0xc0b66d80)
[ 3.567187] rockchip-drm display-subsystem: bound ff940000.vop (ops 0xc0b66d80)
[ 3.567435] dwhdmi-rockchip ff980000.hdmi: registered DesignWare HDMI I2C bus driver
[ 3.567487] dwhdmi-rockchip ff980000.hdmi: Detected HDMI TX controller v2.01a with HDCP (DWC HDMI 2.0 TX PHY)
[ 3.568395] rockchip-drm display-subsystem: bound ff980000.hdmi (ops 0xc0b5d7e0)
[ 3.568404] rockchip-drm display-subsystem: failed to bind ff960000.dsi (ops 0xc0b5dc40): -517
[ 3.569175] rockchip-drm display-subsystem: master bind failed: -517
[ 3.572078] rockchip-dmc dmc: Get drm_device fail
[ 3.572481] [drm] Rockchip DRM driver version: v1.0.1
[ 3.572668] rockchip-drm display-subsystem: devfreq is not set
[ 3.573209] rockchip-drm display-subsystem: bound ff930000.vop (ops 0xc0b66d80)
[ 3.573581] rockchip-drm display-subsystem: bound ff940000.vop (ops 0xc0b66d80)
[ 3.573824] dwhdmi-rockchip ff980000.hdmi: registered DesignWare HDMI I2C bus driver
[ 3.573870] dwhdmi-rockchip ff980000.hdmi: Detected HDMI TX controller v2.01a with HDCP (DWC HDMI 2.0 TX PHY)
[ 3.574777] rockchip-drm display-subsystem: bound ff980000.hdmi (ops 0xc0b5d7e0)
[ 3.574824] rockchip-drm display-subsystem: bound ff960000.dsi (ops 0xc0b5dc40)
[ 3.575000] rockchip-drm display-subsystem: connector[HDMI-A-1] can't found any modes
[ 3.777747] dwmmc_rockchip ff0f0000.dwmmc: Successfully tuned phase to 191
[ 4.273160] rockchip-drm display-subsystem: fb0: frame buffer device
[ 4.373526] rockchip-dmc dmc: Failed to get leakage
[ 4.378641] rockchip-dmc dmc: Failed to get pvtm
[ 4.383518] rockchip-dmc dmc: avs=0
[ 4.387030] rockchip-dmc dmc: failed to get vop bandwidth to dmc rate
[ 4.393490] rockchip-dmc dmc: failed to get vop pn to msch rl
[ 4.399376] rockchip-dmc dmc: l=-2147483648 h=2147483647 hyst=0 l_limit=0 h_limit=0 h_table=0
[ 4.407930] rockchip-dmc dmc: could not find power_model node
[ 4.883456] #0: rockchip,es8388-codec
[ 15.444750] ==== Launching Wi-Fi driver! (Powered by Rockchip) ====
[ 15.457506] Realtek 8723DS SDIO WiFi driver (Powered by Rockchip,Ver v5.13.5-15-gc1c3092fe.20210421_beta) init.
[ 15.467630] [WLAN_RFKILL]: rockchip_wifi_power: 1
[ 1803.422903] rockchip-vop ff940000.vop: [drm:vop_crtc_enable] Update mode to 800x1280p0, type: 16
linaro@linaro-alip:~$
相关文章:
Qt 相关 编译流程及交叉编译 部署所遇到的问题总结-持续更新
准备环境和工具 1、主机环境 ubuntu20 2、交叉编译器 gcc-linaro-6.3.1…arm-linux-gnuebihf 3、QT5源码包qt-5.11.3_sources 下载qt-5.11.3的包,自己想办法下载 网盘啥的 都ok,再访问下载目录就可以显示了。 Index of /archive/qt 4、依赖库安装 sudo …...
前端面经 DNSxieyi1
域名解析协议 域名转为目标IP地址 两种方式 1 递归查询 A请求B B一定会告诉IP 2迭代查询 A请求B 如果B无能 ,B会告诉A如何获得改内容,但是B自己不会发出请求1 步骤 1.检查浏览器DNS 2.没有命中继续查询操作系统的DNS缓存 3.查询本地域名服务器&…...
如何通过ES实现SQL风格的查询?
一、Spring项目集成方案 添加依赖(pom.xml): <dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>8.12.0</version> </dependency> <dependency><…...

知识图谱:重构认知的智能革命
在数字经济的浪潮中,知识图谱正悄然掀起一场认知革命。它不仅是技术的迭代,更是人类从“数据依赖”迈向“知识驱动”的里程碑。当谷歌用知识图谱优化搜索引擎、银行用它穿透复杂的金融欺诈网络、医院用它辅助癌症诊疗时,这项技术已悄然渗透到…...
【计算机网络】4网络层①
这篇笔记讲IPv4和IPv6。 为了解决“IP地址耗尽”问题,有三种措施: ①CIDR(延长IPv4使用寿命) ②NAT(延长IPv4使用寿命) ③IPv6(从根本上解决IP地址耗尽问题) IPv6 在考研中考查频率较低,但需掌握基础概念以防冷门考点,重点结合数据报格式和与 IPv4 的对比记忆。…...

MATLAB中的table数据类型:高效数据管理的利器
MATLAB中的table数据类型:高效数据管理的利器 什么是table数据类型? MATLAB中的table是一种用于存储列向数据的数据类型,它将不同类型的数据组织在一个表格结构中,类似于电子表格或数据库表。自R2013b版本引入以来,t…...

Dropout 在大语言模型中的应用:以 GPT 和 BERT 为例
引言 大型语言模型(LLMs)如 GPT(生成式预训练 Transformer)和 BERT(双向编码器表示 Transformer)通过其强大的语言理解和生成能力,彻底改变了自然语言处理(NLP)领域。然…...
CentOS 7 如何安装libsndfile?
CentOS 7 如何安装libsndfile? # 配置编译环境 yum install -y gcc gcc-c make# 下载libsndfile压缩软件包 wget http://www.mega-nerd.com/libsndfile/files/libsndfile-1.0.25.tar.gztar -xf libsndfile-1.0.25.tar.gz cd libsndfile-1.0.25./configure --prefix/home/libs…...
基于深度学习的语音识别系统设计与实现
以下是为您准备的《基于深度学习的语音识别系统》技术文档,内容包含完整实现方案和详细代码解析: 基于深度学习的语音识别系统设计与实现 目录 语音识别技术概述系统架构设计语音信号预处理深度神经网络模型构建端到端语音识别实现模型训练与优化策略部署与性能优化完整代码…...

gitLab 切换中文模式
点击【头像】--选择settings 选择【language】,选择中文,点击【保存】即可。...

133.在 Vue3 中使用 OpenLayers 实现画多边形、任意编辑、遮罩与剪切处理功能
🎬 效果演示截图(先睹为快) ✨ 功能概览: ✅ 鼠标画任意形状多边形; ✏️ 点击“修改边界”可拖动顶点; 🟥 点击“遮罩”后地图除多边形区域外变红; ✂️ 点击“剪切”后仅显示选…...

4.8.4 利用Spark SQL实现分组排行榜
在本次实战中,我们的目标是利用Spark SQL实现分组排行榜,特别是计算每个学生分数最高的前3个成绩。任务的原始数据由一组学生成绩组成,每个学生可能有多个成绩记录。我们首先将这些数据读入Spark DataFrame,然后按学生姓名分组&am…...
40. 自动化异步测试开发之编写异步业务函数、测试函数和测试类(类写法)
40. 自动化异步测试开发之编写异步业务函数、测试函数和测试类(类写法) 一、类结构设计解析 1.1 基类设计 class Base:async_driver None # 🚗 存储浏览器驱动实例async def get(self, url: str http://secure.smartbearsoftware.com/.…...

【五子棋在线对战】一.前置知识的了解
前置知识的了解 前言1.Websocketpp1.1 使用Websocketpp的原因1.2 Websocket常用接口1.3 Websocket搭建服务器流程 2.JsonCpp2.1 Json 数据对象类的表示2.2序列化和反序列化的接口2.3 演示代码 3.Mysql
历年中国科学技术大学计算机保研上机真题
2025中国科学技术大学计算机保研上机真题 2024中国科学技术大学计算机保研上机真题 2023中国科学技术大学计算机保研上机真题 在线测评链接:https://pgcode.cn/school?classification1 拆分数字 题目描述 给定一个数字,拆分成若干个数字之和ÿ…...
内联盒模型基本概念?——前端面试中的隐形考点剖析
导语 在前端开发中,盒模型是基础知识,但“内联盒模型”往往容易被忽视。它不是“能不能写出页面”的问题,而是“写出的页面为何错位、如何精准定位”的问题。很多面试官会借这个考点,判断候选人对浏览器渲染机制的理解是否深入。…...

HackMyVM-Art
信息搜集 主机发现 ┌──(kali㉿kali)-[~] └─$ nmap -sn 192.168.43.0/24 Starting Nmap 7.95 ( https://nmap.org ) at 2025-05-31 03:00 EDT Nmap scan report for 192.168.43.1 Host is up (0.0047s latency). MAC Address: C6:45:66:05:91:88 (Unknown) Nmap scan rep…...

网页前端开发(基础进阶1)
颜色表示方法3种: 1.关键字: color:green; gray red yellow 2.rgb表示法:红,绿,蓝三原色。rgb(r,g,b),r表示红色,g表示绿…...
const ‘不可变’到底是值不变还是地址不变
const的基础规则 声明时必须初始化 const a; // ❌ 报错:Missing initializer in const declaration const b 10; // ✅ 正确块级作用域(const 的作用域仅限于声明它的代码块) if (true) {const x 100; } console.log(x); // ❌ 报错…...

如何找到一条适合自己企业的发展之路?
一个创业型的企业,开始就需要面向市场,通过自己的服务或产品,帮助用户解决问题,为客户创造价值,通过为客户创造的价值,出创造一定的的现金流,让企业存活下来! 企业的运营过程中&…...

Vue-数据监听
数据监听 基础信息 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>数据监听</title><!-- 引入Vue --><script type"text/javascript" src"../js/vue.js&qu…...

当前用户的Git全局配置情况:git config --global --list
通过config命令可以查询当前用户的全局配置情况。这些配置项定义了 Git 在全局范围内的行为,包括如何处理大文件、SSL 证书验证以及提交时的用户信息。 git config --global --list http.sslVerifyfalse 这个配置项禁用了 SSL 证书验证。这在与自签名证书的 Git 服…...

AI生态警报:MCP协议风险与应对指南(中)——MCP Server运行时安全
作为连接AI模型与外部工具的“USB-C接口”,MCP协议成为AI生态的核心枢纽,其安全风险已从理论威胁转化为实际攻击目标。 AI生态警报:MCP协议风险与应对指南(上)——架构与供应链风险https://blog.csdn.net/WangsuSecur…...

day15 leetcode-hot100-29(链表8)
19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode) 1.暴力法 思路 (1)先获取链表的长度L (2)然后再次遍历链表到L-n的位置,直接让该指针的节点指向下下一个即可。 2.哈希表 思路 ࿰…...
DeepSeek 赋能文化遗产数字化修复:AI 重构千年文明密码
目录 一、引言二、文化遗产数字化修复概述2.1 文化遗产数字化修复的意义2.2 传统数字化修复方法与局限 三、DeepSeek 技术剖析3.1 DeepSeek 技术原理与核心优势3.2 相比其他技术的独特之处 四、DeepSeek 在文化遗产数字化修复中的应用4.1 破损文物的智能修复4.2 文化遗产的虚拟…...

MonitorSDK_性能监控(从Web Vital性能指标、PerformanceObserver API和具体代码实现)
性能监控 性能指标 在实现性能监控前,先了解Web Vitals涉及的常见的性能指标 Web Vitals 是由 Google 推出的网页用户体验衡量指标体系,旨在帮助开发者量化和优化网页在实际用户终端上的性能体验。Web Vitals 强调“以用户为中心”的度量,而不…...
Spring Boot整合JWT实现认证与授权
概述 JSON Web Token (JWT) 是一种开放标准 (RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息。在Web应用中,JWT常用于身份验证和信息交换。 依赖配置 首先需要在项目中添加JWT依赖: <!-- JWT依赖…...
在 Linux 系统上连接 GitHub 的方法 (适用2025年)
在2025年,使用 Linux 系统连接 GitHub 的推荐方式是通过 SSH (Secure Shell) 协议进行身份验证。这种方式不仅安全,还能免去每次操作时输入用户名和密码的繁琐。 🛠️ 步骤一:检查并安装 Git 首先,确保你的系统已安装…...
解决matlab两个库文件名冲突的问题
解决matlab两个库文件名冲突的问题 1、删除一个路径的文件(不推荐)2、改变优先级(让不想要的版本shadowed)3、更改文件名 添加一个库,发现总是调用另一个库的同名文件,这是由于路径中优先级问题。 which -…...
PHP 垃圾回收机制解析与应用案例
PHP 垃圾回收机制解析与应用案例 什么是 PHP 垃圾回收机制? PHP 的垃圾回收(Garbage Collection, GC)机制是其内存管理的重要组成部分。它的主要职责是管理内存的分配与释放,尤其是处理复杂的循环引用问题,确保 PHP …...