Ubuntu Qt x64平台搭建 arm64 编译套件

环境:
主机平台:Ubuntu22.04.5 x86_64
目标平台:IMX8QM Ubuntu22.04.5 arm64
Qt版本:Qt6.5.3 LST
GUI实现:QML

一、获取Ubuntu22.04.5 x86_64 系统镜像文件

1、镜像下载与安装

使用国内镜像下载对应版本的Ubuntu镜像,我使用的是阿里云的镜像
在这里插入图片描述
在这里插入图片描述

2、安装虚拟机

在这里插入图片描述

3、安装后的一些问题的解决

Ubuntu18.6 学习QT问题记录以及虚拟机安装Ubuntu后的设置

4、C/C++ 开发环境安装

二、目标平台安装 Qt 6.5.3

1、下载在线安装程序

在Qt 官网下载Qt在线安装包,这里需要在官网注册一个账号,登陆后才可以下载,我下载Linux x64版本。
在这里插入图片描述

2、Ubuntu开启ftp服务,上传qt在线安装程序。

在这里插入图片描述

3、命令行启动,使用阿里云镜像

给在线安装程序可执行权限
在这里插入图片描述

./qt-online-installer-linux-x64-4.10.0.run  --mirror https://mirrors.aliyun.com/qt/

4、下载所需版本

Qt提示需要安装库
在这里插入图片描述
使用apt安装库文件,下载所需版本和组件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5、配置Qt所需环境(在步骤4时已安装)

sudo apt install libxcb-cursor0 libxcb-cursor-dev
sudo apt-get install build-essential libgl1-mesa-dev

1、libxcb-cursor0 和 libxcb-cursor-dev 是与 XCB(X C Binding) 相关的库,主要用于在 Linux 系统中处理鼠标光标(cursor)相关的功能。
2、build-essential这是一个元包(meta-package),它会自动安装一系列编译 C/C++ 程序所需的基础工具和库,包括:
编译器:gcc(GNU C 编译器)、g++(GNU C++ 编译器)
构建工具:make(用于解析 Makefile 并执行编译流程)
标准库:libc6-dev(GNU C 标准库的开发文件)等
作用:提供编译 C/C++ 程序的最小环境。几乎所有需要编译源码的场景(包括 Qt 项目构建)都需要先安装它,否则会出现 “缺少编译器”“无法识别 make 命令” 等错误。
3、这是 Mesa 3D 图形库的开发包,主要提供:OpenGL 接口的实现(用于 2D/3D 图形渲染)头文件(如 GL/gl.h)和链接库,供程序编译时调用
作用:
Qt(尤其是涉及图形渲染的模块,如 Qt Widgets、Qt Quick)依赖 OpenGL 进行界面绘制。如果缺少这个包,编译 Qt 项目时可能会出现 “找不到 GL 库”“无法链接 OpenGL” 等错误,导致图形界面程序无法构建或运行。

** 注意:使用在线安装工具安装qt后,第一次运行工程出现error: cmake project configuration failed. no cmake configuration for build type “debug” found. check general messages for more information.错误,可能是没有设置Qt运行环境**

6、创建示例工程并测试

创建工程运行报错,安装如下库后回复正常,错误内容为:error: cmake project configuration failed. no cmake configuration for build type “debug” found. check general messages for more information.
安装OpenGl相关依赖库

sudo apt update && sudo apt install libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev

安装xcb 插件依赖

sudo apt install libxcb-cursor0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 libxcb-xinerama0

在这里插入图片描述

7、运行从git 下载的Qt项目

这个项目时从我的另一台电脑上的Ubuntu虚拟机上传到GIT的,Qt版本一致,运行前先配置项目中的CAMKE等设置,因为两台Ubuntu虚拟机安装Qt的目录不同,否则会报错

三、交叉编译环境搭建(参考野火教程)

野火Qt6交叉编译教程

1、宿主机下载相关库与工具

sudo apt update
sudo apt install libssl-dev gperf pkg-config git bison ninja-build
sudo apt install make build-essential libclang-dev \libfontconfig1-dev libfreetype6-dev libx11-dev libx11-xcb-dev \libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libxcb-glx0-dev \libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev \libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev \libxcb-util-dev libxcb-xinerama0-dev libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev \libatspi2.0-dev libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev

2、获取并安装交叉编译器

这里我直接用命令下载的编译器

wangju@wangju-virtual-machine:~$ which aarch64-linux-gnu-g++
/usr/bin/aarch64-linux-gnu-g++
wangju@wangju-virtual-machine:~$ which g++
/usr/bin/g++
wangju@wangju-virtual-machine:~$ 

3、构建sysroot目录

板卡下载相关库

# 安装一些库和工具等,按自己需要安装
sudo apt update# x11相关
sudo apt-get install -y libx11-dev freetds-dev libsqlite0-dev libpq-dev libiodbc2-dev firebird-dev \libxcb1 libxcb1-dev libx11-xcb1 libx11-xcb-dev  \libxcb-keysyms1 libxcb-keysyms1-dev libxcb-image0 libxcb-image0-dev libxcb-shm0 libxcb-shm0-dev \libxcb-icccm4 libxcb-icccm4-dev libxcb-sync1 libxcb-sync-dev libxcb-render-util0 \libxcb-render-util0-dev libxcb-xfixes0-dev libxrender-dev libxcb-shape0-dev libxcb-randr0-dev \libxcb-glx0-dev libxi-dev libdrm-dev libxcb-xinerama0 libxcb-xinerama0-dev libatspi2.0-dev \libxcursor-dev libxcomposite-dev libxdamage-dev libxss-dev libxtst-dev libpci-dev libcap-dev \libxrandr-dev libdirectfb-dev libaudio-dev libxkbcommon-x11-dev# gst 1.0相关
sudo apt-get install -y libgstreamer1.0-0 gstreamer1.0-plugins-base \gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly \gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools libunwind-dev# 其他等等
sudo apt-get install -y libfreetype6-dev libicu-dev libsqlite3-dev libasound2-dev libnss3-dev \libxss-dev libxtst-dev libpci-dev libcap-dev libsrtp0-dev libxrandr-dev libdirectfb-dev libaudio-dev \libavcodec-dev libavformat-dev libswscale-dev libts-dev libfontconfig1-devsudo apt-get install -y libssl-dev libdbus-1-dev libglib2-dev libegl1-mesa-dev \libgbm-dev libgles2-mesa-dev libgles2-mesa rsyslog  libjpeg-dev

然后我将 /lib /usr 这两个目录通过ftp全部下载到了主机上。具体可以参考野火教程

4、安装CMAKE(源码编译安装)

先用命令安装cmake。
按照野火教程,先为主机编译安装qt源码。
然后新建一个cmake 工具链文件,用来指定CMAKE相关参数(交叉编译需要)

# 这里设置cmake支持的最小版本
cmake_minimum_required(VERSION 3.18)
include_guard(GLOBAL)set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)# 指定sysroot目录 需要自己修改
set(TARGET_SYSROOT /home/wangju/develope/sysroot) # 指定前面获取的交叉编译器路径  需要自己修改
set(CROSS_COMPILER /usr/bin/aarch64-linux-gnu)set(CMAKE_SYSROOT ${TARGET_SYSROOT})set(CMAKE_C_COMPILER ${CROSS_COMPILER}-gcc)
set(CMAKE_CXX_COMPILER ${CROSS_COMPILER}-g++)set(CMAKE_LIBRARY_ARCHITECTURE aarch64-linux-gnu)# 库路径
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC -Wl,-rpath-link,${CMAKE_SYSROOT}/lib/${CMAKE_LIBRARY_ARCHITECTURE} -fPIC -Wl,-rpath-link,${CMAKE_SYSROOT}/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE} -L${CMAKE_SYSROOT}/lib -L${CMAKE_SYSROOT}/lib/${CMAKE_LIBRARY_ARCHITECTURE}  -L${CMAKE_SYSROOT}/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE} -L${CMAKE_SYSROOT}/usr/lib -I${TARGET_SYSROOT}/usr/include -I${TARGET_SYSROOT}/usr/include/${CMAKE_LIBRARY_ARCHITECTURE}")
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}")# pkg config路径
set(ENV{PKG_CONFIG_PATH} ${TARGET_SYSROOT}/usr/lib/pkgconfig:${TARGET_SYSROOT}/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}/pkgconfig:${TARGET_SYSROOT}/usr/share/pkgconfig/)
set(ENV{PKG_CONFIG_LIBDIR} ${TARGET_SYSROOT}/usr/lib/pkgconfig:${TARGET_SYSROOT}/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}/pkgconfig:${TARGET_SYSROOT}/usr/share/pkgconfig/)
set(ENV{PKG_CONFIG_SYSROOT_DIR} ${CMAKE_SYSROOT})set(QT_COMPILER_FLAGS "-march=armv8-a")
set(QT_COMPILER_FLAGS_RELEASE "-O2 -pipe")
set(QT_LINKER_FLAGS "-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -Wl,-fuse-ld=gold -ldbus-1")set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)include(CMakeInitializeConfigs)function(cmake_initialize_per_config_variable _PREFIX _DOCSTRING)
if (_PREFIX MATCHES "CMAKE_(C|CXX|ASM)_FLAGS")set(CMAKE_${CMAKE_MATCH_1}_FLAGS_INIT "${QT_COMPILER_FLAGS}")foreach (config DEBUG RELEASE MINSIZEREL RELWITHDEBINFO)if (DEFINED QT_COMPILER_FLAGS_${config})set(CMAKE_${CMAKE_MATCH_1}_FLAGS_${config}_INIT "${QT_COMPILER_FLAGS_${config}}")endif()endforeach()
endif()if (_PREFIX MATCHES "CMAKE_(SHARED|MODULE|EXE)_LINKER_FLAGS")foreach (config SHARED MODULE EXE)set(CMAKE_${config}_LINKER_FLAGS_INIT "${QT_LINKER_FLAGS}")endforeach()
endif()_cmake_initialize_per_config_variable(${ARGV})
endfunction()

然后在qt源码目录执行cmake配置命令

cat arm64_cmake 
cmake ../ -GNinja -DCMAKE_BUILD_TYPE=Release  -DINPUT_opengl=es2 -DQT_BUILD_EXAMPLES=OFF -DQT_BUILD_TESTS=OFF -DQT_HOST_PATH=/home/wangju/develope/qt/qt6Host -DCMAKE_STAGING_PREFIX=/home/wangju/develope/sysroot/opt/prefix -DCMAKE_INSTALL_PREFIX=/home/wangju/develope/sysroot/opt/prefix -DCMAKE_TOOLCHAIN_FILE=/home/wangju/develope/lubancat_toolchain.cmake  -DQT_QMAKE_TARGET_MKSPEC=devices/linux-imx8-g++ -DQT_FEATURE_xcb=OFF -DFEATURE_xcb_xlib=OFF -DQT_FEATURE_xlib=OFF -DQT_FEATURE_eglfs=ON -DQT_FEATURE_wayland=ON  -DFEATURE_qtwebengine_build=OFF 

因为我的sysroot 缺少 X11 相关德 库,所以将xcb 编译选项关闭,-DQT_FEATURE_xcb=OFF -DFEATURE_xcb_xlib=OFF -DQT_FEATURE_xlib=OFF。 开启了-DQT_FEATURE_eglfs=ON -DQT_FEATURE_wayland=ON ,对于 i.MX8QM 这样的嵌入式设备,使用 EGLFS 或 Wayland 作为图形后端比使用传统的 X11/XCB 更加合适,i.MX8QM 具有强大的 Vivante GPU,EGLFS 可以直接利用硬件加速。对于野火文件中的设备文件,我发现qt源码中有 NXP 的 imx8系列设备的模板,我直接用的官方的设备文件。
在这里插入图片描述

#
# qmake configuration for the NXP i.MX8 based boards (64-bit)
#
# The configuration below is set up for running with the fbdev-style
# Vivante graphics stack. (so eglfs with the eglfs_viv backend, no
# direct drm use via eglfs_kms)# Wayland should also be functional. However, when writing Wayland
# *compositors* with Qt, the eglfs backend will have to be switched to
# eglfs_viv_wl by setting the QT_QPA_EGLFS_INTEGRATION environment
# variable.
#
# Below is an example configure line that assumes there is an AArch64
# toolchain and sysroot available in $HOME/imx8. On device Qt is
# expected to be placed under /usr/local/qt514 whereas on the host
# 'make install' will copy the host tools and the target libraries to
# $HOME/imx8/qt5.
#
# ./configure -release -opengl es2 -device linux-imx8-g++ \
#   -device-option CROSS_COMPILE=~/imx8/toolchain/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux- \
#   -sysroot ~/imx8/sysroot \
#   -opensource -confirm-license -make libs -prefix /usr/local/qt514 -extprefix ~/imx8/qt5 -vinclude(../common/linux_device_pre.conf)QMAKE_LIBS_EGL         += -lEGL
QMAKE_LIBS_OPENGL_ES2  += -lGLESv2 -lEGL -lGAL
QMAKE_LIBS_OPENVG      += -lOpenVG -lEGL -lGALIMX8_CFLAGS             = -march=armv8-a -mtune=cortex-a72.cortex-a53 -DLINUX=1 -DEGL_API_FB=1
QMAKE_CFLAGS           += $$IMX8_CFLAGS
QMAKE_CXXFLAGS         += $$IMX8_CFLAGSDISTRO_OPTS += aarch64# Preferred eglfs backend
EGLFS_DEVICE_INTEGRATION = eglfs_vivinclude(../common/linux_arm_device_post.conf)load(qt_config)

最后执行cmake 编译命令、编译完后安装。这里要注意编译所需空间大,如果按照野火教程,先为主机编译qt源码,所需空间较大,建立虚拟机时应该一次性刚给100G 左右的空间,大一点最好,不然在编译或者安装时会出现空间不足导致安装失败的情况。建立好虚拟机后扩展磁盘或者添加磁盘比较麻烦,最好一次给够。

问题记录

1、QT 引用资源文件报错问题(已解决)

2、QT工程 Windows 移动到 Linux ,编译报错问题

3、上传到git的Qt项目在另一台虚拟机再次下载后编译报错问题

4、如何下载目标平台对应版本的编译器

最好是开发板系统和主机系统版本一致。

5、使用在线安装安装qt后创建项目报错,CAMKE找不到Qt6Quick 、QtWidget等组件

依次安装了 C/C++开发工具、OpenGL 依赖、xcb依赖,具体是那个的问题不清楚,具体安装步骤在上文列举了。

6、下载公版arm sysroot ,使用 chroot 为 sysroot 下载必要库文件

1、chroot使用前更换sysroot apt源为国内源
sudo chroot /path/to/arm-sysroot /bin/bash
cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 清空原有内容并写入清华源
cat > /etc/apt/sources.list << EOF
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-security main restricted universe multiverse
EOF
# 更新源列表
apt update# 测试是否能正常下载(可选)
apt install -y vim  # 安装一个小工具验证

使用apt前要将宿主机文件系统挂在到sysroot,否则无网络

2、chroot使用前挂在必要的文件系统,如网络等
sudo mount --bind /dev /path/to/arm-sysroot/dev
sudo mount -t proc /proc /path/to/arm-sysroot/proc
sudo mount --bind /sys /path/to/arm-sysroot/sys
# 使用完毕,卸载
sudo umount /path/to/arm-sysroot/dev
sudo umount /path/to/arm-sysroot/proc
sudo umount /path/to/arm-sysroot/sys
3、chroot 在x86上运行 arm的sysroot,需要下载QEMU 模拟器
sudo apt update
sudo apt install qemu-user-static binfmt-support
sudo cp /usr/bin/qemu-arm-static sysroot/usr/bin/
4、挂载文件系统后没网,可能是sysyroot DNS需要设置
sudo cp /etc/resolv.conf sysroot/etc/
sudo nano sysroot/etc/resolv.conf
nameserver 114.114.114.114
nameserver 8.8.8.8
nameserver 223.5.5.5
5、每次进入前挂载宿主机目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96139.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96139.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql第五天学习 Mysql全局优化总结

Mysql全局优化总结 从上图可以看出SQL及索引的优化效果是最好的&#xff0c;而且成本最低&#xff0c;所以工作中我们要在这块花更多时间。 补充一点配置文件my.ini或my.cnf的全局参数&#xff1a; 假设服务器配置为&#xff1a; CPU&#xff1a;32核内存&#xff1a;64GDISK…

leetcode hot100 二叉搜索树

二叉搜索树的第k小的数class Solution:def kthSmallest(self, root: Optional[TreeNode], k: int) -> int:# 二叉搜索树的中序遍历是 升序排列的&#xff0c; 求第k小的&#xff0c;即第k个数self.res []def fun(root):if not root:returnfun(root.left)if root:self.res.a…

从Sonnet到Opus:一次解决RAG知识库流式输出难题的探索

又到周末&#xff0c;还得消耗消耗 ➡️ anyrouter 上的Claude资源&#xff0c;万一哪天都不能用了&#xff0c;也是浪费。 2025/9/5&#xff0c;Claude AI 的母公司 Anthropic 发布了一项新政策&#xff1a;即日起&#xff0c;Anthropic将不再对中国控股公司及其海外子公司开放…

「数据获取」中国科技统计年鉴(1991-2024)Excel

02、数据详情数据名称&#xff1a;《中国科技统计年鉴》&#xff08;1991-2024年&#xff09;数据年份&#xff1a;1991-202403、数据截图 04、获取方式&#xff08;获取方式看绑定的资源&#xff09;

SimLingo:纯视觉框架下的自动驾驶视觉 - 语言 - 动作融合模型

摘要 本文深入探讨了 SimLingo&#xff0c;一个在自动驾驶领域具有开创性意义的视觉-语言-动作一体化模型。SimLingo 创新性地将自动驾驶、语言理解和指令感知控制整合到一个统一的纯摄像头框架中&#xff0c;显著提升了自动驾驶系统在复杂环境中的感知、决策与执行能力。该模…

第五十四天(SQL注入数据类型参数格式JSONXML编码加密符号闭合复盘报告)

#SQL注入产生原理&#xff1a; 代码中执行的SQL语句存在可控变量导致 #常见SQL注入的利用过程&#xff1a; 1、判断数据库类型 2、判断参数类型及格式 3、判断数据格式及提交 4、判断数据回显及防护 5、获取数据库名&#xff0c;表名&#xff0c;列名 5、获取对应数据及…

VMWare上搭建Hive集群

文章目录1. MySQL安装2. 安装Hive集群3. 使用Hive客户端4. 实战总结本实战在VMware上搭建Hive集群&#xff0c;集成MySQL作为元数据存储&#xff0c;完成Hive环境配置、元数据初始化及HDFS仓库目录创建&#xff0c;实现Hive on Hadoop的SQL查询能力&#xff0c;为大数据分析提供…

Android网络之WIFI技术网络模型概述

文章目录术语1、WLAN与WIFI2、802.11 WIFI无线网络标准演进3、WIFI5、WIFI6和WIFI7的最高速率对比4、WIFI网络中的各个角色&#xff08;元件&#xff09;1&#xff09;网络拓扑架构图5、802.11权威指南1&#xff09;OSI与TCP/IP2&#xff09;IEEE 802.11协议簇介绍3&#xff09…

游戏中的设计模式——第三篇 简单工厂模式

5. 简单工厂模式 5.1 简单工厂模式的定义 简单工厂模式的核心是定义一个创建对象的接口&#xff0c;将对象的创建和本身的业务逻辑分离&#xff0c;降低系统的耦合度&#xff0c;使得两个修改起来相对容易些&#xff0c;当以后实现改变时&#xff0c;只需要修改工厂类即可。 5.…

基于SVN搭建企业内部知识库系统实践

一、准备工作 CentOS 7 服务器&#xff1a;确保你有 root 或 sudo 权限&#xff0c;可以访问该服务器。Windows 客户端&#xff1a;你将需要在 Windows 上安装 TortoiseSVN 客户端来与 SVN 服务器交互。防火墙&#xff1a;确保你的防火墙已开放 3690 端口&#xff0c;用于 SVN…

SQL注入7----(盲注与回显)

一.前言 在我们的注入语句被带入数据库查询但却什么都没有返回的情况我们该怎么办&#xff1f;例如应用程序就会返回 一个"通用的"的页面&#xff0c;或者重定向一个通用页面&#xff08;可能为网站首页&#xff09;。这时&#xff0c;我们之前学习的SQL注入办 法就…

尚硅谷宋红康JVM全套教程(详解java虚拟机)

https://www.bilibili.com/opus/1071553679925968898 案例7&#xff1a;日均百万订单系统JVM参数设置 https://github.com/wei198621/jvm_by_atguigu https://github.com/xftxyz2001/atguigu-jvm/blob/main/JavaYouthdocsJVM/%E7%AC%AC1%E7%AB%A0-JVM%E4%B8%8EJava%E4%BD%…

鸿蒙NEXT开发实战:图片显示、几何图形与自定义绘制详解

探索HarmonyOS NEXT强大的图形渲染能力&#xff0c;从图片展示到自定义绘图 HarmonyOS NEXT作为华为自主研发的操作系统&#xff0c;为开发者提供了一套丰富而强大的图形渲染能力。无论是显示图片、绘制几何图形&#xff0c;还是实现复杂的自定义绘图&#xff0c;鸿蒙都提供了简…

python + Flask模块学习 2 接收用户请求并返回json数据

用到的模块还是flask&#xff0c;用到的类有Flask&#xff0c; request&#xff0c; jsonfiy &#x1f642; 目录 1、GET请求 2、POST请求 1、表单格式 2、json格式 就酱&#xff0c;也比较简单&#xff0c;下一篇说简单的授权&#xff0c;简单来说就是比如用户付费买了服…

国内外常用的免费BUG管理工具选型

帮助用户根据自身情况做决定&#xff0c;比如团队规模、技术能力、是否需要移动端支持等。避免只是罗列工具&#xff0c;而是提供实际选择的维度。 国内外常用的免费BUG管理工具选择非常丰富&#xff0c;从轻量级到功能全面型都有覆盖。我将它们分为几类&#xff0c;并详细介绍…

JavaScript的事件循环机制

1.事件循环的理解JavaScript是单线程的&#xff0c;意味着它一次只能执行一个任务。而事件循环就是去协调在JavaScript环境中运行的同步任务、异步任务(微任务、宏任务)的执行顺序的一种机制。它是 JavaScript 实现单线程非阻塞异步执行的核心。2.事件循环的执行顺序同步任务—…

数据结构——栈(Java)

目录 一定义. 入栈 出栈 二.栈与线性表的关系 三.栈的实现方式 四.链表实现栈 1.结点的API设计 2.栈的API设计 2.1栈的初始化设计 2.2元素入栈 2.3元素出栈 五.括号匹配问题 完整代码展示 答案 一定义. 栈是一种基于先进后出&#xff08;FILO&#xff09;的数据…

科研笔记:数学建模启发的课题研究方法

借鉴数学建模的思路解决科学问题或开展课题研究&#xff0c;核心是将实际问题抽象为数学框架&#xff0c;通过定量分析、逻辑推演和验证优化&#xff0c;实现对问题的精准描述、解释或预测。其本质是“从现实到数学&#xff0c;再从数学回归现实”的迭代过程&#xff0c;适用于…

Agent落地到底选择LangChain 还是 LangGraph

核心概念 LangChain:一个用于构建由大型语言模型驱动的应用程序的框架。它提供了大量的组件和现成的链,旨在简化和标准化应用程序与LLM交互的过程。 LangGraph:一个用于在LangChain之上构建有状态、多参与者的 工作流 的库。它特别擅长处理具有循环、分支和复杂协调的代理(…

ChatGPT下的相关聊天提示词

问&#xff1a;如果我觉得一个子对话里&#xff0c;聊天聊得太多&#xff0c;在这个项目下新开一个子对话&#xff0c;但是不想把上次太多的信息 都复制过来&#xff0c;有没有什么办法关键词&#xff1a;项目、子对话&#xff0c;上下文ChatGPT:有办法的 ✅在 ChatGPT 里&…