当前位置: 首页 > news >正文

IMX6ULL2025年最新部署方案2在Ubuntu24.04上编译通过Qt5.12.9且部署到IMX6ULL正点原子开发板上

IMX6ULL2025年最新部署方案2:在Ubuntu24.04上编译通过Qt5.12.9且部署到IMX6ULL正点原子开发板上

前言

​ 本篇方案部署是笔者这几天除了打蓝桥杯以外,笔者在研究的东西,现在写道这里的时候,笔者已经成功的在Ubuntu24.04上,使用默认最新的交叉编译器和上位机编译器(均为gcc13.3)移植成功了Qt5.12.9,跑通了Qt的官方样例程序和自己写的Qt样例程序。

​ 本篇教程希望达成如下的期望:

  • 在自己的运行现代发行版的上位机上成功编译出可以运行在32位ARM平台(以IMX6ULL为例子)Qt5.12.9的基本运行库
  • 部署自己的使用统一Qt版本的Qt基础开发环境,争取做到上位机和下位机可以通过点击鼠标切换kit无缝切换编译目标平台

​ 笔者的最终运行环境为如下的配置

  • 下位机:搭载了4.3寸RGB屏幕的IMX6ULL的正点原子Alpha开发板,板间系统的基础环境为笔者编写基础教程的运行环境:Uboot2024.4版本+Linux6.12.3内核+1.36版本的Rootfs,如果你没有做好这个也是无所谓的,作为上层框架的Qt一般而言不会关心于此,但是你必须保证你的板子上的C++运行库环境版本跟你编译Qt的交叉编译器的版本完全一致!(小有差距也无所谓,但是太大不行,ABI差异过大会导致未定义的符号或者GLibc的Version决议失败拒绝链接库)
  • 上位机:笔者是一台物理运行Ubuntu24.04操作系统的电脑,上面的编译器环境为arm-linux-gnueabihf-gcc,版本是13.3,其本地gcc也是相同版本的13.3,这个关系没那么大,主要是为了辅助编译qt的。笔者建议,编译主机还是要好一些,笔者的小主机只有四个核,编译qt编译了小一天才完事。(为什么不用虚拟机呢…嗯,我不喜欢,就这样简单,而且到时候你NFS测试包是卡的离谱的,不敢想象沟通一次翻倍的开销)

​ 需要注意的是,Qt5的优化实际上并不好,因此,使用NFS挂载+疯狂的渲染很容易导致卡顿,所以,如果您追求性能,请参考笔者关于移植Qt6.8.3的文章。笔者认为这个应该算是一份比较成功的移植的。

开始我们的旅程

编译tslib

​ tslib是负责了我们跟LCD驱动屏幕底层的触碰的交互。这个库的地址在

https://github.com/libts/tslib

​ 笔者直接下载了最新的ts1.23,请你解压后,进入这个目录:

➜  pwd
/home/charliechen/imx6ull/qt_compile/tslib
➜  ls
acinclude.m4     ChangeLog       config.h       configure     etc         m4           NEWS       stamp-h1  tslib.pc.in
aclocal.m4       cmake           config.h.in    configure.ac  INSTALL     Makefile     plugins    tests
arm-linux.cache  CMakeLists.txt  config.log     COPYING       install-sh  Makefile.am  README     THANKS
AUTHORS          compile         config.status  depcomp       libtool     Makefile.in  README.md  tools
autogen.sh       config.guess    config.sub     doc           ltmain.sh   missing      src        tslib.pc

​ 笔者打算将我们所有的构建成果单独放到一个build文件夹下,比如说我们的

/home/charliechen/imx6ull/qt_compile/tslib_res

​ 我们所以在项目的根目录下写下我们的参数

./configure --host=arm-linux-gnueabihf ac_cv_func_malloc_0_nonnull=yes --cache-file=arm-linux. 
cache -prefix=/home/charliechen/imx6ull/qt_compile/tslib_res

​ 笔者说一下这些参数在作什么:

./configure 是标准的 GNU 配置脚本入口,表示开始配置当前源代码包的编译环境。

--host=arm-linux-gnueabihf 告诉配置系统目标平台是 ARM 架构的 Linux 系统,并且使用的是硬浮点 ABI,这表明这是一个交叉编译过程,不是为本机编译。

ac_cv_func_malloc_0_nonnull=yes 是直接向配置脚本声明某个自动检测变量的值,这里指定 malloc(0) 不会返回空指针,用于跳过自动检查,避免误判影响构建。

--cache-file=arm-linux.cache 告诉配置系统使用并保存中间检测结果到名为 arm-linux.cache 的缓存文件中,下次配置可以加快速度或保持一致性。

-prefix=/home/charliechen/imx6ull/qt_compile/tslib_res 是安装路径的指定,表示 make install 后会把生成的头文件、库文件等内容安装到该目录,供后续使用,比如被 Qt 检测到并链接进去。

这条配置命令主要用于准备好为 i.MX6ULL 平台编译 tslib 的环境,供 Qt 编译阶段使用。

​ 大概如此,配置结束后

make && make install

​ 一气呵成,很快我们的项目就能编译和下载结束

​ 我们的/home/charliechen/imx6ull/qt_compile/tslib_res就是我们之后让Qt跟我们交互的一个重要的根基,请各位朋友注意,这个文件夹下的所有内容,我们稍后就要准备打包放到我们的根文件系统里去了

编译Qt

​ 编译比较古老的Qt,实际上在现代的上位机上非常困难,首先,人家编写的代码就是按照比较古老的GCC头文件和一些跟操作系统紧耦合的头文件的符号进行代码编写的,现在一些内核和编译器的头文件变化不小,因此,我们有时候不得不采取一些很难看的做法(笔者不得不去修改一个编译器的头文件的宏定义问题,注意,千万不要再你的开发中这样干!很不稳定!)

​ 我们首先第一件事情就是拿到我们的Qt源码,当然,笔者选取的就是按照标题所示的那样的——使用的是Qt5.12.9经典版本的编译。

# 下载源码
wget https://download.qt.io/archive/qt/5.12/5.12.9/single/qt-everywhere-src-5.12.9.tar.xz
# 等待下载结束后解压
tar -xf qt-everywhere-src-5.12.9.tar.xz
cd qt-everywhere-src-5.12.9.tar.xz

​ 首先需要注意的是——新版本的Gcc对我们的边界常量移动到了一个新的header叫做limits,因此,你需要做的是,包括但是不限于这些地方的代码上,在文件的开头部分添加一下头文件#include <limits>

qtbase/src/corelib/global/qendian.h
qtbase/src/corelib/tools/qbytearraymatcher.h

​ 还有一部分源文件,但是遗憾的是,这里笔者忘记那些需要做更改了,日志记录不到位,笔者对此深深感到歉意

qtbase/src/tools/moc/generator.cpp
... // 后面笔者记得还会在编译的时候出现一到两次

​ 还有需要修订的是:

vim /usr/arm-linux-gnueabihf/include/features-time64.h

​ 直接添加这个定义,否则会出现_TIMES_BITS_FILE_OFFSET_BITS不协调的问题,注意,如果你有比更改编译器头文件更好的办法,一定要采用!!!不要冒险!

#ifndef _FILE_OFFSET_BITS 
#define _FILE_OFFSET_BITS 64
#endif

​ 编译结束后,也请把东西改回来,不然的话会干扰其他程序。

​ 我们需要做的事情是,开始配置一下我们的Qt的基本情况。我们使用的是arm-linux-gnueabihf-系列的编译器,因此,需要稍微的修改qtbase/

vim qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf 
#
# qmake configuration for building with arm-linux-gnueabi-g++
#MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublib# 我们添加参数: 
# 设置我们的基础对接的图形库是linuxfb,也就是说,直接读写linux对LCD原生的frame buffer从而操作我们的QT库的显示
QT_QPA_DEFAULT_PLATFORM = linuxfb
# 我们需要对C编译器的参数设置添加以下参数
# 包括但是不限于指定使用Cortex-A7架构, ARMv7特化汇编和硬件FPU配置等一系列参数
QMAKE_CFLAGS += -O2 -march=armv7-a -mtune=cortex-a7 -mfpu=neon -mfloat-abi=hard -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64
# 对于C++编译器也是如法炮制
QMAKE_CXXFLAGS += -O2 -march=armv7-a -mtune=cortex-a7 -mfpu=neon -mfloat-abi=hard -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)# modifications to g++.conf
# 注意,下面使用的编译套件都加上hf尾缀,之前是arm-linux-gnueabi-
QMAKE_CC                = arm-linux-gnueabihf-gcc
QMAKE_CXX               = arm-linux-gnueabihf-g++
QMAKE_LINK              = arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB        = arm-linux-gnueabihf-g++# modifications to linux.conf
QMAKE_AR                = arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY           = arm-linux-gnueabihf-objcopy
QMAKE_NM                = arm-linux-gnueabihf-nm -P
QMAKE_STRIP             = arm-linux-gnueabihf-strip
load(qt_config)

​ 我们下一步就是export我们的TSLib的参数位置,现在我们的tslib使用的是pkgconfig来公布自己提供的依赖,因此

export PKG_CONFIG_PATH=~/imx6ull/qt_compile/tslib_res/lib/pkgconfig:$PKG_CONFIG_PATH

​ 这里的pkgconfig指向你自己的tslib编译结果的pkgconfig,他一般在${prefix}/lib/下!(prefix是你自己指定的安装的位置)

​ 下一步就是配置Qt的编译参数,需要注意的是,Qt6的用户,这个方法不是很管用,configure的这样写的配置是有问题的,现在configure是make的前端,之后是cmake的前端,直接抄的参数是不认的!

./configure -prefix /home/charliechen/imx6ull/qt_compile/qt/qt_res \
-opensource \
-confirm-license \
-release \
-strip \
-shared \
-xplatform linux-arm-gnueabi-g++ \
-optimized-qmake \
-c++std c++11 \
--rpath=no \
-pch \
-skip qt3d \
-skip qtactiveqt \
-skip qtandroidextras \
-skip qtcanvas3d \
-skip qtconnectivity \
-skip qtdatavis3d \
-skip qtdoc \
-skip qtgamepad \
-skip qtlocation \
-skip qtmacextras \
-skip qtnetworkauth \
-skip qtpurchasing \
-skip qtremoteobjects \
-skip qtscript \
-skip qtscxml \
-skip qtsensors \
-skip qtspeech \
-skip qtsvg \
-skip qttools \
-skip qttranslations \
-skip qtwayland \
-skip qtwebengine \
-skip qtwebview \
-skip qtwinextras \
-skip qtx11extras \
-skip qtxmlpatterns \
-make libs \
-make examples \
-nomake tools -nomake tests \
-gui \
-widgets \
-dbus-runtime \
--glib=no \
--iconv=no \
--pcre=qt \
--zlib=qt \
-no-openssl \
--freetype=qt \
--harfbuzz=qt \
-no-opengl \
-linuxfb \
--xcb=no \
-tslib \
--libpng=qt \
--libjpeg=qt \
--sqlite=qt \
-plugin-sql-sqlite \
-I/home/charliechen/imx6ull/qt_compile/tslib_res/include \
-L/home/charliechen/imx6ull/qt_compile/tslib_res/lib \
-recheck-all

​ 笔者一一说明我们的参数都在干什么:

./configure -prefix /home/charliechen/imx6ull/qt_compile/qt/qt_res 指定 Qt 安装后的前缀路径,即最终构建完成后 make install 时会把所有内容安装到这个目录中。

-opensource 表示采用开源许可证编译 Qt,通常是 LGPL 版本。

-confirm-license 自动确认 Qt 的开源许可证,无需在配置过程中交互确认。

-release 设置构建为发布版,而非调试版,优化性能并减少体积。

-strip 表示在安装时会去除二进制文件中的符号信息,进一步减小体积。

-shared 表示构建为共享库(动态库),而不是静态库。

-xplatform linux-arm-gnueabi-g++ 告诉 Qt 使用指定的交叉编译平台配置,选择对应的工具链进行编译。

-optimized-qmake 表示使用优化编译方式来构建 qmake 工具,提升其运行效率。

-c++std c++11 指定使用 C++11 标准来构建整个 Qt 框架和相关应用。

--rpath=no 禁止在构建后的二进制中嵌入 rpath 信息,避免运行时链接问题。

-pch 启用预编译头文件以提高编译速度,特别是在大型模块中。

-skip qt3d-skip qtxmlpatterns 一系列参数告诉构建系统跳过这些不需要的模块,从而减少编译时间和目标体积。

-make libs 表示构建核心 Qt 库,而不是只生成工具或示例。

-make examples 同时也编译 Qt 的示例程序,以便测试环境或用作参考。

-nomake tools -nomake tests 告诉系统不要编译 Qt 自带的开发工具(如 qmake 之外的调试器)和测试套件,减少编译负担。

-gui 启用 Qt GUI 模块,这是图形界面构建的基础。

-widgets 启用 QWidget 支持,是传统 Qt 应用构建界面的主要方式。

-dbus-runtime 允许 Qt 使用系统运行时的 D-Bus 实现,而不是静态链接或强制依赖。

--glib=no 表示不使用 Glib 事件循环库,减少对 GNOME 生态的依赖。

--iconv=no 表示不使用外部 iconv 库,避免额外的字符编码依赖。

--pcre=qt 使用 Qt 自带的 PCRE 正则表达式库,避免系统依赖。

--zlib=qt 使用 Qt 自带的 zlib 实现,用于处理压缩数据,也减少外部依赖。

-no-openssl 表示不启用 OpenSSL 支持,这意味着 QtNetwork 不支持 HTTPS 等加密传输。

--freetype=qt 使用 Qt 自带的 FreeType 库来渲染字体,保证平台独立性。

--harfbuzz=qt 启用 Qt 内置的 HarfBuzz 排版引擎以支持高级文字渲染,避免外部链接。

-no-opengl 禁用 OpenGL 支持,适合没有 GPU 或图形加速的嵌入式平台,如 i.MX6ULL。

-linuxfb 设置默认使用 Linux framebuffer(/dev/fb0)作为图形输出接口。

--xcb=no 禁用 X11(XCB)支持,因为目标平台不使用图形服务器。

-tslib 启用对 tslib(触摸屏输入库)的支持,适配嵌入式触摸屏硬件。

--libpng=qt 表示使用 Qt 内置的 libpng 处理 PNG 图像,减少依赖。

--libjpeg=qt 同理,启用 Qt 自带的 libjpeg 支持,用于 JPEG 图像处理。

--sqlite=qt 表示构建时使用 Qt 附带的 SQLite 引擎,不依赖系统提供的版本。

-plugin-sql-sqlite 显式启用 SQLite 的 SQL 插件,以便 Qt 应用可以通过 SQL 接口访问 SQLite 数据库。

-I/home/charliechen/imx6ull/qt_compile/tslib_res/include 将 tslib 的头文件目录添加到 Qt 的编译器搜索路径中,确保能找到对应的函数定义。

-L/home/charliechen/imx6ull/qt_compile/tslib_res/lib 将 tslib 的库文件路径添加到链接器搜索路径中,确保链接时能找到对应库。

-recheck-all 表示强制重新检查所有配置项和依赖,适用于修改配置后重新运行时确保信息更新。

​ 你可以根据你自己的需求进行配置和裁剪。编译后,就可以

gmake -j(nproc)

​ 中间会出现一个这样的错误,就是没有time这个结构体,笔者的更改类似与:

#ifndef input_event_sec
#define input_event_sec __sec
#define input_event_usec __usec
#endif

​ 这样我们进行替换:m_timeStamp = data->input_event_sec + data->input_event_usec / 1000000.0;

​ 现在就OK了

​ qevdevkeyboardhandler.cpp还会报错,是ledWidget设计到了我们的这部分代码

::gettimeofday(&led_ie.time, 0);

​ 改成这样!

struct timeval tv;
::gettimeofday(&tv, 0);
led_ie.input_event_sec = tv.tv_sec;
led_ie.input_event_usec = tv.tv_usec;

​ 换成这样就好了!之后我们修正好了错误之后,就可以继续编译了。

gmake install

​ 结束下载之后呢,我们就可以整个打包,放置到我们的根文件系统里。

放置进入我们的根文件系统

​ 我们把打包的tslib_res和qt_res都打包放到外面的根文件夹系统下,其中我把qt_res改成了arm-qt,笔者也是放置到了我们的/usr/lib下:

arm-qt                tslib	... # 还有其他无关的笔者移植的文件,这里跟我们的构建半毛钱关系没有,笔者不展示

如果你没有触控芯片驱动

​ 对于正点原子的板子,历程源码中是有触控芯片的驱动的,我的板子是4.3RGB。你需要首先做好RGB屏幕驱动的移植和触控芯片的移植,对于触控,你需要做的是修改一下设备树(按照正点原子的即可,对于Linux6.12.3用的设备树还是在那些地方上加,没有变动)和编译对应芯片的驱动即可,在我们使用qt之前,触控芯片的驱动必须加载好,不然没有办法交互的!

提示,你可以先行运行一下在开发板上ts_test,看看自己的驱动有没有问题,能不能正常的进行触摸

修改我们的/etc/profile,加载一些预定义的变量

➜  cat profile # TSLib
export TSLIB_ROOT=/usr/lib/tslib 
export TSLIB_CONSOLEDEVICE=none 
export TSLIB_FBDEVICE=/dev/fb0 
export TSLIB_TSDEVICE=/dev/input/event1 # 注意,要指向你自己的触控屏监听事件,最简单的检测办法就是挂载和卸载自己的lcd触摸驱动看看哪一个event消失了,再不济,cat /proc/bus/input/devices看看哪一个是自己的触摸屏
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf 
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts 
export TSLIB_CALIBFILE=/etc/pointercal 
export LD_PRELOAD=$TSLIB_ROOT/lib/libts.so # Qt
export QT_ROOT=/usr/lib/arm-qt 
export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event1 
export QT_QPA_FONTDIR=/usr/share/fonts 
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins 
export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0 
export QT_PLUGIN_PATH=$QT_ROOT/plugins 
export LD_LIBRARY_PATH=$QT_ROOT/lib:$QT_ROOT/plugins/platforms 
export QML2_IMPORT_PATH=$QT_ROOT/qml 
export QT_QPA_FB_TSLIB=1 
export QT_QPA_FONTDIR=/usr/share/fonts# load neccessary modules
insmod /lib/modules/gt9147.ko	# 笔者的触控芯片驱动,直接使用正点原子编译的即可

TSLib 部分首先设置了环境变量来告知 tslib 使用的资源位置,其中 TSLIB_ROOT=/usr/lib/tslib 是 tslib 安装的根目录,其下应包含配置文件、插件、库等资源。TSLIB_CONSOLEDEVICE=none 禁用 tslib 对控制台设备的交互,适合在纯 framebuffer 环境下使用。TSLIB_FBDEVICE=/dev/fb0TSLIB_TSDEVICE=/dev/input/event1 分别指定 framebuffer 和触摸输入设备,通常 event1 是电容屏的输入节点。TSLIB_CONFFILE 指定配置文件路径,通常位于 $TSLIB_ROOT/etc/ts.conf,其中定义了滤波器和插件顺序。TSLIB_PLUGINDIR 告知 tslib 插件的存放路径,插件负责不同类型触摸屏的处理方式。TSLIB_CALIBFILE=/etc/pointercal 是 tslib 保存校准数据的位置,校准后生成的 pointercal 文件将在启动时被读取。LD_PRELOAD=$TSLIB_ROOT/lib/libts.so 表示在运行 Qt 应用时强制优先加载 tslib 的共享库,使得其对触摸事件的处理生效,即便 Qt 没有编译进对 tslib 的显式支持。

Qt 部分的环境变量用于告知 Qt 运行时如何加载平台插件和配置触摸输入。QT_ROOT=/usr/lib/arm-qt 是 Qt 安装路径,其中应包含 bin、lib、plugins、qml 等子目录。QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event1 告知 Qt 加载 tslib 插件并绑定到指定输入设备,以便进行触摸事件解析。QT_QPA_FONTDIR=/usr/share/fonts 两次定义确保 Qt 能找到系统字体,否则中文或部分图形界面组件可能无法正常显示。QT_QPA_PLATFORM_PLUGIN_PATHQT_PLUGIN_PATH 都指向 Qt 插件路径,确保 Qt 能加载 linuxfb 和其他必要插件。QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0 显式指定 Qt 使用 framebuffer 作为绘图平台,并绑定到 /dev/fb0,适用于无 X11/Wayland 的嵌入式平台。LD_LIBRARY_PATH 扩展了动态库搜索路径,包含 Qt 库目录和平台插件目录,确保应用运行时能找到所需 .so 文件。QML2_IMPORT_PATH 设置 QML 模块查找路径,若使用 QML 组件时可自动找到对应资源。QT_QPA_FB_TSLIB=1 是 Qt 特有环境变量,启用对 tslib 的自动集成,使 Qt GUI 输入能被 tslib 接管。

最后 insmod /lib/modules/gt9147.ko 是加载电容触摸屏控制芯片 GT9147 的内核模块,这个模块提供 /dev/input/event1 节点,是 tslib 的输入源,通常正点原子的驱动即可兼容使用,只需保证内核版本匹配即可。

搬运字体

​ 笔者对中文字体没啥需求,因此,直接复制我们Ubuntu的/usr/share/fonts/ttf下的文件即可。

运行样例程序

请添加图片描述

​ OK,至少我们的Qt程序跑起来是没问题的。

建立Qt的运行环境

​ 我们仍然需要在上位机上下载我们的Qt5.12.9的运行环境。这里笔者直接说一下大致的步骤

wget http://download.qt.io/archive/qt/5.12/5.12.9/qt-opensource-linux-x64-5.12.9.run

​ 然后修改一下qt-opensource-linux-x64-5.12.9.run的权限让他运行起来。笔者建议下载一个qt附带的GCC环境,当然这个看个人。

​ 我们需要手动的添加kit,Qt的Version信息和编译器信息

请添加图片描述
在这里插入图片描述
在这里插入图片描述

​ 之后愉快的写程序,选择交叉套件编译和下载就好了!

请添加图片描述
请添加图片描述

相关文章:

IMX6ULL2025年最新部署方案2在Ubuntu24.04上编译通过Qt5.12.9且部署到IMX6ULL正点原子开发板上

IMX6ULL2025年最新部署方案2:在Ubuntu24.04上编译通过Qt5.12.9且部署到IMX6ULL正点原子开发板上 前言 ​ 本篇方案部署是笔者这几天除了打蓝桥杯以外&#xff0c;笔者在研究的东西&#xff0c;现在写道这里的时候&#xff0c;笔者已经成功的在Ubuntu24.04上&#xff0c;使用默…...

通过微信APPID获取小程序名称

进入微信公众平台&#xff0c;登录自己的小程序后台管理端&#xff0c;在“账号设置”中找到“第三方设置” 在“第三方设置”页面中&#xff0c;将页面拉到最下面&#xff0c;即可通过appid获取到这个小程序的名称信息...

混合开发部署实战:PyInstaller + .NET 8 + Docker全链路配置

文章目录 一、PyInstaller打包Python环境1. 基础打包&#xff08;Linux环境&#xff09;2. 高级配置3. 验证打包结果 二、.NET 8与Python的集成模式1. 进程调用&#xff08;推荐方案&#xff09;2. REST API通信 三、Docker多阶段构建配置1. 完整Dockerfile示例2. 关键配置解析…...

使用 Sass 打造动态星空背景效果

在前端开发中&#xff0c;视觉效果越来越受到重视。本文将通过一个生动的示例&#xff0c;讲解如何利用 Sass 构建一个具有动态星空滚动效果的背景页面&#xff0c;同时也系统介绍 Sass 的核心功能与实践技巧。 一、Sass 的作用 Sass&#xff08;Syntactically Awesome Style …...

低空经济有哪些GIS相关岗位?

在低空经济中&#xff0c;GIS&#xff08;地理信息系统&#xff09;技术发挥着重要作用。GIS开发工程师负责开发、维护和优化与低空经济相关的GIS系统&#xff0c;如无人机起降场布局、空域管理、气象监测等。一般会参与二、三维GIS项目数据处理与前端开发&#xff0c;以及相关…...

Python 垃圾回收机制全解析:内存释放与优化

在编写高效、稳定的 Python 程序时&#xff0c;内存管理往往是一个被忽视但至关重要的领域。对于 Python 开发者来说&#xff0c;最初的学习曲线通常集中在语法、库使用和应用框架上&#xff0c;而对于内存管理和垃圾回收&#xff08;GC&#xff0c;Garbage Collection&#xf…...

性能优化实践

4.1 大规模量子态处理的性能优化 背景与问题分析 量子计算中的大规模量子态处理(如量子模拟、量子态可视化)需要高效计算和实时渲染能力。传统图形API(如WebGL)在处理高维度量子态时可能面临性能瓶颈,甚至崩溃(如表格中14量子比特时WebGL的崩溃)。而现代API(如WebGPU…...

opentelemetry笔记

span https://github.com/open-telemetry/opentelemetry-cpp/blob/f987c9c094f276336569eeea85f17e361de5e518/sdk/src/trace/span.h 在 OpenTelemetry C 的 sdk/src/trace 目录中&#xff0c;不同的 span 定义和实现是为了支持追踪&#xff08;Tracing&#xff09;功能的多样…...

【JavaScript】二十一、日期对象

文章目录 1、实例化日期对象2、相关方法3、时间戳4、案例&#xff1a;毕业&#x1f393;倒计时效果 1、实例化日期对象 获得当前时间 const date new Date()获得指定时间 const date new Date(2025-4-14 20:46:00) console.log(date)2、相关方法 方法作用说明getFullYear…...

GIT工具学习【1】:新安装git预操作

目录 1.写在前面2.为常用指令配置别名3.初始化4.解决中文乱码问题 1.写在前面 新安装git命令后&#xff0c;需要一些设置会用的比较的顺畅。 这篇文章只要跟着做即可&#xff0c;至于原理&#xff0c;后面会写清楚的。 2.为常用指令配置别名 #新建一个.bashrc touch ~/.bash…...

docker安装ES

ES安装步骤 1. 创建docker网络&#xff0c;使其docker内部通信 2. 下载 | 导入镜像文件&#xff08;ES Kibana&#xff09; 3. 创建容器&#xff0c;并访问 4. 安装Ik分词器&#xff08;es对中文并不友好&#xff0c;所以需要安装IK分词使其适配中文&#xff09; 1. 创建docke…...

【控制学】控制学分类

【控制学】控制学分类 文章目录 [TOC](文章目录) 前言一、工程控制论1. 经典控制理论2. 现代控制理论 二、生物控制论三、经济控制论总结 前言 控制学是物理、数学与工程的桥梁 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、工程控制论 1. 经典…...

人工智能应用开发中常见的 工具、框架、平台 的分类、详细介绍及对比

以下是人工智能应用开发中常见的 工具、框架、平台 的分类、详细介绍及对比&#xff1a; 一、工具&#xff08;Tools&#xff09; 定义&#xff1a;用于完成特定任务的软件或库&#xff0c;通常专注于开发流程中的某个环节&#xff08;如数据处理、模型调试、部署等&#xff…...

Linux磁盘格式化(mkfs、mkfs.xfs、mkfs.ext4)、Linux文件系统的校验(xfs_repair、fsck_ext4)

在Linux系统中,磁盘格式化和文件系统校验是系统管理的重要任务。以下是关键步骤和命令的总结: 磁盘格式化 1. 选择文件系统类型 XFS:适用于大文件和高并发场景,支持高性能和扩展性。ext4:成熟稳定的通用文件系统,适合大多数场景。2. 格式化命令 通用格式: sudo mkfs -…...

Android学习总结之git篇

Git 的原理时&#xff0c;你可以从数据结构、对象存储、引用管理、分支与合并等方面结合源码进行分析。以下是详细介绍&#xff1a; 1. 基本数据结构和对象存储 Git 底层主要基于四种对象来存储数据&#xff1a;blob&#xff08;数据块&#xff09;、tree&#xff08;树&…...

Python基础语法——类型

目录 类型的意义动态类型静态类型 类型的意义 不同的类型,占用的内存空间是不同的. 占几个字节 int 默认是 4 个字节.动态扩容 float 固定 8 个字节 bool 一个字节就足够了 str 变长的 不同的类型,对应能够进行的操作也是不同的 int/float, “” “-” “ * ” “/”——不能使…...

vue2中基于el-select封装一个懒加载下拉框

需求 当下拉选项的数据量过大时&#xff0c;后端接口是分页格式返回数据。 解决方案 自定义封装一个懒加载下拉组件&#xff0c;每次滚动到底部时自动获取下一页数据&#xff0c;这样可有效防止数据量过大时造成组件卡顿。 具体实现步骤 1、创建懒加载下拉选择组件 <t…...

uniapp的h5,打开的时候,标题会一闪而过应用名称,再显示当前页面的标题

问题&#xff1a; 微信小程序&#xff0c;通过webview打开了uniapp创建的h5&#xff0c;但是打开h5时&#xff0c;会先显示h5的应用名称&#xff0c;然后才切换为该页面的标题。 过程&#xff1a; 查过很多资料&#xff0c;有说修改应用名称&#xff0c;有说设置navigationS…...

HarmonyOS 5 开发环境全解析:从搭建到实战

鸿蒙来了&#xff0c;从 1.0 到 5.0&#xff0c;它不再只是“华为的操作系统”&#xff0c;而是万物互联生态的核心驱动。作为开发者&#xff0c;你准备好拥抱这个全新时代了吗&#xff1f; 你是否还在犹豫&#xff1a;HarmonyOS 5 开发门槛高不高&#xff1f;该用 DevEco Stu…...

2.2 函数返回值

1.回顾def def sum(x,y): return xy res sum(10,20) #调用函数 print(res) 2.函数的三个重要属性 -函数的类型&#xff1a;function -函数的ID&#xff1a;16进制的整数数值 -函数的值&#xff1a;封装在函数中的数据和代码 # - 函数是一块内存空间&#xff0c;通过…...

OpenAI发布GPT-4.1:开发者专属模型的深度解析 [特殊字符]

最近OpenAI发布了GPT-4.1模型&#xff0c;却让不少人感到困惑。今天我们就来深入剖析这个新模型的关键信息&#xff01; 重要前提&#xff1a;API专属模型 &#x1f4bb; 首先需要明确的是&#xff0c;GPT-4.1仅通过API提供&#xff0c;不会出现在聊天界面中。这是因为该模型主…...

Cython中操作C++字符串

使用Cython开发Python扩展模块-CSDN博客中文末对python代码做了部分C优化&#xff0c;并提及未对字符串类型做优化&#xff0c;并且提到如果不是真正搞懂了C字符串的操作和Python的C API中与字符串相关的知识&#xff0c;最好不要动Python中的字符串类型。为了搞明白在Cython中…...

Dify插件内网安装,解决Dify1.x插件安装总失败问题,手把手教你暴力破解:从镜像源到二进制打包全攻略

背景 自从dify升级到1.0以后&#xff0c;所有的工具和模型都改成了插件化&#xff0c;需要进行插件的安装。在手撕Dify1.x插件报错&#xff01;从配置到网络到Pip镜像&#xff0c;一条龙排雷实录 已经指出了dify在线安装插件的各种问题。 首发地址 在前面的几个版本中&…...

二极管详解:特性参数、选型要点与分类

一、二极管的基本定义 二极管&#xff08;Diode&#xff09; 是由半导体材料&#xff08;如硅、锗&#xff09;构成的双端器件&#xff0c;核心特性是单向导电性。其结构基于PN结&#xff0c;正向偏置导通&#xff0c;反向偏置截止。 核心功能&#xff1a; 整流&#xff08;交…...

BufferedOutputStream 终极解析与记忆指南

BufferedOutputStream 终极解析与记忆指南 一、核心本质 BufferedOutputStream 是 Java 提供的缓冲字节输出流&#xff0c;继承自 FilterOutputStream&#xff0c;通过内存缓冲区显著提升 I/O 性能。 核心特性速查表 特性说明继承链OutputStream → FilterOutputStream → …...

Google政策大更新:影响金融,新闻,社交等所有类别App

Google Play 4月10日 迎来了2025年第一次大版本更新&#xff0c;新政主要涉及金融&#xff08;个人贷款&#xff09;&#xff0c;新闻两个行业。但澄清内容部分却使得所有行业都需进行一定的更新。下面&#xff0c;我们依次从金融&#xff08;个人贷款&#xff09;&#xff0c;…...

【Linux网络与网络编程】10.网络层协议IP

前言 我们之前谈的主机B把数据传递给主机C过程都是黑盒式的&#xff0c;即并没有考虑它的中间过程。本篇博客和下一篇博客将要考虑的问题是&#xff1a;主机B和主机C并不是直接连接的&#xff0c;主机B想要把数据传输给主机C需要经过若干路由器的。我们就引出了两个问题&#x…...

Docker 搭建 RabbitMQ

Docker 搭建 RabbitMQ 前言一、准备工作二、设置目录结构三、编写启动脚本四、Host 网络模式 vs Port 映射模式1. Host 网络模式2. Port 映射模式 五、端口配置对比六、配置示例七、查看与管理八、扩展与高可用九、常用命令 前言 在现代微服务与分布式架构中&#xff0c;Rabbi…...

浏览器自动化检测对抗:修改navigator.webdriver属性的底层实现

一、背景介绍&#xff1a;你被自动化检测拒之门外了吗&#xff1f; 在使用 Selenium 或 Playwright 等浏览器自动化工具爬取数据时&#xff0c;经常会遇到「被检测」问题&#xff0c;尤其像 Amazon 这样反爬策略严密的网站。常见的检测机制之一就是检查 JavaScript 中的 navig…...

聊聊Spring AI Alibaba的DocumentParser

序 本文主要研究一下Spring AI Alibaba的DocumentParser DocumentParser spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/document/DocumentParser.java public interface DocumentParser {/*** Parses a given {link InputStream} into a {link Document}. T…...

用css给div列表加个序号

用 CSS 的 counter 相关属性来为列表添加序号。以下是具体的代码&#xff0c;我将以 HTML 文件的形式提供&#xff0c;并且会运行展示效果&#xff1a; .as-div {// counter-reset: my-counter; /* 计数器名称是my-counter */// counter-reset: small-apple; /* 计数器名称是s…...

CSS标签选择器与类选择器

CSS标签选择器 标签选择器&#xff08;元素选择器&#xff09;是最基本的选择器之一&#xff0c;用于选择HTML文档中的特定标签元素并应用样式。它使用HTML标签名称作为选择器&#xff0c;选择匹配该标签的所有元素。 作用&#xff1a;通过HTML标签名选择元素 以下是CSS标签选…...

(51单片机)LCD显示日期时间时钟(DS1302时钟模块教学)(LCD1602教程)

目录 源代码 main.c LCD1602.c LCD1602.h DS1302.c DS1302.h 代码解析与教程&#xff1a; LCD1602模块 DS1302模块 效果视频&#xff1a; 源代码 如上图将5个文放在Keli5 中即可&#xff0c;然后烧录在单片机中就行了 烧录软件用的是STC-ISP&#xff0c;不知道怎么安装的…...

编译原理(自考13007)

资源内容 大纲 概述...

C#Winform程序将子窗体嵌入容器方法

private void OpenForm(Form childFrom) { //首先判断容器中是否有其他的窗体 foreach (Control item in this.panelRight.Controls) { if (item is Form) { ((Form)item).Close(); } } //嵌入新的窗体 childFrom.TopLevel false;//将子窗体设置成非顶级控件 childFrom.Parent…...

WPS JS宏编程教程(从基础到进阶)-- 第八部分:字符串技术与WPS结合应用

目录 第8章 字符串技术与WPS结合应用8-1 字符串的3种引用方式场景:动态生成报表标题三种引用方式对比代码解析表模板字符串核心优势8-2 字符串处理之切片与搜索场景:提取身份证中的出生年份三大截取方法对比方法选择指南索引搜索实战8-3 字符串处理之修改与填充场景:规范商品…...

WPS Office安卓版文档编辑功能与兼容性评测【高效编辑】

一、界面设计与操作体验 WPS Office安卓版采用简洁直观的界面设计&#xff0c;首页默认展示近期文档列表&#xff0c;支持一键新建文档、表格或演示文稿。整体操作逻辑与PC端保持一致&#xff0c;新用户也能快速上手。编辑工具栏设计合理&#xff0c;常用功能如字体设置、段落…...

【经验记录贴】使用配置文件提高项目的可维护性

mark一下。 整体修改前后如下&#xff1a; 课题&#xff1a; 在项目中有一个支持的文件类型的FILE_TYPE的定义&#xff0c; 这个是写死在主程序中&#xff0c;每次增加可以支持的文件类型的时候&#xff0c;都需要去修改主程序中这个FILGE_TYPE的定义。 主程序修改其实不太花时…...

传统建筑管理人力成本高,楼宇自控系统如何有效降低运营成本

在传统建筑管理模式下&#xff0c;人力成本一直居高不下&#xff0c;成为建筑运营方沉重的负担。从设备的日常巡检、维护&#xff0c;到环境的调控以及能源的管理&#xff0c;无一不需要大量人力投入。然而&#xff0c;随着科技的飞速发展&#xff0c;楼宇自控系统应运而生&…...

RabbitMQ demo案例

1. 下载和安装 RabbitMQ RabbitMQ 依赖 Erlang 运行时&#xff0c;所以得先装 Erlang&#xff0c;再装 RabbitMQ。下面以 Ubuntu 为例&#xff0c;Windows 和 macOS 也顺便提一下。 1.1 安装 Erlang RabbitMQ 需要 Erlang 支持&#xff0c;先装它。 Windows&#xff1a; 去 Erl…...

第T8周:猫狗识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 第T8周&#xff1a;猫狗识别 tf.config.list_physical_devices(“GPU”)&#xff0c;用于检测当前系统是否有可用的 GPU&#xff0c;并将结果存入 gpus 变量。…...

旅游特种兵迪士尼大作战:DeepSeek高精准路径优化

DeepSeek大模型高性能核心技术与多模态融合开发 - 商品搜索 - 京东 随着假期的脚步日渐临近&#xff0c;环球影城等备受瞩目的主题游乐场&#xff0c;已然成为大人与孩子们心中不可或缺的节日狂欢圣地。然而&#xff0c;随之而来的庞大客流&#xff0c;却总让无数游客在欢乐的…...

ffmpeg-将多个视频去掉音频 然后切片组合成一个视频,再将新视频配置上新的音频

需求分解 1、去除原视频的音频轨道。 2、对去掉音频的视频进行切片。 3、将多个视频切片合并为一个新视频。 4、给新的视频添加新的音频轨道。 去除视频音频 要去除视频中的音频&#xff0c;只需使用以下命令 ffmpeg -i input1.mp4 -an -c:v copy output1_no_audio.mp4解释&a…...

05-微服务可观测性体系建设:从日志、监控到链路追踪实战指南

微服务可观测性体系建设&#xff1a;从日志、监控到链路追踪实战指南 一、可观测性&#xff1a;微服务架构的 “神经系统” 1.1 为什么需要可观测性&#xff1f; 在分布式微服务架构中&#xff0c;服务节点可能达数百个&#xff0c;请求链路跨越多服务、数据库、消息队列&am…...

音视频小白系统入门笔记-0

本系列笔记为博主学习李超老师课程的课堂笔记&#xff0c;仅供参阅 音视频小白系统入门课 音视频基础ffmpeg原理 绪论 ffmpeg推流 ffplay/vlc拉流 使用rtmp协议 ffmpeg -i <source_path> -f flv rtmp://<rtmp_server_path> 为什么会推流失败&#xff1f; 默认…...

基于 PyTorch 的 LSTM 实现降雨量预测

基于 PyTorch 的 LSTM 实现降雨量预测示例。包括数据准备、模型定义、训练和预测等。 文章目录 1. 数据准备:2. 模型定义:3. 训练过程:4. 预测和评估:5. 可视化:代码实现1. 数据准备: 使用随机生成的数据作为示例,实际应用中请替换为真实数据。数据被归一化到 [0, 1] 范…...

Spring-Bean的生命周期

一、什么是Bean生命周期&#xff1f; Spring容器中的Bean从创建到销毁的完整过程被称为Bean生命周期&#xff0c;包含实例化→属性注入→初始化→使用→销毁五个核心阶段。Spring提供了丰富的扩展点&#xff0c;允许开发者在各阶段插入自定义逻辑。 二、Bean生命周期全流程&am…...

AI大模型如何重塑科研范式:从“假说驱动”到“数据涌现”

📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:科研进入“模型共研”时代 传统科研范式通常以“假设→实验→验证→理论”的方式推进,这一经典路径建立在人类的认知能力与逻辑推理基础上。然而,随着数据规模的爆炸式增长与知识系统的高度复杂…...

yml文件上传并映射到实体类

文章目录 功能背景功能需要前端开发组件选用组件嵌套和参数绑定上传逻辑示例 后端开发接收逻辑解析逻辑省流纯手动实现&#xff08;不建议&#xff09; 功能背景 开发一个配置文件解析功能&#xff0c;需要兼容老版本的配置文件。 功能需要 前端&#xff1a;两个配置文件分别…...

What are the advantages of our neural network inference framework?

What are the advantages of our neural network inference framework? 1. Background2. What are the advantages of our neural network inference framework?References 1. Background Let me introduce /ˌɪntrəˈdjuːs/ the background /ˈbkɡraʊnd/ first. Today…...