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

rk3568系统buildroot开发笔记

编译异常

in from _bz2 import BZ2Compressor, BZ2Decompressor ModuleNotFoundError: No module named ‘_bz2’

sudo apt-get install libbz2-dev
然后删掉
rk356x_bsp_bak/rk356x_bsp/build-iot/buildroot_output/rockchip_rk3568_iot/build/host-python3-3.10.5
重新编译

ERROR: Feature ‘webengine-system-libxml2’ was enabled, but the pre-condition ‘config.unix && libs.webengine-libxml2’ failed.

查看日志,原因的编译xml2的时候没开icu

> main.cpp:4:2: error: #error libxml icu not enabled
>     4 | #error libxml icu not enabled
>       |  ^~~~~

把这个libxml2-2.9.14 项目删了重新编译过就行了

error: there are no arguments to ‘uloc_openAvailableByType’ that depend on a template parameter, so a declaration of ‘uloc_openAvailableByType’ must be available [-fpermissive]

undefined reference to `icu_70::UnicodeSet::getRangeStart(int) const’

uloc_openAvailableByType(ULOC_AVAILABLE_WITH_LEGACY_ALIASES, &status);

编译的时候缺少头文件

去这里把 intl-objects.h 头文件加上

#include “unicode/uloc.h”

加上以后发现还是不行, 看了下文件路径这次编译是来源于系统的头文件,Ubuntu18.04 icu版本低,

下载
icu70 https://github.com/unicode-org/icu/releases/tag/release-70-1
icu-release-70-1/icu4c/source$ ./configure
./configure
make -12
sudo make install
//卸载掉原来系统的icu,不然依赖会错误
apt autoremove libicu-dev

unicode/uchar.h: No such file or directory

和上面一样

web_engine_context.cpp:799:23: error: ‘struct content::ContentMainParams’ has no member named ‘setup_signal_handlers’

2024-02-27T12:10:04 799 | contentMainParams.setup_signal_handlers = false;

    content::ContentMainParams contentMainParams(m_mainDelegate.get());
#if defined(OS_WIN)
    contentMainParams.setup_signal_handlers = false;
    contentMainParams.sandbox_info = staticSandboxInterfaceInfo();
sudo chmod 666 web_engine_context.cpp

CMake support for versions ❤️.17 is deprecated since Meson 0.62.0

wget https://cmake.org/files/v3.18/cmake-3.18.0-rc1-Linux-x86_64.tar.gz
tar zxvf cmake-3.16.7-Linux-x86_64.tar.gz
sudo mv cmake-3.16.7-Linux-x86_64 /opt/cmake-3.16.7
sudo ln -sf /opt/cmake-3.16.7/bin/* /usr/bin/
cmake --version

error: Package requirements (pango >= 1.8.0 pangoxft >= 1.8.0) were not met:

/home/genvict/rk356x_bsp/buildroot/configs/rockchip/x11.config

注释掉openbox

# BR2_PACKAGE_OPENBOX=y   

make: *** No rule to make target ‘xwayland’,

大致原因就是 缺少xwayland 的库 ,这个是一个独立的packet,他在新的buildroot里面可以找到

然后把它拷贝到sdk 的buildroot里面再编译

meson.build:41:2: ERROR: Problem encountered: Failed to find matched library

Message: Building for aarch64|bifrost-g52|g13p0||x11-wayland-gbm|O3

2024-03-28T21:47:35

2024-03-28T21:47:35 …/build-iot/buildroot_output/rockchip_rk3568_iot/build/rockchip-mali-master/meson.build:41:2: ERROR: Problem encountered: Failed to find matched library

找不到 x11-wayland-gbm 这个名字的库,
原厂没有默认编译出来这个库 , 拿wayland-gdm换名字先跳过
因为想要编译Xwayland  ,那么 xorg又一定要开

libgtk3 Can’t find cairo-pdf.h

024-05-24T09:16:03 configure: error:
2024-05-24T09:16:03 *** Can't find cairo-pdf.h. You must build Cairo with the pdf
2024-05-24T09:16:03 *** backend enabled.
BR2_PACKAGE_CAIRO=y
BR2_PACKAGE_CAIRO_PDF=y

ffmpeg 不支持rk硬件加速

# fflpay
BR2_PACKAGE_FFMPEG_FFMPEG=y
BR2_PACKAGE_FFMPEG_GPL=y
BR2_PACKAGE_FFMPEG_NONFREE=y
BR2_PACKAGE_FFMPEG_FFPLAY=y
BR2_PACKAGE_FFMPEG_FFPROBE=y
BR2_PACKAGE_FFMPEG_XCBGRAB=y
BR2_PACKAGE_FFMPEG_AVRESAMPLE=y
BR2_PACKAGE_FFMPEG_POSTPROC=y
#额外追加
BR2_PACKAGE_FFMPEG_EXTRACONF="--enable-version3 --enable-libdrm --enable-rkmpp"

ffmpeg ERROR: rockchip_mpp not found using pkg-config

先注释掉, 后面再打开重新编译, 属于一个 编译先后顺序的问题 , 待优化
BR2_PACKAGE_FFMPEG_EXTRACONF="--enable-version3 --enable-libdrm --enable-rkmpp"

qt5x11extras安装失败

package/libgtk3/Config.in:15:error: recursive dependency detected!

注释了libgtk3的服务编译

然后整个系统重新编译

qt5base编译异常

多线程编译导致的冲突, 再运行异常就行

运行异常

hdmi插拔变蓝屏

eth0 被重命名成了 FE0

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth0", NAME="FE0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth1", NAME="FE1"

删除这个规则


#!/bin/bash

ROOT_DIR="$SDK_DIR/build-$VANXOAK_CUSTOMER_NAME/buildroot_output/rockchip_rk3568_$VANXOAK_CUSTOMER_NAME/target"

cd $ROOT_DIR
rm usr/lib/udev/rules.d/70-persistent-net.rules

exit 0

ubuntu22.04的 用户密码 哈希在新系统用不了

通过搜索mkpasswd了解到,他们的生成逻辑

2024-03-16T18:07:09 /usr/bin/sed -i -e s,^root:[^:]*:,root:"`/home/genvict/rk356x_bsp/build-iot/buildroot_output/rockchip_rk3568_iot/host/bin/mkpasswd -m "sha-256" "rockchip"`":, /home/genvict/rk356x_bsp/build-iot/buildroot_output/rockchip_rk3568_iot/target/etc/shadow

这个命令是使用 sed 工具在文件 /etc/shadow 中替换 root 用户的密码哈希值。

它使用了 mkpasswd 命令生成新的哈希值,然后将其插入到 /etc/shadow 文件中。

这样可以更新 root 用户的密码。

根据命令中的参数 -e s,root:[:]*:,root:“/home/genvict/rk356x_bsp/build-iot/buildroot_output/rockchip_rk3568_iot/host/bin/mkpasswd -m “sha-256” “rockchip””:,可以看出密码是由 mkpasswd 命令生成的,使用 SHA-256 算法,密码参数为 “rockchip”。

调试过程

root@genvict:/home/genvict/rk356x_bsp# /home/genvict/rk356x_bsp/build-iot/buildroot_output/rockchip_rk3568_iot/host/bin/mkpasswd -m "sha-256" "rockchip"
$5$Io6X2mN7E$JPD0hMz4yfaShTVLhdVEUBTbzhh/28Lw91h4HVm.xrB
root@genvict:/home/genvict/rk356x_bsp# /home/genvict/rk356x_bsp/build-iot/buildroot_output/rockchip_rk3568_iot/host/bin/mkpasswd -m "sha-256" "root"
$5$K335JxjbL$RyZFucOlv1Rw93D0NPe6IVFA63JM2xwuP0eeimkh/V.

# 注意他每次运行的结果都不一样

开机加载eth业务

buildroot 编译出来的systemd默认用 /etc/systemd/network/01-ETH0-static.network 这种方式加载网卡信息

[Match]
Name=eth0  # 根据你的实际网卡名称修改

[Network]
Address=192.168.1.100/24  # 设置静态 IP 地址和子网掩码
Gateway=192.168.1.1  # 设置网关地址
DNS=8.8.8.8  # 设置 DNS 服务器地址

如果要支持旧版那种方式 /etc/network/interfaces.d/eth0

需要启用这些服务 , 以及他的一类关联

[Unit]
Description=Raise network interfaces
Documentation=man:interfaces(5)
DefaultDependencies=no
Requires=ifupdown-pre.service
Wants=network.target
After=local-fs.target network-pre.target apparmor.service systemd-sysctl.service systemd-modules-load.service ifupdown-pre.service
Before=network.target shutdown.target network-online.target
Conflicts=shutdown.target

[Install]
WantedBy=multi-user.target
WantedBy=network-online.target

[Service]
Type=oneshot
EnvironmentFile=-/etc/default/networking
ExecStart=/sbin/ifup -a --read-environment
ExecStop=/sbin/ifdown -a --read-environment --exclude=lo
RemainAfterExit=true
TimeoutStartSec=5min

切换Xorg异常 Failed to load /usr/lib/xorg/modules/drivers/modesetting_drv.so: /usr/lib/xorg/modules/drivers/modesetting_drv.so: undefined symbol: glamor_egl_create_textured_pixmap

看依赖是没开GLAMOR_HAS_GBM, 但其实有开,原因不明

最后从原厂debian的deb包里面各种偷龙转凤,根本原因应该是依赖问题

具体是哪个 没仔细找

weston启动异常

参考https://wayland.pages.freedesktop.org/weston/toc/running-weston.html#running-weston-from-a-systemd-service

weston
Date: 2024-03-29 CST
[14:46:37.241] weston 11.0.1
               https://wayland.freedesktop.org
               Bug reports to: https://gitlab.freedesktop.org/wayland/weston/issues/
               Build: 11.0.1
[14:46:37.242] Command line: weston
[14:46:37.242] OS: Linux, 4.19.232, #2 SMP Sat Mar 16 18:54:51 CST 2024, aarch64
[14:46:37.242] Flight recorder: enabled
[14:46:37.242] warning: XDG_RUNTIME_DIR "/var/run" is not configured
correctly.  Unix access mode must be 0700 (current mode is 0755),
and must be owned by the user UID 0 (current owner is UID 0).
Refer to your distribution on how to get it, or
http://www.freedesktop.org/wiki/Specifications/basedir-spec
on how to implement it.
/etc/xdg/weston/weston.ini.d/02-desktop.ini: "shell/background-image" from "/usr/share/weston/pattern.png" to "/usr/share/backgrounds/background_linux.jpg"
/etc/xdg/weston/weston.ini.d/02-desktop.ini: "shell/background-type" from "tile" to "scale"
/etc/xdg/weston/weston.ini.d/02-desktop.ini: "shell/panel-position" from "top" to "bottom"
[14:46:37.245] Using config file '/etc/xdg/weston/weston.ini'
[14:46:37.246] Output repaint window is 7 ms maximum.
[14:46:37.248] Loading module '/usr/lib/libweston-11/drm-backend.so'
[14:46:37.261] initializing drm backend
[14:46:37.261] Entering mirror mode.
[14:46:37.261] Trying logind launcher...
[14:46:37.262] logind: cannot find systemd session for uid: 0 -61
[14:46:37.262] logind: cannot setup systemd-logind helper error: (No data available), using legacy fallback
[14:46:37.262] fatal: your system should either provide the logind D-Bus API, or use seatd.
[14:46:37.262] fatal: failed to create compositor backend
Internal warning: debug scope 'drm-backend' has not been destroyed.

ffplay运行异常Could not initialize SDL - x11 not available

SDL库没支持X11

需要先删除 sdl ffmpeg相关的编译再重新编译

BR2_PACKAGE_FFMPEG_FFMPEG=y
BR2_PACKAGE_FFMPEG_GPL=y
BR2_PACKAGE_FFMPEG_NONFREE=y
BR2_PACKAGE_FFMPEG_FFPLAY=y
BR2_PACKAGE_FFMPEG_FFPROBE=y
BR2_PACKAGE_FFMPEG_XCBGRAB=y
BR2_PACKAGE_FFMPEG_AVRESAMPLE=y
BR2_PACKAGE_FFMPEG_POSTPROC=y
BR2_PACKAGE_SDL2_X11=y
BR2_PACKAGE_SDL2_KMSDRM=y
BR2_PACKAGE_SDL2_OPENGLES=y
BR2_PACKAGE_SDL2_GFX=y
BR2_PACKAGE_SDL2_IMAGE=y
BR2_PACKAGE_SDL2_MIXER=y
BR2_PACKAGE_SDL2_NET=y
BR2_PACKAGE_SDL2_TTF=y

PulseAudio 运行异常

systemctl stop pulseaudio
  1. 然后,创建所需的 cookie 文件。你可以使用 touch 命令来创建空的文件,如果文件已经存在,touch 命令不会做任何事情:
touch /var/run/pulse/.config/pulse/cookie
touch /var/run/pulse/.pulse-cookie
  1. 确保 PulseAudio 有足够的权限来访问这些文件。你可以使用 chown 命令来改变文件的所有者,假设你的 PulseAudio 服务以 ‘pulse’ 用户运行:
chown pulse:pulse /var/run/pulse/.config/pulse/cookie
chown pulse:pulse /var/run/pulse/.pulse-cookie
  1. 最后,重新启动 PulseAudio 服务:
systemctl start pulseaudio

amixer 运行异常

ALSA lib pulse.c:242:(pulse_connect) PulseAudio: Unable to connect: Access denied

amixer: Mixer attach default error: Connection refused

确保 PulseAudio 服务正在运行

在命令行中输入 pulseaudio --check,如果没有返回任何东西,那就表示 PulseAudio 服务正在运行。
如果返回错误信息,那就代表 PulseAudio 服务没有运行,你可以尝试使用 pulseaudio --start 命令启动它。

检查用户是否有权限访问 PulseAudio

在命令行中输入 groups 查看当前用户所在的用户组。如果列表中没有 pulse-access 或 audio,那就表示当前用户没有访问 PulseAudio 的权限。
你可以使用 usermod -aG pulse-access your_username 或 usermod -aG audio your_username 命令把用户添加到这些组。

如果以上方法都不行,你可以尝试使用 ALSA 而不是 PulseAudio。

webengine是否支持webrtc

测试方案

用程序访问https://zegodev.github.io/webrtcDemo-js/webrtccheck/index.html#

点击测试

程序源码

需要针对自己的文件路径做调整

TEMPLATE = app
QT = core gui
SOURCES = main.cpp

QT += widgets 
QT += webengine 
QT += webenginewidgets
INCLUDEPATH += /home/genvict/rk356x_bsp/build-iot/buildroot_output/rockchip_rk3568_iot/host/aarch64-buildroot-linux-gnu/sysroot/usr/include/qt5/QtWebEngineWidgets
#include <QApplication>
#include <QWebEngineView>
#include <QWebEngineProfile>
#include <QWebEnginePage>
#include <QWebEngineSettings>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QWebEngineView* view = new QWebEngineView();
    QWebEngineProfile* profile = new QWebEngineProfile(view);
    QWebEnginePage* page = new QWebEnginePage(profile, view);

    QObject::connect(profile, &QWebEngineProfile::downloadRequested, [](QWebEngineDownloadItem* download) {
        download->accept();
    });

    QObject::connect(page, &QWebEnginePage::featurePermissionRequested, [page](const QUrl &securityOrigin, QWebEnginePage::Feature feature) {
        if (feature == QWebEnginePage::MediaAudioCapture ||
            feature == QWebEnginePage::MediaVideoCapture) {
            page->setFeaturePermission(securityOrigin, feature, QWebEnginePage::PermissionGrantedByUser);
        }
    });


    QWebEngineSettings::globalSettings()->setAttribute(QWebEngineSettings::JavascriptEnabled, true);

    view->setPage(page);

    QString url = "https://zegodev.github.io/webrtcDemo-js/webrtccheck/index.html#";
    if (argc > 1) {
         if (QString(argv[1]) != "--no-sandbox") {
            url = argv[1];
        }
    }

    view->load(QUrl(url));
    QObject::connect(view, &QWebEngineView::loadFinished, [view](bool ok) {
        if (ok) {
            view->show();
        } else {
            // Handle the error
        }
    });

    return app.exec();
}

#!/bin/bash

source  /home/genvict/rk356x_bsp/build-iot/buildroot_output/rockchip_rk3568_iot/host/environment-setup 

qmake


make


解决方法

hdmi 原生接口空载上电无显示, 默认激活

enum drm_connector_status dw_hdmi_phy_read_hpd(struct dw_hdmi *hdmi,
					       void *data)
{
	//修改为默认连接状态
	return connector_status_connected;

	return hdmi_readb(hdmi, HDMI_PHY_STAT0) & HDMI_PHY_HPD ?
		connector_status_connected : connector_status_disconnected;
}

系统默认功放被USB摄像头插入后替换

固定rockchiprk809co为默认声卡

#!/bin/bash

# 使用 awk 从 /proc/asound/rockchiprk809co/pcm0p/info 文件中获取 id
id=$(cat /proc/asound/rockchiprk809co/pcm0p/info | awk 'NR==1 {print $2}')

# 将 id 写入 /etc/asound.conf 文件
echo "defaults.ctl.card $id" > /etc/asound.conf
echo "defaults.pcm.card $id" >> /etc/asound.conf
echo "defaults.timer.card $id" >> /etc/asound.conf

amixer cset name='Playback Path' SPK_HP

ldconfig not find

config BR2_PACKAGE_GLIBC_UTILS
	bool "Install glibc utilities"
	help
	  Enabling this option will compile and install the getconf,
	  ldconfig, ldd and locale glibc utilities for the target.

Systemd 系统环境变量加载

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See systemd-system.conf(5) for details.

[Manager]
#LogLevel=info
#LogTarget=journal-or-kmsg
#LogColor=yes
#LogLocation=no
#DumpCore=yes
#ShowStatus=yes
#CrashChangeVT=no
#CrashShell=no
#CrashReboot=no
#CtrlAltDelBurstAction=reboot-force
#CPUAffinity=1 2
#NUMAPolicy=default
#NUMAMask=
#RuntimeWatchdogSec=0
#RebootWatchdogSec=10min
#ShutdownWatchdogSec=10min
#KExecWatchdogSec=0
#WatchdogDevice=
#CapabilityBoundingSet=
#NoNewPrivileges=no
#SystemCallArchitectures=
#TimerSlackNSec=
#StatusUnitFormat=description
#DefaultTimerAccuracySec=1min
#DefaultStandardOutput=journal
#DefaultStandardError=inherit
#DefaultTimeoutStartSec=90s
DefaultTimeoutStopSec=5s
#DefaultTimeoutAbortSec=
#DefaultRestartSec=100ms
#DefaultStartLimitIntervalSec=10s
#DefaultStartLimitBurst=5
#DefaultEnvironment=
#DefaultCPUAccounting=no
#DefaultIOAccounting=no
#DefaultIPAccounting=no
#DefaultBlockIOAccounting=no
#DefaultMemoryAccounting=yes
#DefaultTasksAccounting=yes
#DefaultTasksMax=
#DefaultLimitCPU=
#DefaultLimitFSIZE=
#DefaultLimitDATA=
#DefaultLimitSTACK=
#DefaultLimitCORE=
#DefaultLimitRSS=
#DefaultLimitNOFILE=1024:524288
#DefaultLimitAS=
#DefaultLimitNPROC=
#DefaultLimitMEMLOCK=
#DefaultLimitLOCKS=
#DefaultLimitSIGPENDING=
#DefaultLimitMSGQUEUE=
#DefaultLimitNICE=
#DefaultLimitRTPRIO=
#DefaultLimitRTTIME=

DefaultEnvironment=DISPLAY=:0 QT_QPA_PLATFORM=xcb QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/aarch64-linux-gnu/qt5/plugins/platforms QT_QPA_FONTDIR=/usr/share/fonts QML2_IMPORT_PATH=/usr/lib/aarch64-linux-gnu/qt5/qml QTWEBENGINEPROCESS_PATH=/usr/lib/aarch64-linux-gnu/qt5/libexec/QtWebEngineProcess

journal日志切割

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See journald.conf(5) for details.

[Journal]
Storage=auto
Compress=yes
Seal=yes
#SplitMode=uid
SyncIntervalSec=1m
#RateLimitIntervalSec=30s
#RateLimitBurst=10000
SystemMaxUse=250M
#SystemKeepFree=
SystemMaxFileSize=50M
#SystemMaxFiles=100
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=yes
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg
#LineMax=48K
#ReadKMsg=yes

用户环境变量加载

export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/genvict/bin"
export LD_LIBRARY_PATH="/usr/local/lib"

export DISPLAY=:0

export QT_QPA_PLATFORM=xcb
export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/qt/plugins/platforms
export QT_QPA_FONTDIR=/usr/share/fonts
export QML2_IMPORT_PATH=/usr/qml
export QTWEBENGINEPROCESS_PATH=/usr/libexec/QtWebEngineProcess

libqxcb库缺失

qt5x11extras 没有编译出来

aplay -l 没有rockchiprk809co声卡

**** List of PLAYBACK Hardware Devices ****

card 0: rockchiphdmi [rockchip,hdmi], device 0: rockchip,hdmi i2s-hifi-0 [rockchip,hdmi i2s-hifi-0]

Subdevices: 1/1

Subdevice #0: subdevice #0

内核dts没开

修改分区表后系统死机

TIME ] Timed out waiting for device /dev/disk/by-partlabel/oem.

[DEPEND] Dependency failed for /oem.

[DEPEND] Dependency failed for File…on /dev/disk/by-partlabel/oem.

[ TIME ] Timed out waiting for device ▒▒ev/disk/by-partlabel/userdata.

[DEPEND] Dependency failed for File…ev/disk/by-partlabel/userdata.

[DEPEND] Dependency failed for /userdata.

去/etc/fstab 去掉 oem 和 userdata

system开机加载,他们发现缺失所以卡顿了


http://www.kler.cn/a/305134.html

相关文章:

  • ubuntu cmake CPack将第三方库进行打包
  • 实战指南:理解 ThreadLocal 原理并用于Java 多线程上下文管理
  • 障碍检测与避障控制 ROS2机器人
  • 《重学Java设计模式》之 原型模式
  • vscode Markdown
  • 天地图入门|标注|移动飞行|缩放,商用地图替换
  • Playwright 自动化验证码教程
  • 【计算机网络 - 基础问题】每日 3 题(三)
  • 基于鸿蒙API10的RTSP播放器(九:进度总结)
  • 进程的基本概念
  • C#中判断socket是否已断开的方法
  • CHARLS数据库系列教程(2)---数据清洗、拼接和整理(1)
  • 数据中台建设(六)—— 数据开发-提取数据价值
  • 第1步win10宿主机与虚拟机通过NAT共享上网互通
  • 系统架构设计师教程 第5章 5.3 系统分析与设计 笔记
  • 【chrome插件】只需一键,浏览器的书签信息就可以导出成为CSV了
  • OpenCV进行灰度变换
  • 打包好的jar包,如何部署在服务器?——详细教程
  • 死锁例子学习
  • 汽车车门的美观与功能:矫平工艺的精细修复
  • VUE + NODE 历史版本安装
  • Python办公自动化案例(二):对比两个Excel数据内容并标出不同
  • 大模型探索式轨迹优化:基于试错的自主智能体学习新方法
  • iPhone 16和iPhone 16 Pro将发布时缺少这一关键功能
  • LabVIEW编程快速提升的技术
  • linux 图形如何设置x11 为主要图形