笔记移除

This commit is contained in:
2026-07-09 17:32:10 +08:00
parent 8bb5179f23
commit 888f5768cd
155 changed files with 0 additions and 16194 deletions
-1
View File
@@ -1 +0,0 @@
{}
-1
View File
@@ -1 +0,0 @@
{}
-33
View File
@@ -1,33 +0,0 @@
{
"file-explorer": true,
"global-search": true,
"switcher": true,
"graph": true,
"backlink": true,
"canvas": true,
"outgoing-link": true,
"tag-pane": true,
"footnotes": false,
"properties": true,
"page-preview": true,
"daily-notes": true,
"templates": true,
"note-composer": true,
"command-palette": true,
"slash-command": false,
"editor-status": true,
"bookmarks": true,
"markdown-importer": false,
"zk-prefixer": false,
"random-note": false,
"outline": true,
"word-count": true,
"slides": false,
"audio-recorder": false,
"workspaces": false,
"file-recovery": true,
"publish": false,
"sync": true,
"bases": true,
"webviewer": false
}
-196
View File
@@ -1,196 +0,0 @@
{
"main": {
"id": "e3a3ab3485c9f6c5",
"type": "split",
"children": [
{
"id": "019ec763c5162ba5",
"type": "tabs",
"children": [
{
"id": "abda1570a766a2ff",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "动态库的基本原理.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "动态库的基本原理"
}
}
]
}
],
"direction": "vertical"
},
"left": {
"id": "62ea961a32f824d3",
"type": "split",
"children": [
{
"id": "e58255cf0a4d77f2",
"type": "tabs",
"children": [
{
"id": "1ada4aeafe12db51",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "文件列表"
}
},
{
"id": "2bf52592f46bc4c6",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "卸载",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "搜索"
}
},
{
"id": "0640a1530d1cbd86",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "书签"
}
}
],
"currentTab": 1
}
],
"direction": "horizontal",
"width": 300
},
"right": {
"id": "a084bc856166a5ed",
"type": "split",
"children": [
{
"id": "5d4644ea9ad84256",
"type": "tabs",
"children": [
{
"id": "6a32ed2930d8c2b9",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"file": "动态库的基本原理.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "动态库的基本原理 的反向链接列表"
}
},
{
"id": "d4cb71a80da5e672",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"file": "动态库的基本原理.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "动态库的基本原理 的出链列表"
}
},
{
"id": "986a53397ad52f50",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-tags",
"title": "标签"
}
},
{
"id": "70aa23e973d54e4d",
"type": "leaf",
"state": {
"type": "all-properties",
"state": {
"sortOrder": "frequency",
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-archive",
"title": "添加笔记属性"
}
},
{
"id": "49f624e60b47c8c1",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "动态库的基本原理.md",
"followCursor": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-list",
"title": "动态库的基本原理 的大纲"
}
}
]
}
],
"direction": "horizontal",
"width": 300,
"collapsed": true
},
"left-ribbon": {
"hiddenItems": {
"switcher:打开快速切换": false,
"graph:查看关系图谱": false,
"canvas:新建白板": false,
"daily-notes:打开/创建今天的日记": false,
"templates:插入模板": false,
"command-palette:打开命令面板": false,
"bases:新建数据库": false
}
},
"active": "2bf52592f46bc4c6",
"lastOpenFiles": [
"0_math/组合数.md",
"0_qt/Butterfly-QWidget.png",
"ssh/虚拟机网络模式的区别.md",
"ssh/远程调试环境/ubuntu查找环境.md",
"动态库的基本原理.md",
"符号服务器.md"
]
}
@@ -1,25 +0,0 @@
wyc@DESKTOP-LARNL32 MINGW64 ~/binutils-2.9.1
$./configure --help
Usage: configure [OPTIONS] [HOST]
Options: [defaults in brackets]
--prefix=MYDIR install into MYDIR [/usr/local]
--exec-prefix=MYDIR install host-dependent files into MYDIR [/usr/local]
--help print this message [normal config]
--build=BUILD configure for building on BUILD [BUILD=HOST]
--host=HOST configure for HOST [determined via config.guess]
--norecursion configure this directory only [recurse]
--program-prefix=FOO prepend FOO to installed program names [""]
--program-suffix=FOO append FOO to installed program names [""]
--program-transform-name=P transform installed names by sed pattern P [""]
--site=SITE configure with site-specific makefile for SITE
--srcdir=DIR find the sources in DIR [. or ..]
--target=TARGET configure for TARGET [TARGET=HOST]
--tmpdir=TMPDIR create temporary files in TMPDIR [/tmp]
--nfp configure for software floating point [hard float]
--with-FOO, --with-FOO=BAR package FOO is available (parameter BAR)
--without-FOO package FOO is NOT available
--enable-FOO, --enable-FOO=BAR include feature FOO (parameter BAR)
--disable-FOO do not include feature FOO
Where HOST and TARGET are something like "sparc-sunos", "mips-sgi-irix5", etc.
@@ -1,88 +0,0 @@
#!/bin/bash
# 此文件记录了交叉编译构建gdb的过程
export BASE_DIR=$(pwd)
export SYSROOT=/opt/rootfs
export CC=/opt/pkg/tools/Xilinx/Vitis/2022.2/gnu/aarch32/lin/gcc-arm-linux-gnueabi/bin/arm-linux-gnueabihf-gcc
export CXX=/opt/pkg/tools/Xilinx/Vitis/2022.2/gnu/aarch32/lin/gcc-arm-linux-gnueabi/bin/arm-linux-gnueabihf-g++
export AR=/opt/pkg/tools/Xilinx/Vitis/2022.2/gnu/aarch32/lin/gcc-arm-linux-gnueabi/bin/arm-linux-gnueabihf-ar
export gmp_ver="6.3.0"
export mpfr_ver="4.2.2"
export expat_ver="2.6.0"
export expat_url="https://github.com/libexpat/libexpat/releases/download/R_2_6_0/expat-2.6.0.tar.gz"
export gdb_ver="11.2"
export INSTALL_ROOT_DIR="$(pwd)/sysroot"
# 浮点数运算库源码
cd "$BASE_DIR" || exit
wget -N "https://mirrors.kernel.org/gnu/gmp/gmp-$gmp_ver.tar.xz"
tar -xf "$BASE_DIR/gmp-$gmp_ver.tar.xz"
cd "$BASE_DIR/gmp-$gmp_ver" || exit
./configure \
--prefix="$BASE_DIR/install/gmp" \
--host=arm-linux-gnueabihf \
--with-sysroot="$SYSROOT"
make -j$(nproc)
make install
# 多精度浮点数运算库源码
cd "$BASE_DIR" || exit
wget -N "https://mirrors.kernel.org/gnu/mpfr/mpfr-$mpfr_ver.tar.xz"
tar -xf "$BASE_DIR/mpfr-$mpfr_ver.tar.xz"
cd "$BASE_DIR/mpfr-$mpfr_ver" || exit
./configure \
--prefix="$BASE_DIR/install/mpfr" \
--host=arm-linux-gnueabihf \
--with-gmp="$BASE_DIR/install/gmp" \
--with-sysroot="$SYSROOT"
make -j$(nproc)
make install
# xml解析库
cd "$BASE_DIR" || exit
wget -N "$expat_url"
tar -xf "$BASE_DIR/expat-$expat_ver.tar.gz"
cd "$BASE_DIR/expat-$expat_ver" || exit
./configure \
--host=arm-linux-gnueabihf \
--prefix="$BASE_DIR/install/expat" \
--enable-shared \
--enable-static \
--with-sysroot="$SYSROOT"
make -j$(nproc)
make install
# gdb
cd "$BASE_DIR" || exit
wget -N "https://mirrors.kernel.org/gnu/gdb/gdb-$gdb_ver.tar.xz"
tar -xf "$BASE_DIR/gdb-$gdb_ver.tar.xz"
cd "$BASE_DIR/gdb-$gdb_ver" || exit
./configure \
--prefix="$BASE_DIR/install/gdb" \
--with-gmp="$BASE_DIR/install/gmp" \
--with-mpfr="$BASE_DIR/install/mpfr" \
--with-expat="$BASE_DIR/install/expat" \
--enable-targets=all \
--enable-gdbserver \
--host=arm-linux-gnueabihf \
--with-sysroot="$SYSROOT" \
--disable-sim \
CFLAGS="-I$BASE_DIR/install/gmp/include -L$BASE_DIR/install/gmp/lib" \
CXXFLAGS="-I$BASE_DIR/install/gmp/include -L$BASE_DIR/install/gmp/lib"
# 编译和安装
make -j$(nproc)
make install
mkdir $INSTALL_ROOT_DIR
cp -r "$BASE_DIR/install/gdb/"* "$INSTALL_ROOT_DIR"
cp -r "$BASE_DIR/install/gmp/"* "$INSTALL_ROOT_DIR"
cp -r "$BASE_DIR/install/mpfr/"* "$INSTALL_ROOT_DIR"
cp -r "$BASE_DIR/install/expat/"* "$INSTALL_ROOT_DIR"
#export LD_LIBRARY_PATH=/home/root/sysroot/lib:$LD_LIBRARY_PATH
#sudo cp -a sysroot/* /
@@ -1,46 +0,0 @@
#!/bin/bash
# https://sourceware.org/binutils/
# https://sourceware.org/binutils/docs/
export INSTALL_ROOT_DIR="$(pwd)/sysroot"
export BASE_DIR=$(pwd)
export binutils_ver="2.9.1"
# wget -N "https://ftp.gnu.org/gnu/binutils/binutils-2.38.tar.xz"
# wget -N "https://mirrors.kernel.org/gnu/binutils/binutils-2.38.tar.xz"
https://mirrors.kernel.org/gnu/binutils/binutils-2.9.1.tar.gz
cd "$BASE_DIR" || exit
#wget -N "https://ftp.gnu.org/gnu/binutils/binutils-$binutils_ver.tar.xz"
wget -N "https://mirrors.kernel.org/gnu/binutils/binutils-$binutils_ver.tar.gz"
tar -xzf "$BASE_DIR/binutils-$binutils_ver.tar.gz"
cd "$BASE_DIR/binutils-$binutils_ver" || exit
./configure --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
./configure --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
./configure \
--prefix="$BASE_DIR/install/binutils" \ # 安装路径
--host=arm-linux-gnueabihf \ # 设置目标平台架构为 ARM
--with-sysroot="$SYSROOT" \ # 设置 sysroot 路径
--disable-nls \ # 禁用本地化支持
--enable-gold \ # 启用 gold 链接器
--enable-ld=default \ # 使用默认的链接器
--enable-plugins \ # 启用插件
--disable-werror # 不将警告当作错误处理
$./configure --host=arm-none-eabi --target=arm-none-eabi --prefix=/usr/local/binutils
make -j$(nproc)
make install
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.14.8.tar.xz
# "git clone --branch v1.3.1 --depth 1 https://github.com/madler/zlib.git zlib"
git clone --branch v6.15 --depth 1 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git linux
@@ -1,16 +0,0 @@
此目录记录了,编译常用linux工具的脚本
注意下载路径用 mirrors https://mirrors.kernel.org 可以下载到旧版本的源码
这些脚本都是直接编译
export CC=/usr/bin/gcc-13
export CXX=/usr/bin/g++-13
export INSTALL_DIR=/home/alientek/gmp
export CC=/opt/pkg/tools/Xilinx/Vitis/2022.2/gnu/aarch32/lin/gcc-arm-linux-gnueabi/bin/arm-linux-gnueabihf-gcc
export CXX=/opt/pkg/tools/Xilinx/Vitis/2022.2/gnu/aarch32/lin/gcc-arm-linux-gnueabi/bin/arm-linux-gnueabihf-g++
https://ftp.gnu.org/gnu
https://mirrors.kernel.org
@@ -1,21 +0,0 @@
执行configure的文档
https://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.72/autoconf.html
18.6.3 Hosts and Cross-Compilation
重点 指定目标三元组
https://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.72/autoconf.html#Specifying-Target-Triplets
https://sourceforge.net/projects/gnuwin32/
https://www.gnu.org/software/binutils/
https://sourceware.org/binutils/docs/
https://blog.csdn.net/qq_44823010/article/details/127214340
@@ -1,134 +0,0 @@
第一步安装apt-offline
apt-offline-1.8.6.zip
cd apt-offline-1.8.6
sudo python setup.py install //离线编译安装apt-offlinepython不完整
// 查看依赖
sudo apt-cache depends apt-offline
// 下载依赖
sudo apt-get download apt-offline python3-magic
// 分为三类命令 set 离线电脑生成,get在线电脑生成,install反过来给离线电脑下载。
usage: apt-offline [-h] [--verbose] [--quiet] [-v] {set,get,install} ...
// 核心是set命令,标明要安装什么文件
alientek@alientek-virtual-machine:~$ apt-offline set --help
usage: apt-offline set [-h] [--verbose] [--quiet] [--simulate] [--install-packages [PKG [PKG ...]]]
[--install-src-packages [SOURCE PKG [SOURCE PKG ...]]] [--src-build-dep] [--release release_name] [--update]
[--upgrade] [--upgrade-type upgrade] [--generate-changelog] [--apt-backend apt-get]
apt-offline.sig
positional arguments:
apt-offline.sig Generate a signature file
optional arguments:
-h, --help show this help message and exit
--verbose Enable verbose messages
--quiet Enable quiet mode
--simulate Just simulate. Very helpful when debugging
--install-packages [PKG [PKG ...]]
Packages that need to be installed
--install-src-packages [SOURCE PKG [SOURCE PKG ...]]
Source Packages that need to be installed
--src-build-dep Install Build Dependency packages for requested source packages
--release release_name
Release target to install packages from
--update Generate Signature to update APT Database
--upgrade Generate Signature of packages to be upgraded
--upgrade-type upgrade
Type of upgrade to do. Use one of upgrade, dist-upgrade, dselect-ugprade
--generate-changelog Generate changelog of the version to be downloaded
--apt-backend apt-get
APT backend to use. One of: apt, apt-get, python-apt
// get 命令从 上网电脑安装
alientek@alientek-virtual-machine:~$ apt-offline get --help
usage: apt-offline get [-h] [--verbose] [--quiet] [--socket-timeout 30]
[-d apt-downloads] [-s /var/cache/apt/archives/]
[--no-checksum] [-t 1]
[--bundle apt-offline-bundle.zip] [--bug-reports]
[--proxy-host PROXY_HOST] [--proxy-port PROXY_PORT]
[--https-cert-file HTTPS_CERT_FILE]
[--https-key-file HTTPS_KEY_FILE]
[--http-basicauth https://username:password@hostname.com/]
[--disable-cert-check]
apt-offline.sig
positional arguments:
apt-offline.sig Get apt-offline data
optional arguments:
-h, --help show this help message and exit
--verbose Enable verbose messages
--quiet Enable quiet mode
--socket-timeout 30 Set Socket Timeout
-d apt-downloads, --download-dir apt-downloads
Folder path to save files to
-s /var/cache/apt/archives/, --cache-dir /var/cache/apt/archives/
Cache folder to search for
--no-checksum Do not validate checksum of downloaded files
-t 1, --threads 1 Number of threads to spawn
--bundle apt-offline-bundle.zip
Bundle output data to a file
--bug-reports Fetch bug reports from the BTS
--proxy-host PROXY_HOST
Proxy Host to use
--proxy-port PROXY_PORT
Proxy port number to use
--https-cert-file HTTPS_CERT_FILE
Certificate file for https client authentication
--https-key-file HTTPS_KEY_FILE
Certificate key for https client authentication
--http-basicauth https://username:password@hostname.com/
A user/password encoded URL. Passwords with special
characters should be percent encoded
--disable-cert-check Disable Certificate check on https connections
// install
alientek@alientek-virtual-machine:~$ apt-offline install --help
usage: apt-offline install [-h] [--verbose] [--quiet] [--simulate] [--install-src-path INSTALL_SRC_PATH]
[--extra-keyring /etc/apt/keyring/] [--skip-bug-reports] [--skip-changelog] [--allow-unauthenticated]
[--strict-deb-check]
apt-offline-download.zip | apt-offline-download/
positional arguments:
apt-offline-download.zip | apt-offline-download/
Install apt-offline data, a bundle file or a directory
optional arguments:
-h, --help show this help message and exit
--verbose Enable verbose messages
--quiet Enable quiet mode
--simulate Just simulate. Very helpful when debugging
--install-src-path INSTALL_SRC_PATH
Install src packages to specified path.
--extra-keyring /etc/apt/keyring/
Extra Keyring path to include for.
--skip-bug-reports Skip the bug report check
--skip-changelog Skip display of changelog
--allow-unauthenticated
Ignore apt gpg signatures mismatch
--strict-deb-check Perform strict checksum validaton for downloaded .deb files
[Apt-offline离线安装指南](https://zhuanlan.zhihu.com/p/583446570)
// 完整流程
apt-offline set --install-packages vim git xxx.sig
apt-offline get xxx.sig --bundle result.zip
apt-offline install result.zip
// 完整教程
https://github.com/rickysarraf/apt-offline
make build
make install
make clean
@@ -1,127 +0,0 @@
https://valgrind.org/downloads/current.html 下载压缩包
sudo tar xvf ./valgrind-3.25.1.tar.bz2
cd valgrind-3.25.1
sudo ./configure
make
make install
heco@heco:~/valgrind/valgrind-3.25.1$ ./configure --help
'configure' configures Valgrind 3.25.1 to adapt to many kinds of systems.
Usage: ./configure [OPTION]... [VAR=VALUE]...
To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE. See below for descriptions of some of the useful variables.
Defaults for the options are specified in brackets.
Configuration:
-h, --help display this help and exit
--help=short display options specific to this package
--help=recursive display the short help of all the included packages
-V, --version display version information and exit
-q, --quiet, --silent do not print 'checking ...' messages
--cache-file=FILE cache test results in FILE [disabled]
-C, --config-cache alias for '--cache-file=config.cache'
-n, --no-create do not create output files
--srcdir=DIR find the sources in DIR [configure dir or '..']
Installation directories:
--prefix=PREFIX install architecture-independent files in PREFIX
[/usr/local]
--exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
[PREFIX]
By default, 'make install' will install all the files in
'/usr/local/bin', '/usr/local/lib' etc. You can specify
an installation prefix other than '/usr/local' using '--prefix',
for instance '--prefix=$HOME'.
For better control, use the options below.
Fine tuning of the installation directories:
--bindir=DIR user executables [EPREFIX/bin]
--sbindir=DIR system admin executables [EPREFIX/sbin]
--libexecdir=DIR program executables [EPREFIX/libexec]
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
--runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run]
--libdir=DIR object code libraries [EPREFIX/lib]
--includedir=DIR C header files [PREFIX/include]
--oldincludedir=DIR C header files for non-gcc [/usr/include]
--datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
--datadir=DIR read-only architecture-independent data [DATAROOTDIR]
--infodir=DIR info documentation [DATAROOTDIR/info]
--localedir=DIR locale-dependent data [DATAROOTDIR/locale]
--mandir=DIR man documentation [DATAROOTDIR/man]
--docdir=DIR documentation root [DATAROOTDIR/doc/valgrind]
--htmldir=DIR html documentation [DOCDIR]
--dvidir=DIR dvi documentation [DOCDIR]
--pdfdir=DIR pdf documentation [DOCDIR]
--psdir=DIR ps documentation [DOCDIR]
Program names:
--program-prefix=PREFIX prepend PREFIX to installed program names
--program-suffix=SUFFIX append SUFFIX to installed program names
--program-transform-name=PROGRAM run sed PROGRAM on installed program names
System types:
--build=BUILD configure for building on BUILD [guessed]
--host=HOST cross-compile to build programs to run on HOST [BUILD]
Optional Features:
--disable-option-checking ignore unrecognized --enable/--with options
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
--enable-silent-rules less verbose build output (undo: "make V=1")
--disable-silent-rules verbose build output (undo: "make V=0")
--enable-maintainer-mode
enable make rules and dependencies not useful (and
sometimes confusing) to the casual installer
--enable-dependency-tracking
do not reject slow dependency extractors
--disable-dependency-tracking
speeds up one-time build
--enable-only64bit do a 64-bit only build
--enable-only32bit do a 32-bit only build
--enable-inner enables self-hosting
--enable-ubsan enables the undefined behaviour sanitiser
--enable-lto enables building with link time optimisation
--enable-tls platform supports TLS
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
--with-tmpdir=PATH Specify path for temporary files
--with-xcode-path=PATH Specify path for xcode sdk includes
--with-gdbscripts-dir=PATH Specify path to install gdb scripts
--with-mpicc= Specify name of MPI2-ised C compiler
Some influential environment variables:
CC C compiler command
CFLAGS C compiler flags
LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
nonstandard directory <lib dir>
LIBS libraries to pass to the linker, e.g. -l<library>
CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
you have headers in a nonstandard directory <include dir>
CPP C preprocessor
CXX C++ compiler command
CXXFLAGS C++ compiler flags
LTO_RANLIB Library indexer command for link time optimisation
SHA256SUM
AR Archiver command
LTO_AR Archiver command for link time optimisation
CCAS assembler compiler command (defaults to CC)
CCASFLAGS assembler compiler flags (defaults to CFLAGS)
Use these variables to override the choices made by 'configure' or to help
it to find libraries and programs with nonstandard names/locations.
Report bugs to <valgrind-users@lists.sourceforge.net>.
-12
View File
@@ -1,12 +0,0 @@
https://www.gyan.dev/ffmpeg/builds/
发布版本
release builds
下载
ffmpeg-release-full-shared.7z .ver .sha256
-12
View File
@@ -1,12 +0,0 @@
$$ C(n,m)= \frac{n!}{(nm)!m!} $$
$$ P(n, m) = \frac{n!}{(n - m)!} $$
$$ C(n,m)=C(n1,m1)+C(n1,m) $$
$$ C(n,0)=C(n,n)=1 $$
$$ m \cdot \binom{M}{m} = M \cdot \binom{M - 1}{m - 1} $$
逻辑意义 左边:先抽出m个元素,标记其中一个。 右边先标记一个,从剩余找出m-1个
$$ \binom{M}{m} = \frac{M}{m} \cdot \binom{M - 1}{m - 1}$$
@@ -1,18 +0,0 @@
#ifdef _WIN32
#include <Windows.h>
#include <QTextCodec>
#endif
#include <QApplication>
#include "simplest_qt_opengl_window.h"
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
#ifdef _WIN32
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
SetConsoleOutputCP(CP_UTF8);
#endif
Window w;
w.resize(800, 800);
w.show();
return QApplication::exec();
}
@@ -1,66 +0,0 @@
#ifndef yC_GLES32_Window_H
#define yC_GLES32_Window_H
#include <QWindow>
#include <QOpenGLContext>
#include <QOpenGLFunctions>
#include <QSurfaceFormat>
class Window : public QWindow, protected QOpenGLFunctions {
public:
QOpenGLContext *context;
bool initialized;
Window() : context(nullptr), initialized(false) {
setSurfaceType(OpenGLSurface);
// 设置OpenGL ES版本(3.2
QSurfaceFormat format = QSurfaceFormat::defaultFormat();
format.setMajorVersion(3);
format.setMinorVersion(2);
format.setProfile(QSurfaceFormat::CompatibilityProfile); // 设置为 OpenGL ES 配置
setFormat(format);
// 创建OpenGL上下文
context = new QOpenGLContext();
context->setFormat(format);
context->create();
}
~Window() override {
delete context;
}
void exposeEvent(QExposeEvent *event) override {
if (isExposed()) {
// 激活OpenGL上下文
context->makeCurrent(this);
// 初始化OpenGL(如果还未初始化)
if (!initialized) {
initializeOpenGLFunctions();
// 可以在这里做初始化工作,如创建VBO、着色器等
initialized = true;
}
// 渲染
render();
// 刷新OpenGL渲染到屏幕
context->swapBuffers(this);
}
}
private:
void render() {
// 在这里编写OpenGL ES渲染指令
glClearColor(0.0f, 0.0f, 1.0f, 1.0f); // 清除背景为蓝色
glClear(GL_COLOR_BUFFER_BIT); // 清空颜色缓冲
// 更多OpenGL ES渲染指令...
}
};
#endif
@@ -1,9 +0,0 @@
#include "core.h"
namespace GL {
Global* Global::instance() {
static Global instance;
return &instance;
}
}
@@ -1,103 +0,0 @@
#ifndef _core_h_
#define _core_h_
#include <QOffscreenSurface>
#include <QOpenGLContext>
#include <iostream>
#include <map>
#include <mutex>
#include <thread>
#include <vector>
#include "glad.h"
class QWindow;
namespace GL {
inline QSurfaceFormat surface_format() {
QSurfaceFormat format = QSurfaceFormat::defaultFormat();
format.setMajorVersion(3);
format.setMinorVersion(2);
//format.setProfile(QSurfaceFormat::CompatibilityProfile);
format.setProfile(QSurfaceFormat::CoreProfile);
return format;
}
inline QOpenGLContext* context_init(QSurface* w, const QSurfaceFormat& format) {
auto context = new QOpenGLContext();
context->setFormat(format);
context->create();
context->makeCurrent(w);
// 在expose之后调用,因为上下文绑定了窗口,加载的函数也绑定了窗口
gladLoadGLES2Loader([](const char* name){
auto byteArray = QByteArray::fromRawData(name, static_cast<int>(strlen(name)));
auto ctx = QOpenGLContext::currentContext();
return reinterpret_cast<void*>(ctx->getProcAddress(byteArray));
});
return context;
}
inline GLuint create_texture(GLsizei width, GLsizei height) {
GLuint ret;
glGenTextures(1, &ret);
auto t = GL_TEXTURE_2D;
glBindTexture(t, ret);
glTexImage2D(t, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
glTexParameteri(t, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(t, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// 将一个纹理附加到当前绑定的帧缓冲对象
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, t, ret, 0);
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE){
std::cout << "SubThreadFrameBuffer::render Framebuffer not complete!";
}
return ret;
}
class R {
public:
virtual ~R() = default;
virtual void render() = 0;
std::atomic<bool> show;
};
class Global {
Global() {
std::thread t([this]() {
for (auto& r: r_list()) {
if (r->show) {
r->render();
}
}
});
}
static Global* instance();
std::vector<R*> r_list() {
std::lock_guard g(r_mutex);
std::vector<R*> ret;
ret.reserve(rs.size());
for (auto& r : rs) {
ret.push_back(r.second);
}
return ret;
}
void add(const std::string& key, R* r) {
std::lock_guard g(r_mutex);
if (rs.find(key) == rs.end())
{
rs[key] = r;
} else
{
std::cout << "R" << key << " already exists!" << std::endl;
}
}
protected:
std::mutex r_mutex;
std::map<std::string, R*> rs;
};
}
#endif
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,311 +0,0 @@
#ifndef __khrplatform_h_
#define __khrplatform_h_
/*
** Copyright (c) 2008-2018 The Khronos Group Inc.
**
** Permission is hereby granted, free of charge, to any person obtaining a
** copy of this software and/or associated documentation files (the
** "Materials"), to deal in the Materials without restriction, including
** without limitation the rights to use, copy, modify, merge, publish,
** distribute, sublicense, and/or sell copies of the Materials, and to
** permit persons to whom the Materials are furnished to do so, subject to
** the following conditions:
**
** The above copyright notice and this permission notice shall be included
** in all copies or substantial portions of the Materials.
**
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
*/
/* Khronos platform-specific types and definitions.
*
* The master copy of khrplatform.h is maintained in the Khronos EGL
* Registry repository at https://github.com/KhronosGroup/EGL-Registry
* The last semantic modification to khrplatform.h was at commit ID:
* 67a3e0864c2d75ea5287b9f3d2eb74a745936692
*
* Adopters may modify this file to suit their platform. Adopters are
* encouraged to submit platform specific modifications to the Khronos
* group so that they can be included in future versions of this file.
* Please submit changes by filing pull requests or issues on
* the EGL Registry repository linked above.
*
*
* See the Implementer's Guidelines for information about where this file
* should be located on your system and for more details of its use:
* http://www.khronos.org/registry/implementers_guide.pdf
*
* This file should be included as
* #include <KHR/khrplatform.h>
* by Khronos client API header files that use its types and defines.
*
* The types in khrplatform.h should only be used to define API-specific types.
*
* Types defined in khrplatform.h:
* khronos_int8_t signed 8 bit
* khronos_uint8_t unsigned 8 bit
* khronos_int16_t signed 16 bit
* khronos_uint16_t unsigned 16 bit
* khronos_int32_t signed 32 bit
* khronos_uint32_t unsigned 32 bit
* khronos_int64_t signed 64 bit
* khronos_uint64_t unsigned 64 bit
* khronos_intptr_t signed same number of bits as a pointer
* khronos_uintptr_t unsigned same number of bits as a pointer
* khronos_ssize_t signed size
* khronos_usize_t unsigned size
* khronos_float_t signed 32 bit floating point
* khronos_time_ns_t unsigned 64 bit time in nanoseconds
* khronos_utime_nanoseconds_t unsigned time interval or absolute time in
* nanoseconds
* khronos_stime_nanoseconds_t signed time interval in nanoseconds
* khronos_boolean_enum_t enumerated boolean type. This should
* only be used as a base type when a client API's boolean type is
* an enum. Client APIs which use an integer or other type for
* booleans cannot use this as the base type for their boolean.
*
* Tokens defined in khrplatform.h:
*
* KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values.
*
* KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0.
* KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0.
*
* Calling convention macros defined in this file:
* KHRONOS_APICALL
* KHRONOS_APIENTRY
* KHRONOS_APIATTRIBUTES
*
* These may be used in function prototypes as:
*
* KHRONOS_APICALL void KHRONOS_APIENTRY funcname(
* int arg1,
* int arg2) KHRONOS_APIATTRIBUTES;
*/
#if defined(__SCITECH_SNAP__) && !defined(KHRONOS_STATIC)
# define KHRONOS_STATIC 1
#endif
/*-------------------------------------------------------------------------
* Definition of KHRONOS_APICALL
*-------------------------------------------------------------------------
* This precedes the return type of the function in the function prototype.
*/
#if defined(KHRONOS_STATIC)
/* If the preprocessor constant KHRONOS_STATIC is defined, make the
* header compatible with static linking. */
# define KHRONOS_APICALL
#elif defined(_WIN32)
# define KHRONOS_APICALL __declspec(dllimport)
#elif defined (__SYMBIAN32__)
# define KHRONOS_APICALL IMPORT_C
#elif defined(__ANDROID__)
# define KHRONOS_APICALL __attribute__((visibility("default")))
#else
# define KHRONOS_APICALL
#endif
/*-------------------------------------------------------------------------
* Definition of KHRONOS_APIENTRY
*-------------------------------------------------------------------------
* This follows the return type of the function and precedes the function
* name in the function prototype.
*/
#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__)
/* Win32 but not WinCE */
# define KHRONOS_APIENTRY __stdcall
#else
# define KHRONOS_APIENTRY
#endif
/*-------------------------------------------------------------------------
* Definition of KHRONOS_APIATTRIBUTES
*-------------------------------------------------------------------------
* This follows the closing parenthesis of the function prototype arguments.
*/
#if defined (__ARMCC_2__)
#define KHRONOS_APIATTRIBUTES __softfp
#else
#define KHRONOS_APIATTRIBUTES
#endif
/*-------------------------------------------------------------------------
* basic type definitions
*-----------------------------------------------------------------------*/
#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__)
/*
* Using <stdint.h>
*/
#include <stdint.h>
typedef int32_t khronos_int32_t;
typedef uint32_t khronos_uint32_t;
typedef int64_t khronos_int64_t;
typedef uint64_t khronos_uint64_t;
#define KHRONOS_SUPPORT_INT64 1
#define KHRONOS_SUPPORT_FLOAT 1
/*
* To support platform where unsigned long cannot be used interchangeably with
* inptr_t (e.g. CHERI-extended ISAs), we can use the stdint.h intptr_t.
* Ideally, we could just use (u)intptr_t everywhere, but this could result in
* ABI breakage if khronos_uintptr_t is changed from unsigned long to
* unsigned long long or similar (this results in different C++ name mangling).
* To avoid changes for existing platforms, we restrict usage of intptr_t to
* platforms where the size of a pointer is larger than the size of long.
*/
#if defined(__SIZEOF_LONG__) && defined(__SIZEOF_POINTER__)
#if __SIZEOF_POINTER__ > __SIZEOF_LONG__
#define KHRONOS_USE_INTPTR_T
#endif
#endif
#elif defined(__VMS ) || defined(__sgi)
/*
* Using <inttypes.h>
*/
#include <inttypes.h>
typedef int32_t khronos_int32_t;
typedef uint32_t khronos_uint32_t;
typedef int64_t khronos_int64_t;
typedef uint64_t khronos_uint64_t;
#define KHRONOS_SUPPORT_INT64 1
#define KHRONOS_SUPPORT_FLOAT 1
#elif defined(_WIN32) && !defined(__SCITECH_SNAP__)
/*
* Win32
*/
typedef __int32 khronos_int32_t;
typedef unsigned __int32 khronos_uint32_t;
typedef __int64 khronos_int64_t;
typedef unsigned __int64 khronos_uint64_t;
#define KHRONOS_SUPPORT_INT64 1
#define KHRONOS_SUPPORT_FLOAT 1
#elif defined(__sun__) || defined(__digital__)
/*
* Sun or Digital
*/
typedef int khronos_int32_t;
typedef unsigned int khronos_uint32_t;
#if defined(__arch64__) || defined(_LP64)
typedef long int khronos_int64_t;
typedef unsigned long int khronos_uint64_t;
#else
typedef long long int khronos_int64_t;
typedef unsigned long long int khronos_uint64_t;
#endif /* __arch64__ */
#define KHRONOS_SUPPORT_INT64 1
#define KHRONOS_SUPPORT_FLOAT 1
#elif 0
/*
* Hypothetical platform with no float or int64 support
*/
typedef int khronos_int32_t;
typedef unsigned int khronos_uint32_t;
#define KHRONOS_SUPPORT_INT64 0
#define KHRONOS_SUPPORT_FLOAT 0
#else
/*
* Generic fallback
*/
#include <stdint.h>
typedef int32_t khronos_int32_t;
typedef uint32_t khronos_uint32_t;
typedef int64_t khronos_int64_t;
typedef uint64_t khronos_uint64_t;
#define KHRONOS_SUPPORT_INT64 1
#define KHRONOS_SUPPORT_FLOAT 1
#endif
/*
* Types that are (so far) the same on all platforms
*/
typedef signed char khronos_int8_t;
typedef unsigned char khronos_uint8_t;
typedef signed short int khronos_int16_t;
typedef unsigned short int khronos_uint16_t;
/*
* Types that differ between LLP64 and LP64 architectures - in LLP64,
* pointers are 64 bits, but 'long' is still 32 bits. Win64 appears
* to be the only LLP64 architecture in current use.
*/
#ifdef KHRONOS_USE_INTPTR_T
typedef intptr_t khronos_intptr_t;
typedef uintptr_t khronos_uintptr_t;
#elif defined(_WIN64)
typedef signed long long int khronos_intptr_t;
typedef unsigned long long int khronos_uintptr_t;
#else
typedef signed long int khronos_intptr_t;
typedef unsigned long int khronos_uintptr_t;
#endif
#if defined(_WIN64)
typedef signed long long int khronos_ssize_t;
typedef unsigned long long int khronos_usize_t;
#else
typedef signed long int khronos_ssize_t;
typedef unsigned long int khronos_usize_t;
#endif
#if KHRONOS_SUPPORT_FLOAT
/*
* Float type
*/
typedef float khronos_float_t;
#endif
#if KHRONOS_SUPPORT_INT64
/* Time types
*
* These types can be used to represent a time interval in nanoseconds or
* an absolute Unadjusted System Time. Unadjusted System Time is the number
* of nanoseconds since some arbitrary system event (e.g. since the last
* time the system booted). The Unadjusted System Time is an unsigned
* 64 bit value that wraps back to 0 every 584 years. Time intervals
* may be either signed or unsigned.
*/
typedef khronos_uint64_t khronos_utime_nanoseconds_t;
typedef khronos_int64_t khronos_stime_nanoseconds_t;
#endif
/*
* Dummy value used to pad enum types to 32 bits.
*/
#ifndef KHRONOS_MAX_ENUM
#define KHRONOS_MAX_ENUM 0x7FFFFFFF
#endif
/*
* Enumerated boolean type
*
* Values other than zero should be considered to be true. Therefore
* comparisons should not be made against KHRONOS_TRUE.
*/
typedef enum {
KHRONOS_FALSE = 0,
KHRONOS_TRUE = 1,
KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM
} khronos_boolean_enum_t;
#endif /* __khrplatform_h_ */
@@ -1,22 +0,0 @@
#ifdef _WIN32
#include <Windows.h>
#include <QTextCodec>
#endif
#include <QApplication>
#include "simplest_qt_opengl_window.h"
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
#ifdef _WIN32
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
SetConsoleOutputCP(CP_UTF8);
#endif
Window w;
w.resize(800, 800);
w.show();
return QApplication::exec();
}
@@ -1,48 +0,0 @@
#ifndef yC_GLES32_Window_H
#define yC_GLES32_Window_H
#include <QWindow>
#include <QOpenGLContext>
#include <QSurfaceFormat>
#include <iostream>
#include "core.h"
class Window : public QWindow {
public:
QOpenGLContext *context;
bool initialized;
QSurfaceFormat format;
Window() : context(nullptr), initialized(false) {
format = GL::surface_format();
setSurfaceType(OpenGLSurface);
setFormat(format);
}
~Window() override {
delete context;
}
void exposeEvent(QExposeEvent *event) override {
if (isExposed()) {
if (!initialized) {
context = GL::context_init(this, format);
initialized = true;
}
context->makeCurrent(this);
render();
context->swapBuffers(this);
}
}
private:
virtual void render() {
// 在这里编写OpenGL ES渲染指令
glClearColor(0.0f, 0.0f, 1.0f, 1.0f); // 清除背景为蓝色
glClear(GL_COLOR_BUFFER_BIT); // 清空颜色缓冲
// 更多OpenGL ES渲染指令...
}
};
#endif
@@ -1,11 +0,0 @@
https://blog.csdn.net/liangshui999/article/details/132182621
QT_ASSUME_STDERR_HAS_CONSOLE=1
当你设置环境变量 QT_ASSUME_STDERR_HAS_CONSOLE=1 时,Qt 会假设你的应用程序有一个控制台窗口,
即使它是 GUI 模式。如果你希望在 GUI 模式下也能够看到标准错误输出(stderr)的信息,
这个环境变量会使得标准错误直接输出到控制台(而不是默认的日志系统)。
-118
View File
@@ -1,118 +0,0 @@
QModelIndex{
int r, c;
quintptr i;
const QAbstractItemModel *m;
inline QModelIndex QModelIndex::parent() const
{ return m ? m->parent(*this) : QModelIndex(); }
inline QVariant QModelIndex::data(int arole) const
{ return m ? m->data(*this, arole) : QVariant(); }
}
QPersistentModelIndex{
QPersistentModelIndexData *d;
}
QPersistentModelIndexData{
QModelIndex index;
QAtomicInt ref;
}
// model 不存储数据 只是定义了操作数据的接口
// 但是抽象出了持久引用,保存持久引用结构
QAbstractItemModelPrivate{
struct Change {
Q_DECL_CONSTEXPR Change() : parent(), first(-1), last(-1), needsAdjust(false) {}
Q_DECL_CONSTEXPR Change(const QModelIndex &p, int f, int l) : parent(p), first(f), last(l), needsAdjust(false) {}
QModelIndex parent;
int first, last;
// In cases such as this:
// - A
// - B
// - C
// - - D
// - - E
// - - F
//
// If B is moved to above E, C is the source parent in the signal and its row is 2. When the move is
// completed however, C is at row 1 and there is no row 2 at the same level in the model at all.
// The QModelIndex is adjusted to correct that in those cases before reporting it though the
// rowsMoved signal.
bool needsAdjust;
Q_DECL_CONSTEXPR bool isValid() const { return first >= 0 && last >= 0; }
};
QStack<Change> changes;
struct Persistent {
Persistent() {}
QMultiHash<QModelIndex, QPersistentModelIndexData *> indexes;
QStack<QVector<QPersistentModelIndexData *> > moved;
QStack<QVector<QPersistentModelIndexData *> > invalidated;
void insertMultiAtEnd(const QModelIndex& key, QPersistentModelIndexData *data);
} persistent;
Qt::DropActions supportedDragActions;
QHash<int,QByteArray> roleNames;
}
QHash<QModelIndex, QPersistentModelIndexData *> &indexes = model->d_func()->persistent.indexes;
qnamespace.h
enum ItemDataRole {
DisplayRole = 0,
DecorationRole = 1,
EditRole = 2,
ToolTipRole = 3,
StatusTipRole = 4,
WhatsThisRole = 5,
// Metadata
FontRole = 6,
TextAlignmentRole = 7,
BackgroundRole = 8,
ForegroundRole = 9,
#if QT_DEPRECATED_SINCE(5, 13) // ### Qt 6: remove me
BackgroundColorRole Q_DECL_ENUMERATOR_DEPRECATED = BackgroundRole,
TextColorRole Q_DECL_ENUMERATOR_DEPRECATED = ForegroundRole,
#endif
CheckStateRole = 10,
// Accessibility
AccessibleTextRole = 11,
AccessibleDescriptionRole = 12,
// More general purpose
SizeHintRole = 13,
InitialSortOrderRole = 14,
// Internal UiLib roles. Start worrying when public roles go that high.
DisplayPropertyRole = 27,
DecorationPropertyRole = 28,
ToolTipPropertyRole = 29,
StatusTipPropertyRole = 30,
WhatsThisPropertyRole = 31,
// Reserved
UserRole = 0x0100
};
enum ItemFlag {
NoItemFlags = 0,
ItemIsSelectable = 1,
ItemIsEditable = 2,
ItemIsDragEnabled = 4,
ItemIsDropEnabled = 8,
ItemIsUserCheckable = 16,
ItemIsEnabled = 32,
ItemIsAutoTristate = 64,
#if QT_DEPRECATED_SINCE(5, 6)
ItemIsTristate = ItemIsAutoTristate,
#endif
ItemNeverHasChildren = 128,
ItemIsUserTristate = 256
};
Q_DECLARE_FLAGS(ItemFlags, ItemFlag)
Q_DECLARE_OPERATORS_FOR_FLAGS(ItemFlags)
-730
View File
@@ -1,730 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt VS Tools.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************
-->
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="QPoint">
<AlternativeType Name="QPointF"/>
<DisplayString>{{ x = {xp}, y = {yp} }}</DisplayString>
<Expand>
<Item Name="[x]">xp</Item>
<Item Name="[y]">yp</Item>
</Expand>
</Type>
<Type Name="QRect">
<DisplayString>{{ x = {x1}, y = {y1}, width = {x2 - x1 + 1}, height = {y2 - y1 + 1} }}</DisplayString>
<Expand>
<Item Name="[x]">x1</Item>
<Item Name="[y]">y1</Item>
<Item Name="[width]">x2 - x1 + 1</Item>
<Item Name="[height]">y2 - y1 + 1</Item>
</Expand>
</Type>
<Type Name="QRectF">
<DisplayString>{{ x = {xp}, y = {yp}, width = {w}, height = {h} }}</DisplayString>
<Expand>
<Item Name="[x]">xp</Item>
<Item Name="[y]">yp</Item>
<Item Name="[width]">w</Item>
<Item Name="[height]">h</Item>
</Expand>
</Type>
<Type Name="QSize">
<AlternativeType Name="QSizeF"/>
<DisplayString>{{ width = {wd}, height = {ht} }}</DisplayString>
<Expand>
<Item Name="[width]">wd</Item>
<Item Name="[height]">ht</Item>
</Expand>
</Type>
<Type Name="QLine">
<AlternativeType Name="QLineF"/>
<DisplayString>{{ start point = {pt1}, end point = {pt2} }}</DisplayString>
<Expand>
<Synthetic Name="[start point]">
<DisplayString>{pt1}</DisplayString>
<Expand>
<ExpandedItem>pt1</ExpandedItem>
</Expand>
</Synthetic>
<Synthetic Name="[end point]">
<DisplayString>{pt2}</DisplayString>
<Expand>
<ExpandedItem>pt2</ExpandedItem>
</Expand>
</Synthetic>
</Expand>
</Type>
<Type Name="QPolygon">
<DisplayString>{{ size = {d-&gt;size} }}</DisplayString>
<Expand>
<Item Name="[referenced]">d-&gt;ref.atomic._q_value</Item>
<ArrayItems>
<Size>d-&gt;size</Size>
<ValuePointer>(QPoint*)((reinterpret_cast&lt;char*&gt;(d)) + d-&gt;offset)</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<Type Name="QPolygonF">
<DisplayString>{{ size = {d-&gt;size} }}</DisplayString>
<Expand>
<Item Name="[closed]">
d-&gt;size &gt; 0
&amp;&amp; ((((QPointF*)((reinterpret_cast&lt;char*&gt;(d)) + d-&gt;offset)[0]).xp
== (((QPointF*)((reinterpret_cast&lt;char*&gt;(d)) + d-&gt;offset)[d-&gt;size - 1]).xp)
&amp;&amp; ((((QPointF*)((reinterpret_cast&lt;char*&gt;(d)) + d-&gt;offset)[0]).yp
== (((QPointF*)((reinterpret_cast&lt;char*&gt;(d)) + d-&gt;offset)[d-&gt;size - 1]).yp)
</Item>
<Item Name="[referenced]">d-&gt;ref.atomic._q_value</Item>
<ArrayItems>
<Size>d-&gt;size</Size>
<ValuePointer>(QPointF*)((reinterpret_cast&lt;char*&gt;(d)) + d-&gt;offset)</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<Type Name ="QVector2D">
<DisplayString>{{ x = {xp}, y = {yp} }}</DisplayString>
<Expand>
<Item Name="[x]">xp</Item>
<Item Name="[y]">yp</Item>
</Expand>
</Type>
<Type Name ="QVector3D">
<DisplayString>{{ x = {xp}, y = {yp}, z = {zp} }}</DisplayString>
<Expand>
<Item Name="[x]">xp</Item>
<Item Name="[y]">yp</Item>
<Item Name="[z]">zp</Item>
</Expand>
</Type>
<Type Name ="QVector4D">
<DisplayString>{{ x = {xp}, y = {yp}, z = {zp}, w = {wp} }}</DisplayString>
<Expand>
<Item Name="[x]">xp</Item>
<Item Name="[y]">yp</Item>
<Item Name="[z]">zp</Item>
<Item Name="[w]">wp</Item>
</Expand>
</Type>
<Type Name ="QMatrix">
<DisplayString>
{{ m11 = {_m11}, m12 = {_m12}, m21 = {_m21}, m22 = {_m22}, ... }}
</DisplayString>
<Expand>
<Item Name="[m11]">_m11</Item>
<Item Name="[m12]">_m12</Item>
<Item Name="[m21]">_m21</Item>
<Item Name="[m22]">_m22</Item>
<Item Name="[dx]">_dx</Item>
<Item Name="[dy]">_dy</Item>
</Expand>
</Type>
<Type Name ="QMatrix4x4">
<DisplayString>
{{ m11 = {m[0][0]}, m12 = {m[1][0]}, m13 = {m[2][0]}, m14 = {m[3][0]}, ... }}
</DisplayString>
<Expand>
<Item Name="[m11]">m[0][0]</Item>
<Item Name="[m12]">m[1][0]</Item>
<Item Name="[m13]">m[2][0]</Item>
<Item Name="[m14]">m[3][0]</Item>
<Item Name="[m21]">m[0][1]</Item>
<Item Name="[m22]">m[1][1]</Item>
<Item Name="[m23]">m[2][1]</Item>
<Item Name="[m24]">m[3][1]</Item>
<Item Name="[m31]">m[0][2]</Item>
<Item Name="[m32]">m[1][2]</Item>
<Item Name="[m33]">m[2][2]</Item>
<Item Name="[m34]">m[3][2]</Item>
<Item Name="[m41]">m[0][3]</Item>
<Item Name="[m42]">m[1][3]</Item>
<Item Name="[m43]">m[2][3]</Item>
<Item Name="[m44]">m[3][3]</Item>
</Expand>
</Type>
<Type Name="QSizePolicy">
<DisplayString>
{{ horizontal = {static_cast&lt;Policy&gt;(bits.horPolicy)}, vertical = {static_cast&lt;Policy&gt;(bits.verPolicy)}, type = {ControlType(1 &lt;&lt; bits.ctype)} }}
</DisplayString>
<Expand>
<Synthetic Name="[vertical policy]">
<DisplayString>QSizePolicy::Policy::{static_cast&lt;Policy&gt;(bits.verPolicy)}</DisplayString>
</Synthetic>
<Synthetic Name="[horizontal policy]">
<DisplayString>QSizePolicy::Policy::{static_cast&lt;Policy&gt;(bits.horPolicy)}</DisplayString>
</Synthetic>
<Synthetic Name="[control type]">
<DisplayString>QSizePolicy::ControlType::{ControlType(1 &lt;&lt; bits.ctype)}</DisplayString>
</Synthetic>
<Synthetic Name="[expanding directions]">
<DisplayString
Condition="(static_cast&lt;Policy&gt;(bits.verPolicy) &amp; ExpandFlag)">
Qt::Vertical (2)
</DisplayString>
<DisplayString
Condition="(static_cast&lt;Policy&gt;(bits.horPolicy) &amp; ExpandFlag)">
Qt::Horizontal (1)
</DisplayString>
</Synthetic>
<Item Name="[vertical stretch]">static_cast&lt;int&gt;(bits.verStretch)</Item>
<Item Name="[horizontal stretch]">static_cast&lt;int&gt;(bits.horStretch)</Item>
<Item Name="[has height for width]">bits.hfw == 1</Item>
<Item Name="[has width for height]">bits.wfh == 1</Item>
</Expand>
</Type>
<Type Name="QChar">
<DisplayString>{ucs,c}</DisplayString>
<StringView>ucs,c</StringView>
<Expand>
<Item Name="[latin 1]">ucs > 0xff ? '\0' : char(ucs),c</Item>
<Item Name="[unicode]">ucs,c</Item>
</Expand>
</Type>
<Type Name="QString">
<DisplayString>{((reinterpret_cast&lt;unsigned short*&gt;(d)) + d->offset / 2),sub}</DisplayString>
<StringView>((reinterpret_cast&lt;unsigned short*&gt;(d)) + d->offset / 2),sub</StringView>
<Expand>
<Item Name="[size]">d-&gt;size</Item>
<Item Name="[referenced]">d-&gt;ref.atomic._q_value</Item>
<ArrayItems>
<Size>d-&gt;size</Size>
<ValuePointer>((reinterpret_cast&lt;unsigned short*&gt;(d)) + d->offset / 2),c</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<Type Name="QByteArray">
<DisplayString>{((reinterpret_cast&lt;char*&gt;(d)) + d-&gt;offset),sb}</DisplayString>
<StringView>((reinterpret_cast&lt;char*&gt;(d)) + d-&gt;offset),sb</StringView>
<Expand>
<Item Name="[size]">d-&gt;size</Item>
<Item Name="[referenced]">d-&gt;ref.atomic._q_value</Item>
<ArrayItems>
<Size>d-&gt;size</Size>
<ValuePointer>((reinterpret_cast&lt;char*&gt;(d)) + d-&gt;offset),c</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<Type Name="QBitArray">
<DisplayString>{{ size = {(d.d-&gt;size &lt;&lt; 3) - *((reinterpret_cast&lt;char*&gt;(d.d)) + d.d-&gt;offset)} }}</DisplayString>
<Expand>
<Item Name="[referenced]">d.d-&gt;ref.atomic._q_value</Item>
<IndexListItems>
<Size>(d.d-&gt;size &lt;&lt; 3) - *((reinterpret_cast&lt;char*&gt;(d.d)) + d.d-&gt;offset)</Size>
<ValueNode>
(*(reinterpret_cast&lt;const unsigned char*&gt;((reinterpret_cast&lt;char*&gt;(d.d)) + d.d-&gt;offset) + 1
+ ($i &gt;&gt; 3)) &amp; (1 &lt;&lt; ($i &amp; 7))) != 0
</ValueNode>
</IndexListItems>
</Expand>
</Type>
<Type Name="QVarLengthArray&lt;*&gt;">
<AlternativeType Name="QVarLengthArray&lt;*, int&gt;"/>
<DisplayString>{{ size = {s} }}</DisplayString>
<Expand>
<Item Name="[capacity]">a</Item>
<ArrayItems>
<Size>s</Size>
<ValuePointer>ptr</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<Type Name="QDate">
<DisplayString>{{ julian day = {jd} }}</DisplayString>
<Expand></Expand>
</Type>
<Type Name="QTime">
<DisplayString
Condition="mds == 1">{{ millisecond = {mds} }}</DisplayString>
<DisplayString
Condition="mds != 1">{{ milliseconds = {mds} }}</DisplayString>
<Expand>
<Item Name="[hour]"
Condition="(mds / 3600000) == 1">mds / 3600000, d</Item>
<Item Name="[hours]"
Condition="(mds / 3600000) != 1">mds / 3600000, d</Item>
<Item Name="[minute]"
Condition="((mds % 3600000) / 60000) == 1">(mds % 3600000) / 60000, d</Item>
<Item Name="[minutes]"
Condition="((mds % 3600000) / 60000) != 1">(mds % 3600000) / 60000, d</Item>
<Item Name="[second]"
Condition="((mds / 1000) % 60) == 1">(mds / 1000) % 60, d</Item>
<Item Name="[seconds]"
Condition="((mds / 1000) % 60) != 1">(mds / 1000) % 60, d</Item>
<Item Name="[millisecond]"
Condition="(mds % 1000) == 1">mds % 1000, d</Item>
<Item Name="[milliseconds]"
Condition="(mds % 1000) != 1">mds % 1000, d</Item>
</Expand>
</Type>
<Type Name="QRegularExpression">
<DisplayString>{d.pattern}</DisplayString>
</Type>
<Type Name="QSharedData">
<Expand>
<Item Name="[referenced]">ref._q_value</Item>
</Expand>
</Type>
<Type Name="QSharedPointer&lt;*&gt;">
<DisplayString>strong reference to shared pointer of type {"$T1"}</DisplayString>
<Expand>
<Item Name="[is null]">value == 0</Item>
<Item Name="[weak referenced]">d-&gt;weakref._q_value</Item>
<Item Name="[strong referenced]">d-&gt;strongref._q_value</Item>
</Expand>
</Type>
<Type Name="QSharedDataPointer&lt;*&gt;">
<DisplayString>pointer to implicit shared object of type {"$T1"}</DisplayString>
<Expand>
<ExpandedItem>d</ExpandedItem>
</Expand>
</Type>
<Type Name="QExplicitlySharedDataPointer&lt;*&gt;">
<DisplayString>pointer to explicit shared object of type {"$T1"}</DisplayString>
<Expand>
<ExpandedItem>d</ExpandedItem>
</Expand>
</Type>
<Type Name="QPointer&lt;*&gt;">
<DisplayString>guarded pointer to subclass of QObject of type {"$T1"}</DisplayString>
<Expand>
<Item Name="[is null]">wp.d == 0 || wp.d-&gt;strongref._q_value == 0 || wp.value == 0</Item>
</Expand>
</Type>
<Type Name="QWeakPointer&lt;*&gt;">
<DisplayString>weak reference to shared pointer of type {"$T1"}</DisplayString>
<Expand>
<Item Name="[is null]">d == 0 || d-&gt;strongref._q_value == 0 || value == 0</Item>
<Item Name="[weak referenced]">d-&gt;weakref._q_value</Item>
<Item Name="[strong referenced]">d-&gt;strongref._q_value</Item>
</Expand>
</Type>
<Type Name="QScopedPointer&lt;*&gt;">
<DisplayString>scoped pointer to a dynamically allocated object of type {"$T1"}</DisplayString>
<Expand>
<Item Name="[is null]">!d</Item>
</Expand>
</Type>
<Type Name="QScopedArrayPointer&lt;*&gt;">
<DisplayString>scoped pointer to dynamically allocated array of objects of type {"$T1"}</DisplayString>
<Expand>
<Item Name="[is null]">!d</Item>
</Expand>
</Type>
<Type Name="QPair&lt;*,*&gt;">
<DisplayString>({first}, {second})</DisplayString>
<Expand>
<Item Name="[first]">first</Item>
<Item Name="[second]">second</Item>
</Expand>
</Type>
<Type Name="QVector&lt;*&gt;">
<AlternativeType Name="QStack&lt;*&gt;"></AlternativeType>
<DisplayString>{{ size = {d-&gt;size} }}</DisplayString>
<Expand>
<Item Name="[referenced]">d-&gt;ref.atomic._q_value</Item>
<ArrayItems>
<Size>d-&gt;size</Size>
<ValuePointer>($T1*)((reinterpret_cast&lt;char*&gt;(d)) + d-&gt;offset)</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<Type Name="QList&lt;*&gt;">
<AlternativeType Name="QStringList"></AlternativeType>
<AlternativeType Name="QQueue&lt;*&gt;"></AlternativeType>
<DisplayString>{{ size = {d-&gt;end - d-&gt;begin} }}</DisplayString>
<Expand>
<Item Name="[referenced]">d-&gt;ref.atomic._q_value</Item>
<IndexListItems>
<Size>d-&gt;end - d-&gt;begin</Size>
<ValueNode>*reinterpret_cast&lt;$T1*&gt;((sizeof($T1) &gt; sizeof(void*))
? reinterpret_cast&lt;Node*&gt;(d->array + d->begin + $i)->v
: reinterpret_cast&lt;$T1*&gt;(d->array + d->begin + $i))
</ValueNode>
</IndexListItems>
</Expand>
</Type>
<Type Name="QLinkedList&lt;*&gt;">
<DisplayString>{{ size = {d-&gt;size} }}</DisplayString>
<Expand>
<Item Name="[referenced]">d-&gt;ref.atomic._q_value</Item>
<LinkedListItems>
<Size>d-&gt;size</Size>
<HeadPointer>d-&gt;n</HeadPointer>
<NextPointer>n</NextPointer>
<ValueNode>(*(QLinkedListNode&lt;$T1&gt;*)this).t</ValueNode>
</LinkedListItems>
</Expand>
</Type>
<Type Name="QMapNode&lt;*,*&gt;">
<DisplayString>({key}, {value})</DisplayString>
<Expand>
<Item Name="[key]">key</Item>
<Item Name="[value]">value</Item>
</Expand>
</Type>
<Type Name="QMap&lt;*,*&gt;">
<AlternativeType Name="QMultiMap&lt;*,*&gt;"/>
<DisplayString>{{ size = {d-&gt;size} }}</DisplayString>
<Expand>
<Item Name="[referenced]">d-&gt;ref.atomic._q_value</Item>
<TreeItems>
<Size>d-&gt;size</Size>
<HeadPointer>d-&gt;header.left</HeadPointer>
<LeftPointer>left</LeftPointer>
<RightPointer>right</RightPointer>
<ValueNode>*((QMapNode&lt;$T1,$T2&gt;*)this)</ValueNode>
</TreeItems>
</Expand>
</Type>
<Type Name="QHashNode&lt;*,*&gt;">
<DisplayString Condition="next == 0">(empty)</DisplayString>
<DisplayString Condition="next != 0">({key}, {value})</DisplayString>
<Expand>
<Item Name="[key]" Condition="next != 0">key</Item>
<Item Name="[value]" Condition="next != 0">value</Item>
<Item Name="[next]" Condition="next != 0">next</Item>
</Expand>
</Type>
<Type Name="QHash&lt;*,*&gt;">
<AlternativeType Name="QMultiHash&lt;*,*&gt;"/>
<DisplayString>{{ size = {d-&gt;size} }}</DisplayString>
<Expand>
<ArrayItems IncludeView="buckets">
<Size>d-&gt;numBuckets</Size>
<ValuePointer>reinterpret_cast&lt;Node **&gt;(d-&gt;buckets)</ValuePointer>
</ArrayItems>
<CustomListItems ExcludeView="buckets">
<Variable Name="n" InitialValue="d-&gt;numBuckets"/>
<Variable Name="bucket" InitialValue="d-&gt;buckets"/>
<Variable Name="node" InitialValue="d-&gt;buckets[0]"/>
<Variable Name="keyValuePair" InitialValue="reinterpret_cast&lt;Node *&gt;(0)"/>
<Size>d-&gt;size</Size>
<Loop>
<Break Condition="n == 0"/>
<Exec>node = *(bucket++)</Exec>
<Exec>--n</Exec>
<Loop>
<Break Condition="!node || !node->next"/>
<Exec>keyValuePair = reinterpret_cast&lt;Node *&gt;(node)</Exec>
<Item Name="[{keyValuePair-&gt;key}]">keyValuePair-&gt;value</Item>
<Exec>node = node-&gt;next</Exec>
</Loop>
</Loop>
</CustomListItems>
</Expand>
</Type>
<Type Name="QHashNode&lt;*,QHashDummyValue&gt;">
<DisplayString Condition="next == 0">(empty)</DisplayString>
<DisplayString Condition="next != 0">({key})</DisplayString>
<Expand>
<Item Name="[key]" Condition="next != 0">key</Item>
</Expand>
</Type>
<Type Name="QSet&lt;*&gt;">
<DisplayString>{{ size = {q_hash.d-&gt;size} }}</DisplayString>
<Expand>
<ExpandedItem>q_hash</ExpandedItem>
</Expand>
</Type>
<Type Name="QCache&lt;*,*&gt;::Node">
<DisplayString>({*keyPtr}, {*t})</DisplayString>
<Expand>
<Item Name="[key]">*keyPtr</Item>
<Item Name="[value]">*t</Item>
</Expand>
</Type>
<Type Name="QCache&lt;*,*&gt;">
<DisplayString>{{ size = {hash.d-&gt;size} }}</DisplayString>
<Expand>
<Item Name="[max coast]">mx</Item>
<Item Name="[total coast]">total</Item>
<Item Name="[referenced]">hash.d-&gt;ref.atomic._q_value</Item>
<LinkedListItems>
<Size>hash.d-&gt;size</Size>
<HeadPointer>f</HeadPointer>
<NextPointer>n</NextPointer>
<ValueNode>*((Node*)this)</ValueNode>
</LinkedListItems>
</Expand>
</Type>
<Type Name="QVariant">
<!--Region DisplayString QVariant-->
<DisplayString Condition="d.type == QMetaType::UnknownType">Invalid</DisplayString>
<DisplayString Condition="d.type == QMetaType::Bool">{d.data.b}</DisplayString>
<DisplayString Condition="d.type == QMetaType::Int">{d.data.i}</DisplayString>
<DisplayString Condition="d.type == QMetaType::UInt">{d.data.u}</DisplayString>
<DisplayString Condition="d.type == QMetaType::LongLong">{d.data.ll}</DisplayString>
<DisplayString Condition="d.type == QMetaType::ULongLong">{d.data.ull}</DisplayString>
<DisplayString Condition="d.type == QMetaType::Double">{d.data.d}</DisplayString>
<DisplayString Condition="d.type == QMetaType::QChar">{d.data.c}</DisplayString>
<DisplayString Condition="d.type == QMetaType::QVariantMap">
{*((QMap&lt;QString,QVariant&gt;*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))}
</DisplayString>
<DisplayString Condition="d.type == QMetaType::QVariantList">
{*((QList&lt;QVariant&gt;*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))}
</DisplayString>
<DisplayString Condition="d.type == QMetaType::QString">
{*((QString*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))}
</DisplayString>
<DisplayString Condition="d.type == QMetaType::QStringList">
{*((QStringList*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))}
</DisplayString>
<DisplayString Condition="d.type == QMetaType::QByteArray">
{*((QByteArray*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))}
</DisplayString>
<DisplayString Condition="d.type == QMetaType::QBitArray">
{*((QBitArray*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))}
</DisplayString>
<DisplayString Condition="d.type == QMetaType::QDate">
{*((QDate*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))}
</DisplayString>
<DisplayString Condition="d.type == QMetaType::QTime">
{*((QTime*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))}
</DisplayString>
<DisplayString Condition="d.type == QMetaType::QDateTime">DateTime</DisplayString>
<DisplayString Condition="d.type == QMetaType::QUrl">Url</DisplayString>
<DisplayString Condition="d.type == QMetaType::QLocale">Locale</DisplayString>
<DisplayString Condition="d.type == QMetaType::QRect">
{*((QRect*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))}
</DisplayString>
<DisplayString Condition="d.type == QMetaType::QRectF">
{*((QRectF*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))}
</DisplayString>
<DisplayString Condition="d.type == QMetaType::QSize">
{*((QSize*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))}
</DisplayString>
<DisplayString Condition="d.type == QMetaType::QSizeF">
{*((QSizeF*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))}
</DisplayString>
<DisplayString Condition="d.type == QMetaType::QLine">
{*((QLine*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))}
</DisplayString>
<DisplayString Condition="d.type == QMetaType::QLineF">
{*((QLineF*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))}
</DisplayString>
<DisplayString Condition="d.type == QMetaType::QPoint">
{*((QPoint*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))}
</DisplayString>
<DisplayString Condition="d.type == QMetaType::QPointF">
{*((QPointF*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))}
</DisplayString>
<DisplayString Condition="d.type == QMetaType::QRegExp">RegExp</DisplayString>
<DisplayString Condition="d.type == QMetaType::QRegularExpression">RegularExpression</DisplayString>
<DisplayString Condition="d.type == QMetaType::QVariantHash">
{*((QHash&lt;QString,QVariant&gt;*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))}
</DisplayString>
<DisplayString Condition="d.type == QMetaType::QEasingCurve">EasingCurve</DisplayString>
<DisplayString Condition="d.type == QMetaType::QUuid">Uuid</DisplayString>
<DisplayString Condition="d.type == QMetaType::QModelIndex">ModelIndex</DisplayString>
<DisplayString Condition="d.type == QMetaType::LastCoreType">LastCoreType</DisplayString>
<DisplayString Condition="d.type == QMetaType::QFont">Font</DisplayString>
<DisplayString Condition="d.type == QMetaType::QPixmap">Pixmap</DisplayString>
<DisplayString Condition="d.type == QMetaType::QBrush">Brush</DisplayString>
<DisplayString Condition="d.type == QMetaType::QColor">Color</DisplayString>
<DisplayString Condition="d.type == QMetaType::QPalette">Palette</DisplayString>
<DisplayString Condition="d.type == QMetaType::QImage">Image</DisplayString>
<DisplayString Condition="d.type == QMetaType::QPolygon">Polygon</DisplayString>
<DisplayString Condition="d.type == QMetaType::QRegion">Region</DisplayString>
<DisplayString Condition="d.type == QMetaType::QBitmap">Bitmap</DisplayString>
<DisplayString Condition="d.type == QMetaType::QCursor">Cursor</DisplayString>
<DisplayString Condition="d.type == QMetaType::QKeySequence">KeySequence</DisplayString>
<DisplayString Condition="d.type == QMetaType::QPen">Pen</DisplayString>
<DisplayString Condition="d.type == QMetaType::QTextLength">TextLength</DisplayString>
<DisplayString Condition="d.type == QMetaType::QTextFormat">TextFormat</DisplayString>
<DisplayString Condition="d.type == QMetaType::QMatrix">Matrix</DisplayString>
<DisplayString Condition="d.type == QMetaType::QTransform">Transform</DisplayString>
<DisplayString Condition="d.type == QMetaType::QMatrix4x4">Matrix4x4</DisplayString>
<DisplayString Condition="d.type == QMetaType::QVector2D">Vector2D</DisplayString>
<DisplayString Condition="d.type == QMetaType::QVector3D">Vector3D</DisplayString>
<DisplayString Condition="d.type == QMetaType::QVector4D">Vector4D</DisplayString>
<DisplayString Condition="d.type == QMetaType::QQuaternion">Quaternion</DisplayString>
<DisplayString Condition="d.type == QMetaType::QPolygonF">PolygonF</DisplayString>
<DisplayString Condition="d.type == QMetaType::QIcon">Icon</DisplayString>
<DisplayString Condition="d.type == QMetaType::LastGuiType">LastGuiType</DisplayString>
<DisplayString Condition="d.type == QMetaType::QSizePolicy">SizePolicy</DisplayString>
<DisplayString Condition="d.type == QMetaType::User">UserType</DisplayString>
<DisplayString Condition="d.type == 0xffffffff">LastType</DisplayString>
<!--End region DisplayString QVariant-->
<!--Region DisplayView QVariant-->
<StringView Condition="d.type == QMetaType::QChar">d.data.c</StringView>
<StringView Condition="d.type == QMetaType::QString">
*((QString*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))
</StringView>
<StringView Condition="d.type == QMetaType::QByteArray">
*((QByteArray*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))
</StringView>
<!--End region DisplayView QVariant-->
<!--Region Expand QVariant-->
<Expand>
<ExpandedItem Condition="d.type == QMetaType::QVariantMap">
*((QMap&lt;QString,QVariant&gt;*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))
</ExpandedItem>
<ExpandedItem Condition="d.type == QMetaType::QVariantList">
*((QList&lt;QVariant&gt;*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))
</ExpandedItem>
<ExpandedItem Condition="d.type == QMetaType::QString">
*((QString*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))
</ExpandedItem>
<ExpandedItem Condition="d.type == QMetaType::QStringList">
*((QStringList*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))
</ExpandedItem>
<ExpandedItem Condition="d.type == QMetaType::QByteArray">
*((QByteArray*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))
</ExpandedItem>
<ExpandedItem Condition="d.type == QMetaType::QBitArray">
*((QBitArray*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))
</ExpandedItem>
<ExpandedItem Condition="d.type == QMetaType::QDate">
*((QDate*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))
</ExpandedItem>
<ExpandedItem Condition="d.type == QMetaType::QTime">
*((QTime*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))
</ExpandedItem>
<ExpandedItem Condition="d.type == QMetaType::QRect">
*((QRect*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))
</ExpandedItem>
<ExpandedItem Condition="d.type == QMetaType::QRectF">
*((QRectF*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))
</ExpandedItem>
<ExpandedItem Condition="d.type == QMetaType::QSize">
*((QSize*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))
</ExpandedItem>
<ExpandedItem Condition="d.type == QMetaType::QSizeF">
*((QSizeF*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))
</ExpandedItem>
<ExpandedItem Condition="d.type == QMetaType::QLine">
*((QLine*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))
</ExpandedItem>
<ExpandedItem Condition="d.type == QMetaType::QLineF">
*((QLineF*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))
</ExpandedItem>
<ExpandedItem Condition="d.type == QMetaType::QPoint">
*((QPoint*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))
</ExpandedItem>
<ExpandedItem Condition="d.type == QMetaType::QPointF">
*((QPointF*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))
</ExpandedItem>
<ExpandedItem Condition="d.type == QMetaType::QVariantHash">
*((QHash&lt;QString,QVariant&gt;*)(d.is_shared ? d.data.shared-&gt;ptr
: reinterpret_cast&lt;const void *&gt;(&amp;d.data.ptr)))
</ExpandedItem>
</Expand>
<!--End region Expand QVariant-->
</Type>
</AutoVisualizer>
-8
View File
@@ -1,8 +0,0 @@
https://blog.csdn.net/hebhljdx/article/details/139778364
https://www.cnblogs.com/linuxAndMcu/p/11057347.html
// QPainter-rotate ()函数分析-文字旋转不倾斜,
https://www.cnblogs.com/lifexy/p/9245913.html
-7
View File
@@ -1,7 +0,0 @@
https://blog.csdn.net/kenfan1647/article/details/115171891
// 飞扬青云qt资料下载
https://gitee.com/qustlr/qtkaifajingyan/blob/master/Qt5.10%20GUI%E5%AE%8C%E5%85%A8%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C.pdf
-7
View File
@@ -1,7 +0,0 @@
https://www.cnblogs.com/Leventure/p/18237406
https://blog.csdn.net/qq_34305316/article/details/132970047
https://doc.qt.io/qt-5/highdpi.html
-125
View File
@@ -1,125 +0,0 @@
D:\wyc\library\wasm\emsdk-1.39.8>emsdk install 1.39.8
Installing SDK 'sdk-releases-upstream-9e60f34accb4627d7358223862a7e74291886ab6-64bit'..
Installing tool 'node-12.9.1-64bit'..
Downloading: D:/wyc/library/wasm/emsdk-1.39.8/zips/node-v12.9.1-win-x64.zip from https://storage.googleapis.com/webassembly/emscripten-releases-builds/deps/node-v12.9.1-win-x64.zip, 35200117 Bytes
Unpacking 'D:/wyc/library/wasm/emsdk-1.39.8/zips/node-v12.9.1-win-x64.zip' to 'D:/wyc/library/wasm/emsdk-1.39.8/node/12.9.1_64bit'
Done installing tool 'node-12.9.1-64bit'.
Installing tool 'python-3.7.4-64bit'..
Downloading: D:/wyc/library/wasm/emsdk-1.39.8/zips/python-3.7.4-embed-amd64-patched.zip from https://storage.googleapis.com/webassembly/emscripten-releases-builds/deps/python-3.7.4-embed-amd64-patched.zip, 7504212 Bytes
Unpacking 'D:/wyc/library/wasm/emsdk-1.39.8/zips/python-3.7.4-embed-amd64-patched.zip' to 'D:/wyc/library/wasm/emsdk-1.39.8/python/3.7.4_64bit'
Done installing tool 'python-3.7.4-64bit'.
Installing tool 'java-8.152-64bit'..
Downloading: D:/wyc/library/wasm/emsdk-1.39.8/zips/portable_jre_8_update_152_64bit.zip from https://storage.googleapis.com/webassembly/emscripten-releases-builds/deps/portable_jre_8_update_152_64bit.zip, 69241499 Bytes
Unpacking 'D:/wyc/library/wasm/emsdk-1.39.8/zips/portable_jre_8_update_152_64bit.zip' to 'D:/wyc/library/wasm/emsdk-1.39.8/java/8.152_64bit'
Done installing tool 'java-8.152-64bit'.
Installing tool 'releases-upstream-9e60f34accb4627d7358223862a7e74291886ab6-64bit'..
Downloading: D:/wyc/library/wasm/emsdk-1.39.8/zips/9e60f34accb4627d7358223862a7e74291886ab6-wasm-binaries.zip from https://storage.googleapis.com/webassembly/emscripten-releases-builds/win/9e60f34accb4627d7358223862a7e74291886ab6/wasm-binaries.zip, 522793654 Bytes
Unpacking 'D:/wyc/library/wasm/emsdk-1.39.8/zips/9e60f34accb4627d7358223862a7e74291886ab6-wasm-binaries.zip' to 'D:/wyc/library/wasm/emsdk-1.39.8/upstream'
Done installing tool 'releases-upstream-9e60f34accb4627d7358223862a7e74291886ab6-64bit'.
Running post-install step: npm ci ...
Done running: npm ci
Done installing SDK 'sdk-releases-upstream-9e60f34accb4627d7358223862a7e74291886ab6-64bit'.
D:\wyc\library\wasm\emsdk-1.39.8>emsdk activate --embedded 1.39.8
Writing .emscripten configuration file to Emscripten SDK directory D:/wyc/library/wasm/emsdk-1.39.8
The Emscripten configuration file D:\wyc\library\wasm\emsdk-1.39.8\.emscripten has been rewritten with the following contents:
import os
emsdk_path=os.path.dirname(os.environ.get('EM_CONFIG')).replace('\\', '/')
NODE_JS = '' + emsdk_path + '/node/12.9.1_64bit/bin/node.exe'
PYTHON = '' + emsdk_path + '/python/3.7.4_64bit/python.exe'
JAVA = '' + emsdk_path + '/java/8.152_64bit/bin/java.exe'
LLVM_ROOT = '' + emsdk_path + '/upstream/bin'
BINARYEN_ROOT = '' + emsdk_path + '/upstream'
EMSCRIPTEN_ROOT = '' + emsdk_path + '/upstream/emscripten'
TEMP_DIR = '' + emsdk_path + '/tmp'
COMPILER_ENGINE = NODE_JS
JS_ENGINES = [NODE_JS]
Adding directories to PATH:
PATH += D:\wyc\library\wasm\emsdk-1.39.8
PATH += D:\wyc\library\wasm\emsdk-1.39.8\node\12.9.1_64bit\bin
PATH += D:\wyc\library\wasm\emsdk-1.39.8\java\8.152_64bit\bin
PATH += D:\wyc\library\wasm\emsdk-1.39.8\upstream\emscripten
Setting environment variables:
EMSDK = D:/wyc/library/wasm/emsdk-1.39.8
EM_CONFIG = D:\wyc\library\wasm\emsdk-1.39.8\.emscripten
EM_CACHE = D:/wyc/library/wasm/emsdk-1.39.8/.emscripten_cache
EMSDK_NODE = D:\wyc\library\wasm\emsdk-1.39.8\node\12.9.1_64bit\bin\node.exe
EMSDK_PYTHON = D:\wyc\library\wasm\emsdk-1.39.8\python\3.7.4_64bit\python.exe
JAVA_HOME = D:\wyc\library\wasm\emsdk-1.39.8\java\8.152_64bit
Set the following tools as active:
node-12.9.1-64bit
python-3.7.4-64bit
java-8.152-64bit
releases-upstream-9e60f34accb4627d7358223862a7e74291886ab6-64bit
The changes made to environment variables only apply to the currently running shell instance.
Use the 'emsdk_env.bat' to re-enter this environment later, or if you'd like to permanently register
this environment globally to all users in Windows Registry, rerun this command with the option --global.
20:13:08: Checking available ports...
20:13:08: Found 1001 free ports.
20:13:08: Starting D:\wyc\library\wasm\emsdk-1.39.8\python\3.7.4_64bit\python.exe D:/wyc/library/wasm/emsdk-1.39.8/upstream/emscripten/emrun.py --browser chrome --port 30002 --no_emrun_detect --serve_after_close C:/Users/wyc/Documents/web/build/Qt_5_15_2_WebAssembly-Debug/web.html...
Starting browser: C:\Program Files\Google/Chrome/Application/chrome.exe --enable-nacl --enable-pnacl --disable-restore-session-state --enable-webgl --no-default-browser-check --no-first-run --allow-file-access-from-files http://localhost:30002/web.html
20:13:18: D:\wyc\library\wasm\emsdk-1.39.8\python\3.7.4_64bit\python.exe 崩溃。
C:\Qt\5.15.2\wasm_32\bin\qmake.exe -install sed -e s/@APPNAME@/web/g C:/Qt/5.15.2/wasm_32/plugins/platforms/wasm_shell.html
> C:/Users/wyc/Documents/web/build/Qt_5_15_2_WebAssembly-Debug/web.html
copy /y C:\Qt\5.15.2\wasm_32\plugins\platforms\qtloader.js C:\Users\wyc\Documents\web\build\Qt_5_15_2_WebAssembly-Debug
copy /y C:\Qt\5.15.2\wasm_32\plugins\platforms\qtlogo.svg C:\Users\wyc\Documents\web\build\Qt_5_15_2_WebAssembly-Debug
已复制 1 个文件。
已复制 1 个文件。
em++ -s WASM=1 -s FULL_ES2=1 -s FULL_ES3=1 -s USE_WEBGL2=1 -s EXIT_RUNTIME=1 -s ERROR_ON_UNDEFINED_SYMBOLS=1
-s EXTRA_EXPORTED_RUNTIME_METHODS=["UTF16ToString","stringToUTF16"] --bind
-s FETCH=1 -g4
-s WASM=1
-s FULL_ES2=1
-s FULL_ES3=1
-s USE_WEBGL2=1
-s EXIT_RUNTIME=1
-s ERROR_ON_UNDEFINED_SYMBOLS=1
-s EXTRA_EXPORTED_RUNTIME_METHODS=["UTF16ToString","stringToUTF16"] --bind
-s FETCH=1
-s ASSERTIONS=2
-s DEMANGLE_SUPPORT=1
-s GL_DEBUG=1 --profiling-funcs
-s ALLOW_MEMORY_GROWTH=1 --source-map-base http://localhost:8000/
-o .\web.js main.obj mainwindow.obj web.js_plugin_import.obj moc_mainwindow.obj
C:/Qt/5.15.2/wasm_32/plugins/platforms/libqwasm.a
C:/Qt/5.15.2/wasm_32/lib/libQt5EventDispatcherSupport.a
C:/Qt/5.15.2/wasm_32/lib/libQt5FontDatabaseSupport.a
C:/Qt/5.15.2/wasm_32/lib/libqtfreetype.a
C:/Qt/5.15.2/wasm_32/lib/libQt5EglSupport.a
C:/Qt/5.15.2/wasm_32/plugins/imageformats/libqgif.a
C:/Qt/5.15.2/wasm_32/plugins/imageformats/libqicns.a
C:/Qt/5.15.2/wasm_32/plugins/imageformats/libqico.a
C:/Qt/5.15.2/wasm_32/plugins/imageformats/libqjpeg.a
C:/Qt/5.15.2/wasm_32/plugins/imageformats/libqtga.a
C:/Qt/5.15.2/wasm_32/plugins/imageformats/libqtiff.a
C:/Qt/5.15.2/wasm_32/plugins/imageformats/libqwbmp.a
C:/Qt/5.15.2/wasm_32/plugins/imageformats/libqwebp.a
C:/Qt/5.15.2/wasm_32/lib/libQt5Widgets.a
C:/Qt/5.15.2/wasm_32/lib/libQt5Gui.a
C:/Qt/5.15.2/wasm_32/lib/libqtlibpng.a
C:/Qt/5.15.2/wasm_32/lib/libqtharfbuzz.a
C:/Qt/5.15.2/wasm_32/lib/libQt5Core.a
C:/Qt/5.15.2/wasm_32/lib/libqtpcre2.a
cmake
-G "Ninja"
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_TOOLCHAIN_FILE=D:/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake ..
配置
https://blog.csdn.net/u011520181/article/details/134146832
D:\wyc\library\wasm\emsdk-1.39.8;D:\wyc\library\wasm\emsdk-1.39.8\node\12.9.1_64bit\bin;D:\wyc\library\wasm\emsdk-1.39.8\java\8.152_64bit\bin;D:\wyc\library\wasm\emsdk-1.39.8\upstream\emscripten
-42
View File
@@ -1,42 +0,0 @@
https://doc.qt.io/qt-5/wasm.html
https://github.com/emscripten-core/emsdk
https://emscripten.org/docs/getting_started/downloads.html
https://blog.csdn.net/a137748099/article/details/117157623
1.39.8
emsdk install 1.39.8
emsdk activate --embedded 1.39.8
安装完成后配置文件路径
D:/wyc/library/wasm/emsdk-1.39.8/.emscripten
配置文件内容
import os
emsdk_path=os.path.dirname(os.environ.get('EM_CONFIG')).replace('\\', '/')
NODE_JS = '' + emsdk_path + '/node/12.9.1_64bit/bin/node.exe'
PYTHON = '' + emsdk_path + '/python/3.7.4_64bit/python.exe'
JAVA = '' + emsdk_path + '/java/8.152_64bit/bin/java.exe'
LLVM_ROOT = '' + emsdk_path + '/upstream/bin'
BINARYEN_ROOT = '' + emsdk_path + '/upstream'
EMSCRIPTEN_ROOT = '' + emsdk_path + '/upstream/emscripten'
TEMP_DIR = '' + emsdk_path + '/tmp'
COMPILER_ENGINE = NODE_JS
JS_ENGINES = [NODE_JS]
将 C 和 C++ 代码编译为 WebAssembly (WASM) 或 asm.js
WebAssembly (WASM):
一种紧凑的二进制格式,用于在 Web 上运行高性能的代码。它是现代浏览器原生支持的底层字节码格式,旨在作为 JavaScript 的高性能替代方案。
asm.js:
一个高度优化的 JavaScript 子集,主要用于让 JavaScript 在浏览器中接近原生性能运行。它是 WebAssembly 的先驱技术,
通过标准的 JavaScript 引擎运行。
https://blog.evernightfireworks.com/emscripten_config/
import os emsdk_path=os.path.dirname(os.environ.get('EM_CONFIG')).replace('\\', '/') NODE_JS = '' + emsdk_path + '/node/12.9.1_64bit/bin/node.exe' PYTHON = '' + emsdk_path + '/python/3.7.4_64bit/python.exe' JAVA = '' + emsdk_path + '/java/8.152_64bit/bin/java.exe' LLVM_ROOT = '' + emsdk_path + '/upstream/bin' BINARYEN_ROOT = '' + emsdk_path + '/upstream' EMSCRIPTEN_ROOT = '' + emsdk_path + '/upstream/emscripten' TEMP_DIR = '' + emsdk_path + '/tmp' COMPILER_ENGINE = NODE_JS JS_ENGINES = [NODE_JS] Adding directories to PATH: PATH += D:\wyc\library\wasm\emsdk-1.39.8 PATH += D:\wyc\library\wasm\emsdk-1.39.8\node\12.9.1_64bit\bin PATH += D:\wyc\library\wasm\emsdk-1.39.8\java\8.152_64bit\bin PATH += D:\wyc\library\wasm\emsdk-1.39.8\upstream\emscripten Setting environment variables: EMSDK = D:/wyc/library/wasm/emsdk-1.39.8 EM_CONFIG = D:\wyc\library\wasm\emsdk-1.39.8\.emscripten EM_CACHE = D:/wyc/library/wasm/emsdk-1.39.8/.emscripten_cache EMSDK_NODE = D:\wyc\library\wasm\emsdk-1.39.8\node\12.9.1_64bit\bin\node.exe EMSDK_PYTHON = D:\wyc\library\wasm\emsdk-1.39.8\python\3.7.4_64bit\python.exe JAVA_HOME = D:\wyc\library\wasm\emsdk-1.39.8\java\8.152_64bit Set the following tools as active: node-12.9.1-64bit python-3.7.4-64bit java-8.152-64bit releases-upstream-9e60f34accb4627d7358223862a7e74291886ab6-64bit The changes made to environment variables only apply to the currently running shell instance. Use the 'emsdk_env.bat' to re-enter this environment later, or if you'd like to permanently register this environment globally to all users in Windows Registry, rerun this command with the option --global.
-4
View File
@@ -1,4 +0,0 @@
https://www.cnblogs.com/Braveliu/p/13951178.html
https://juejin.cn/post/7240636469461696570
-125
View File
@@ -1,125 +0,0 @@
C:\Users\wyc 放置 .lldbinit 文件 写入
settings set target.load-cwd-lldbinit true
开启权限
clion cmakelist根目录放置.lldbinit
# 查看lldb版本
PS C:\Program Files\JetBrains\CLion 2024.3.3\bin\lldb\win\x64\bin> ./lldb.exe --version
lldb version 9.0.0 (JetBrains IDE bundle; x86_64; rider-lldb-9; build 259)
# 查看帮助文档
PS C:\Program Files\JetBrains\CLion 2024.3.3\bin\lldb\win\x64\bin> ./lldb.exe --help
OVERVIEW: LLDB
USAGE: lldb.exeoptions
ATTACHING:
--attach-name <name> Tells the debugger to attach to a process with the given name.
--attach-pid <pid> Tells the debugger to attach to a process with the given pid.
-n <value> Alias for --attach-name
-p <value> Alias for --attach-pid
--wait-for Tells the debugger to wait for a process with the given pid or name to launch before attaching.
-w Alias for --wait-for
COMMANDS:
--batch Tells the debugger to run the commands from -s, -S, -o & -O, and then quit.
-b Alias for --batch
-K <value> Alias for --source-on-crash
-k <value> Alias for --one-line-on-crash
--local-lldbinit Allow the debugger to parse the .lldbinit files in the current working directory, unless --no-lldbinit is passed.
--no-lldbinit Do not automatically parse any '.lldbinit' files.
--one-line-before-file <command>
Tells the debugger to execute this one-line lldb command before any file provided on the command line has been loaded.
--one-line-on-crash <command>
When in batch mode, tells the debugger to source this file of lldb commands if the target crashes.
--one-line <command> Tells the debugger to execute this one-line lldb command after any file provided on the command line has been loaded.
-O <value> Alias for --one-line-before-file
-o <value> Alias for --one-line
-Q Alias for --source-quietly
--source-before-file <file>
Tells the debugger to read in and execute the lldb commands in the given file, before any file has been loaded.
--source-on-crash <file>
When in batch mode, tells the debugger to source this file of lldb commands if the target crashes.
--source-quietly Tells the debugger to execute this one-line lldb command before any file has been loaded.
--source <file> Tells the debugger to read in and execute the lldb commands in the given file, after any file has been loaded.
-S <value> Alias for --source-before-file
-s <value> Alias for --source
-x Alias for --no-lldbinit
OPTIONS:
--arch <architecture> Tells the debugger to use the specified architecture when starting and running the program.
-a <value> Alias for --arch
--capture-path <filename>
Tells the debugger to use the given filename for the reproducer.
--capture Tells the debugger to capture a reproducer.
--core <filename> Tells the debugger to use the full path to <filename> as the core file.
-c <value> Alias for --core
--debug Tells the debugger to print out extra information for debugging itself.
-d Alias for --debug
--editor Tells the debugger to open source files using the host's "external editor" mechanism.
-e Alias for --editor
--file <filename> Tells the debugger to use the file <filename> as the program to be debugged.
-f <value> Alias for --file
--help Prints out the usage information for the LLDB debugger.
-h Alias for --help
--no-use-colors Do not use colors.
--replay <filename> Tells the debugger to replay a reproducer from <filename>.
--version Prints out the current version number of the LLDB debugger.
-v Alias for --version
-X Alias for --no-use-color
REPL:
-r=<flags> Alias for --repl=<flags>
--repl-language <language>
Chooses the language for the REPL.
--repl=<flags> Runs lldb in REPL mode with a stub process with the given flags.
--repl Runs lldb in REPL mode with a stub process.
-R <value> Alias for --repl-language
-r Alias for --repl
SCRIPTING:
-l <value> Alias for --script-language
--python-path Prints out the path to the lldb.py file for this version of lldb.
-P Alias for --python-path
--script-language <language>
Tells the debugger to use the specified scripting language for user-defined scripts.
EXAMPLES:
The debugger can be started in several modes.
Passing an executable as a positional argument prepares lldb to debug the
given executable. Arguments passed after -- are considered arguments to the
debugged executable.
lldb --arch x86_64 /path/to/program -- --arch arvm7
Passing one of the attach options causes lldb to immediately attach to the
given process.
lldb -p <pid>
lldb -n <process-name>
Passing --repl starts lldb in REPL mode.
lldb -r
Passing --core causes lldb to debug the core file.
lldb -c /path/to/core
Command options can be combined with these modes and cause lldb to run the
specified commands before or after events, like loading the file or crashing,
in the order provided on the command line.
lldb -O 'settings set stop-disassembly-count 20' -o 'run' -o 'bt'
lldb -S /source/before/file -s /source/after/file
lldb -K /source/before/crash -k /source/after/crash
Note: In REPL mode no file is loaded, so commands specified to run after
loading the file (via -o or -s) will be ignored.
-13
View File
@@ -1,13 +0,0 @@
https://blog.csdn.net/yuan2019035055/article/details/145653647
// GIF 动画
https://zhuanlan.zhihu.com/p/349035523
// 主要在这里找的图标
https://fonts.google.com/icons?icon.query=filter+&icon.size=24&icon.color=%235985E1
-7
View File
@@ -1,7 +0,0 @@
scp \\Desktop-npb1d8c/d/clion_remote/cmake-build-rtk-3568-remote/mainProjects/Radarcape_exe_aarch64-buildroot-linux-gnu-gxx_Linux_Release root@192.168.1.222:/root
-12
View File
@@ -1,12 +0,0 @@
https://blog.csdn.net/weixin_34827430/article/details/112457707
多开虚拟桌面
虚拟桌面功能允许你在多个桌面之间切换,适合用于任务分离。
快捷键操作
Win + Ctrl + D:创建一个新的虚拟桌面并自动切换到它。
Win + Ctrl + 左箭头/右箭头:在虚拟桌面之间切换。
Win + Tab:打开任务视图,查看所有当前虚拟桌面。
在任务视图界面右上角点击 “新建桌面” 来创建新的桌面。
Win + Ctrl + F4:关闭当前虚拟桌面(应用和窗口会转移到前一个桌面)。
@@ -1 +0,0 @@
https://zhuanlan.zhihu.com/p/402820328
-74
View File
@@ -1,74 +0,0 @@
![](img/IQ调制图.webp)
这张图展示了射频信号处理中的一个重要概念:IQ解调(In-phase and Quadrature demodulation)。图中详细说明了从模拟信号到数字信号的转换过程,以及如何通过IQ解调来提取信号的信息。以下是各个部分的解释:
### 1. ADC Assembly (模数转换器)
- **Input Signal**: 输入信号是模拟形式的RF信号。
- **ADC**: 模数转换器将输入的模拟信号转换为数字信号。这个过程通常包括采样和量化。
### 2. Digital Filter Assembly (数字滤波器组件)
- **Digital Local Oscillator (DLO)**: 数字本地振荡器生成两个正交信号:
- 同相分量 $cos(2πf_c n Δt)$
- 正交分量 $-sin(2πf_c n Δt)$
### 3. Mixing (混频)
- **Mixing $f_c = f_{LO}$**: 输入信号与本地振荡器产生的同相和正交信号进行混频。
- 同相通道 (I): $I(t) = A(t) \cdot cos[2π (f_c - f_{LO}) t + θ(t)]$
- 正交通道 (Q): $Q(t) = A(t) \cdot sin[2π (f_c - f_{LO}) t + θ(t)]$
### 4. Low Pass Filtering (低通滤波)
- **Low Pass Filter (LPF)**: 混频后的信号通过低通滤波器去除高频成分,保留基带信号。
- 同相分量 $F_s^I$
- 正交分量 $F_s^Q$
### 5. IQ Output
- **I(t)****Q(t)**: 经过低通滤波后的同相和正交信号。
### 6. 解调公式
- **Amplitude Modulation (AM)**:
$$
A(t) ≈ \sqrt{I(t)^2 + Q(t)^2}
$$
- **Phase Modulation (PM)**:
$$
θ(t) ≈ tan^{-1}\left(\frac{Q(t)}{I(t)}\right)
$$
- **Frequency Modulation (FM)**:
$$
FM = \frac{dθ}{dt} \quad (\text{Group Delay})
$$
### 示例解释
假设我们有一个经过GFSK调制的RF信号,其载波频率为 $f_c$ ,并且该信号已经被发送并通过天线接收到了。
1. **ADC Assembly**:
- 输入信号被ADC采样并转换为数字信号。
2. **Digital Filter Assembly**:
- 使用数字本地振荡器生成同相和正交信号。
- 输入信号与这两个信号进行混频。
3. **Mixing**:
- 同相通道 $I(t)$ 和正交通道 $Q(t)$ 通过混频得到。
4. **Low Pass Filtering**:
- 通过低通滤波器去除不需要的高频成分,保留基带信号。
5. **IQ Output**:
- 最终得到的 $I(t)$ 和 $Q(t)$ 是数字化的IQ样本,可以用于后续的信号处理和解调。
### 总结
通过上述步骤,原始的RF信号被转换为数字域中的IQ样本,这些样本包含了信号的幅度和相位信息,可以用于进一步的信号处理和解调。
二进制 => 角度 => IQ
-91
View File
@@ -1,91 +0,0 @@
# IQ调制与解调示例
## 1. 基本概念
- **QPSK**:每个符号代表2比特信息,因此4个不同的相位状态(0°、90°、180°、270°)对应于4种不同的信号状态。
- **载波频率**:假设为 $ f_c $。
- **采样率**:假设为 $ F_s $。
## 2. IQ调制过程
### 输入二进制序列
假设输入的二进制序列为 `1011`
### 映射到星座图
将每两个比特映射到QPSK星座图上的一个点:
- `10` 映射到 $ +\frac{\sqrt{2}}{2} + j \cdot \frac{\sqrt{2}}{2} $
- `11` 映射到 $ -\frac{\sqrt{2}}{2} + j \cdot \frac{\sqrt{2}}{2} $
### 分离I和Q分量
- 对于 `10`
- $ I = \frac{\sqrt{2}}{2} $
- $ Q = \frac{\sqrt{2}}{2} $
- 对于 `11`
- $ I = -\frac{\sqrt{2}}{2} $
- $ Q = \frac{\sqrt{2}}{2} $
### 调制
- 同相分量 $ I(t) $ 与同相载波 $\cos(2\pi f_c t)$ 相乘。
- 正交分量 $ Q(t) $ 与正交载波 $\sin(2\pi f_c t)$ 相乘。
- 最终的调制信号是这两个乘积的和:
$$
s(t) = I(t) \cdot \cos(2\pi f_c t) + Q(t) \cdot \sin(2\pi f_c t)
$$
### 示例计算
假设 $ f_c = 1000 $ Hz$ F_s = 4000 $ Hz。
- 对于 `10`
$$
s_1(t) = \left(\frac{\sqrt{2}}{2}\right) \cdot \cos(2\pi \cdot 1000 \cdot t) + \left(\frac{\sqrt{2}}{2}\right) \cdot \sin(2\pi \cdot 1000 \cdot t)
$$
- 对于 `11`
$$
s_2(t) = \left(-\frac{\sqrt{2}}{2}\right) \cdot \cos(2\pi \cdot 1000 \cdot t) + \left(\frac{\sqrt{2}}{2}\right) \cdot \sin(2\pi \cdot 1000 \cdot t)
$$
## 3. IQ解调过程
### 接收信号
假设接收到的信号为 $ r(t) $,它包含了噪声和其他干扰。
### 解调
- 将接收信号 $ r(t) $ 与同相载波 $\cos(2\pi f_c t)$ 和正交载波 $\sin(2\pi f_c t)$ 进行相关运算。
$$
I'(t) = r(t) \cdot \cos(2\pi f_c t)
$$
$$
Q'(t) = r(t) \cdot \sin(2\pi f_c t)
$$
### 提取I和Q分量
- 从 $ I'(t) $ 和 $ Q'(t) $ 中提取出同相和正交分量。
### 映射回星座图
- 将提取出的 $ I'(t) $ 和 $ Q'(t) $ 映射回星座图上的点。
- 根据星座图上的位置确定对应的二进制值。
### 输出二进制序列
- 将星座图上的点映射回二进制值:
- $ +\frac{\sqrt{2}}{2} + j \cdot \frac{\sqrt{2}}{2} $ 映射为 `10`
- $ -\frac{\sqrt{2}}{2} + j \cdot \frac{\sqrt{2}}{2} $ 映射为 `11`
### 示例计算
假设接收到的信号为 $ r(t) $,包含噪声和干扰。
- 对于 `10`
$$
I'_1(t) = r(t) \cdot \cos(2\pi \cdot 1000 \cdot t)
$$
$$
Q'_1(t) = r(t) \cdot \sin(2\pi \cdot 1000 \cdot t)
$$
- 对于 `11`
$$
I'_2(t) = r(t) \cdot \cos(2\pi \cdot 1000 \cdot t)
$$
$$
Q'_2(t) = r(t) \cdot \sin(2\pi \cdot 1000 \cdot t)
$$
## 总结
通过上述步骤,我们可以看到二进制数据是如何通过IQ调制转换为模拟信号,然后通过IQ解调恢复为原始的二进制数据的。IQ调制和解调的关键在于将信号分解为同相和正交分量,并利用这些分量进行调制和解调。
-67
View File
@@ -1,67 +0,0 @@
### 1. 香农容量定律(Shannon Capacity Theorem
香农容量定律定义了信道的最大数据传输速率,公式为:
$$
C = B \log_2(1 + \text{SNR})
$$
其中:
- $C$ 是信道容量(bps),
- $B$ 是信道的带宽(Hz),
- $\text{SNR}$ 是信噪比(单位:信号功率与噪声功率之比)。
### 2. 香农-哈特利定律(Shannon-Hartley Theorem
香农-哈特利定律描述了带宽有限的信道最大数据传输速率,公式为:
$$
C = B \log_2\left(1 + \frac{P}{N_0 B}\right)
$$
其中:
- $C$ 是信道的最大容量(bps),
- $B$ 是信道的带宽(Hz),
- $P$ 是信号功率(瓦特),
- $N_0$ 是单位带宽内的噪声功率谱密度(瓦特每赫兹)。
### 3. 香农编码定律(Shannon's Noisy-Channel Coding Theorem
香农编码定律表明,信息源的比特速率 $R$ 不能超过信道的容量 $C$,即:
$$
R \leq C
$$
其中:
- $R$ 是信息源的比特速率,
- $C$ 是信道容量。
通过合适的编码方案,传输的错误率可以趋近于零。
### 傅里叶理论:所有信号都可以用 sin 和 cos 表达
#### 1. **傅里叶级数(Fourier Series** - 适用于周期性信号
对于一个周期性信号 $x(t)$,它可以表示为正弦和余弦波的叠加:
$$
x(t) = A_0 + \sum_{n=1}^{\infty} \left[ A_n \cos(2\pi n f_0 t) + B_n \sin(2\pi n f_0 t) \right]
$$
#### 2. **傅里叶变换(Fourier Transform** - 适用于非周期性信号
对于非周期性信号,傅里叶变换将时域信号转换为频域信号,表示为不同频率成分的和:
$$
X(f) = \int_{-\infty}^{\infty} x(t) e^{-j2\pi ft} \, dt
$$
#### 3. **反傅里叶变换(Inverse Fourier Transform**
反傅里叶变换可以将频域信号还原为时域信号:
$$
x(t) = \int_{-\infty}^{\infty} X(f) e^{j2\pi ft} \, df
$$
-117
View File
@@ -1,117 +0,0 @@
### 复傅里叶级数与普通傅里叶级数的转换
#### 1. 复傅里叶级数
复傅里叶级数的标准形式是:
$$
f(x) = \sum_{n=-\infty}^{\infty} c_n e^{inx}
$$
其中,复傅里叶系数 $ c_n $ 通过以下公式计算:
$$
c_n = \frac{1}{2\pi} \int_{-\pi}^{\pi} f(x) e^{-inx} \, dx
$$
#### 2. 普通傅里叶级数(实数形式)
普通傅里叶级数将周期函数表示为正弦和余弦函数的和,通常表示为:
$$
f(x) = a_0 + \sum_{n=1}^{\infty} \left[ a_n \cos(nx) + b_n \sin(nx) \right]
$$
其中,系数 $ a_0 $、$ a_n $ 和 $ b_n $ 分别通过下列积分计算得到:
- $ a_0 $ 是平均值:
$$
a_0 = \frac{1}{2\pi} \int_{-\pi}^{\pi} f(x) \, dx
$$
- $ a_n $ 和 $ b_n $ 是傅里叶系数:
$$
a_n = \frac{1}{\pi} \int_{-\pi}^{\pi} f(x) \cos(nx) \, dx
$$
$$
b_n = \frac{1}{\pi} \int_{-\pi}^{\pi} f(x) \sin(nx) \, dx
$$
#### 3. 复傅里叶级数与普通傅里叶级数的转换
我们可以通过将复指数函数 $ e^{inx} $ 展开为正弦和余弦的组合来实现转换。复指数函数的欧拉公式为:
$$
e^{inx} = \cos(nx) + i\sin(nx)
$$
因此,复傅里叶级数中的 $ c_n e^{inx} $ 和 $ c_{-n} e^{-inx} $ 可以分别表示为:
$$
e^{inx} = \cos(nx) + i\sin(nx)
$$
$$
e^{-inx} = \cos(nx) - i\sin(nx)
$$
我们将复傅里叶级数中的 $ c_n e^{inx} $ 和 $ c_{-n} e^{-inx} $ 代入到普通傅里叶级数中,得到:
$$
f(x) = \sum_{n=-\infty}^{\infty} c_n e^{inx}
$$
展开后得到:
$$
f(x) = \sum_{n=-\infty}^{\infty} c_n \left( \cos(nx) + i\sin(nx) \right)
$$
将正弦和余弦的部分分开:
$$
f(x) = \sum_{n=-\infty}^{\infty} c_n \cos(nx) + i \sum_{n=-\infty}^{\infty} c_n \sin(nx)
$$
#### 4. 复傅里叶系数与普通傅里叶系数的关系
将复傅里叶系数 $ c_n $ 拆解为实部和虚部,设 $ c_n = \frac{1}{2} (a_n - i b_n) $,其中 $ a_n $ 和 $ b_n $ 是我们之前所定义的实数傅里叶系数,则有:
$$
f(x) = \sum_{n=-\infty}^{\infty} \left( \frac{a_n}{2} \cos(nx) - \frac{b_n}{2} \sin(nx) \right)
$$
#### 总结
复傅里叶级数和普通傅里叶级数之间的转换关系为:
- 复傅里叶系数 $ c_n $ 与普通傅里叶系数 $ a_n $ 和 $ b_n $ 的关系是:
$$
c_n = \frac{1}{2} (a_n - i b_n), \quad c_{-n} = \frac{1}{2} (a_n + i b_n)
$$
其中,$ a_n $ 和 $ b_n $ 是正弦和余弦的系数:
$$
a_n = \frac{1}{\pi} \int_{-\pi}^{\pi} f(x) \cos(nx) \, dx
$$
$$
b_n = \frac{1}{\pi} \int_{-\pi}^{\pi} f(x) \sin(nx) \, dx
$$
- 对于 $ c_0 $(常数项):
$$
c_0 = \frac{a_0}{2}
$$
其中,$ a_0 $ 是平均值:
$$
a_0 = \frac{1}{2\pi} \int_{-\pi}^{\pi} f(x) \, dx
$$
-1
View File
@@ -1 +0,0 @@
![img.png](img.png)
@@ -1,65 +0,0 @@
# 二、数字调制:调制信号可以表示为符号或脉冲的时间序列的调制方式
## 1. 振幅键控(ASK/通-断键控(OOK/MASK
- **ASK** (Amplitude Shift Keying)
通过改变载波信号的幅度来表示数字数据
- **OOK** (On-Off Keying)
通过信号的有无表示数字信息,常用于低速传输。
- **MASK** (Masking)
在ASK的基础上增加一定的抗干扰能力,常见于无线通信。
## 2. 频率键控(FSK
- **AFSK** (Audio Frequency Shift Keying)
利用音频频率的变化来表示数字数据,常用于调制解调器(Modem)等。
- **2FSK** (2-Frequency Shift Keying)
使用两个不同频率来表示数字的0和1,常用于数字通信。
- **GFSK** (Gaussian Frequency Shift Keying)
对FSK信号进行高斯滤波,使频率变化更加平滑,降低带宽需求。
- **MSK** (Minimum Shift Keying)
在频率变化上使用最小的频移来达到带宽效率的最大化。
- **GMSK** (Gaussian Minimum Shift Keying)
在MSK的基础上使用高斯滤波,降低带宽,并提高抗干扰能力。
## 3. 相位键控(PSK
- **BPSK** (Binary Phase Shift Keying)
通过改变载波的相位(0°或180°)表示二进制数据0和1,简单且具有较强的抗噪声能力。
- **QPSK** (Quadrature Phase Shift Keying)
使用四个不同的相位(0°, 90°, 180°, 270°)来表示两位二进制数据,带宽效率高。
- **8PSK** (8-Phase Shift Keying)
使用8个不同的相位来表示三位二进制数据,提高了数据传输速率。
## 4. 脉冲调制:用基带信号去改变脉冲的某些参数的调制方式
- **脉冲幅度调制 (PAM)** (Pulse Amplitude Modulation)
通过改变脉冲的幅度表示数字信息,常用于音频信号的传输。
- **脉宽调制 (PWM)** (Pulse Width Modulation)
通过改变脉冲的宽度表示数字信息,广泛应用于调速控制和音频信号的编码。
- **脉位调制 (PPM)** (Pulse Position Modulation)
通过改变脉冲的时间位置表示数字信息,常用于光纤通信和遥控设备。
- **脉冲编码调制 (PCM)** (Pulse Code Modulation)
将模拟信号采样后转换为数字信号,广泛应用于音频信号数字化,如CD音频等。
## 5. 正交幅度调制 (QAM)
- **QAM** (Quadrature Amplitude Modulation)
通过同时调制载波的幅度和相位来表示多位二进制数据,具有较高的带宽效率。
| 类别 | 调制方式 | 描述 | 应用场景 | 特性 |
|--------------------|--------------------------------|----------------------------------------------------------------------|--------------------------------|--------------------------------------|
| **1. 振幅键控(ASK** | **ASK** (Amplitude Shift Keying) | 通过改变载波信号的幅度来表示数字数据 | 低速传输 | 实现简单,但抗噪声能力差 |
| | **OOK** (On-Off Keying) | 通过信号的有无表示数字信息,常用于低速传输。 | 低速数字通信 | 适合低速通信,但对噪声敏感 |
| | **MASK** (Masking) | 在ASK的基础上增加抗干扰能力,常见于无线通信 | 无线通信 | 增强抗干扰能力,适合噪声较大的环境 |
| **2. 频率键控(FSK** | **AFSK** (Audio Frequency Shift Keying) | 利用音频频率的变化来表示数字数据,常用于调制解调器(Modem)等。 | 调制解调器、无线通信 | 频率变化清晰,适合长距离传输 |
| | **2FSK** (2-Frequency Shift Keying) | 使用两个不同频率来表示数字0和1,常用于数字通信 | 数字通信 | 带宽效率一般,但抗干扰较强 |
| | **GFSK** (Gaussian Frequency Shift Keying) | 对FSK信号进行高斯滤波,使频率变化更加平滑,降低带宽需求。 | 无线通信、蓝牙 | 频谱更紧凑,抗干扰性能较强 |
| | **MSK** (Minimum Shift Keying) | 在频率变化上使用最小的频移来最大化带宽效率 | 无线通信、数字通信 | 带宽效率高,适用于高速传输 |
| | **GMSK** (Gaussian Minimum Shift Keying) | 在MSK的基础上使用高斯滤波,降低带宽,并提高抗干扰能力。 | 无线通信、卫星通信、GSM | 带宽低,抗干扰能力强,常用于GSM |
| **3. 相位键控(PSK** | **BPSK** (Binary Phase Shift Keying) | 通过改变载波的相位(0°或180°)表示二进制数据0和1,抗噪声能力较强。 | 卫星通信、无线通信 | 抗噪声能力强,带宽效率低 |
| | **QPSK** (Quadrature Phase Shift Keying) | 使用四个相位(0°, 90°, 180°, 270°)表示两位二进制数据,带宽效率高。 | 数字电视、无线通信 | 带宽效率高,适合高速通信 |
| | **8PSK** (8-Phase Shift Keying) | 使用8个不同相位表示三位二进制数据,提升数据传输速率。 | 高速数据传输 | 带宽利用率高,适合高速数字通信 |
| **4. 脉冲调制** | **PAM** (Pulse Amplitude Modulation) | 通过改变脉冲的幅度表示数字信息,常用于音频信号的传输。 | 音频信号传输 | 实现简单,适用于低带宽应用 |
| | **PWM** (Pulse Width Modulation) | 通过改变脉冲的宽度表示数字信息,广泛应用于调速控制和音频信号编码。 | 控制系统、音频信号编码 | 带宽要求较低,适用于控制和调节信号 |
| | **PPM** (Pulse Position Modulation) | 通过改变脉冲的时间位置表示数字信息,常用于光纤通信和遥控设备。 | 光纤通信、遥控设备 | 带宽较宽,但抗噪声能力较强 |
| | **PCM** (Pulse Code Modulation) | 将模拟信号采样后转换为数字信号,广泛应用于音频信号数字化(如CD音频)。 | 音频信号数字化 | 高质量数字音频,带宽需求大 |
| **5. 正交幅度调制(QAM** | **QAM** (Quadrature Amplitude Modulation) | 通过同时调制载波的幅度和相位来表示多位二进制数据,带宽效率高。 | 数字电视、光纤通信、高速数据通信 | 带宽利用率高,数据传输速率快 |
@@ -1,29 +0,0 @@
# AM 调制公式
### 时域 AM 调制公式
$$
s(t) = A_c \left[ 1 + k_a m(t) \right] \cos(2\pi f_c t)
$$
### 频域 AM 调制公式
$$
S(f) = \frac{A_c}{2} \left[ \delta(f - f_c) + \delta(f + f_c) \right] + \frac{A_c k_a}{2} \left[ M(f - f_c) + M(f + f_c) \right]
$$
其中:
- $ A_c $ 是载波信号的幅度,
- $ f_c $ 是载波频率,
- $ k_a $ 是调制深度,
- $ m(t) $ 是消息信号。
- $ M(f) $ 是消息信号的频谱,
- $ \delta(f) $ 是狄拉克 delta 函数,表示理想的载波频率成分。
AM 调制信号的频谱分布包括:
- 载波频率:$ f_c $,幅度为 $ \frac{A_c}{2} $
- 上边带:$ f_c + f_m $,幅度为 $ \frac{A_c k_a}{2} $
- 下边带:$ f_c - f_m $,幅度为 $ \frac{A_c k_a}{2} $
AM 信号的带宽为 $ 2 f_m $,其中 $ f_m $ 是消息信号的最大频率。
@@ -1,23 +0,0 @@
| 调制方式 | 载波是否存在 | 带宽需求 | 功率效率 | 抗噪声能力 | 特点 |
|----------------------------------|--------------|------------------|----------------|--------------|----------------------------------------------------|
| **AM调制 (Amplitude Modulation)** | 存在 | 最低(带宽大) | 较低 | 差 | 传统的广播调制方式,易受噪声干扰,带宽相对较宽 |
| **双边带调制 (DSBSC)** | 不存在 | 较大(带宽大) | 高(带宽浪费) | 较差 | 抑制载波信号,减少了载波功率浪费,但带宽使用效率较低 |
| **单边带调幅 (SSBSC)** | 不存在 | 较小(带宽小) | 高 | 较强 | 仅保留一个边带,带宽使用效率高,减少功率消耗 |
| **残留边带调制 (VSB)** | 存在 | 中等(介于AM和SSB之间) | 较高 | 较强 | 保留一部分边带,在视频信号传输中较为常用 |
| **独立边带 (ISB)** | 存在 | 较大 | 高 | 较强 | 对于多路信号传输,利用多个边带传输独立信息 |
| **调频 (FM)** | 存在 | 高(带宽需求大) | 较高 | 很强 | 对噪声和干扰有很强的抑制能力,但带宽较大 |
| **调相 (PM)** | 存在 | 中等(带宽介于AM和FM之间) | 较高 | 强 | 通过改变载波相位传输信息,抗噪声能力强,但比FM复杂 |
# 模拟调制:对模拟信号的调制方式
## 1. 幅度调制
- **AM调制** (Amplitude Modulation)
- **双边带调制 (DSBSC)** (Double Sideband Suppressed Carrier)
- **单边带调幅 (SSBSC)** (Single Sideband Suppressed Carrier)
- **残留边带调制 (VSB)** (Vestigial Sideband Modulation)
- **独立边带 (ISB)** (Independent Sideband)
## 2. 角度调制
- **调频 (FM)** (Frequency Modulation)
- **调相 (PM)** (Phase Modulation)
@@ -1,45 +0,0 @@
# PM 调制公式
### 时域 PM 调制公式
$$
s(t) = A_c \cos \left( 2\pi f_c t + k_p m(t) \right)
$$
### 频域 PM 调制公式
$$
S(f) = \frac{A_c}{2} \left[ \delta(f - f_c) + \delta(f + f_c) \right] + \frac{A_c k_p}{2} \sum_{n=-\infty}^{\infty} M(f - f_c + n f_m) \cdot e^{j n \theta}
$$
其中:
- $ A_c $ 是载波信号的幅度,
- $ f_c $ 是载波频率,
- $ k_p $ 是调相系数,
- $ m(t) $ 是消息信号,
- $ M(f) $ 是消息信号的频谱,
- $ \delta(f) $ 是狄拉克 delta 函数,表示理想的载波频率成分,
- $ f_m $ 是消息信号的最大频率,
- $ \theta $ 是与相位变化相关的频率项,$ n $ 表示相位调制的阶数。
### PM 调制信号的频谱分布包括:
- **载波频率**$ f_c $,幅度为 $ \frac{A_c}{2} $
- **频率偏移分量**:位于 $ f_c + n f_m $ 和 $ f_c - n f_m $$ n = 1, 2, 3, \dots $)处,幅度为 $ \frac{A_c k_p}{2} $
### PM 带宽
PM 信号的带宽可以通过以下公式来估算:
$$
B_{\text{PM}} = 2 f_m
$$
其中:
- $ f_m $ 是消息信号的最大频率。
### 总结
PM 调制信号的频谱包括:
- 载波频率:$ f_c $,幅度为 $ \frac{A_c}{2} $
- 上下边带:位于 $ f_c \pm n f_m $,幅度为 $ \frac{A_c k_p}{2} $
PM 信号的带宽是 $ 2 f_m $,其中 $ f_m $ 是消息信号的最大频率。
@@ -1,48 +0,0 @@
# FM 调制公式
### 时域 FM 调制公式
$$
s(t) = A_c \cos \left( 2\pi f_c t + k_f \int_{0}^{t} m(\tau) \, d\tau \right)
$$
### 频域 FM 调制公式
$$
S(f) = \frac{A_c}{2} \left[ \delta(f - f_c) + \delta(f + f_c) \right] + \sum_{n=-\infty}^{\infty} \frac{A_c k_f}{2} \left[ M(f - f_c + n f_m) + M(f + f_c + n f_m) \right]
$$
其中:
- $ A_c $ 是载波信号的幅度,
- $ f_c $ 是载波频率,
- $ k_f $ 是调频系数,
- $ m(t) $ 是消息信号,
- $ M(f) $ 是消息信号的频谱,
- $ \delta(f) $ 是狄拉克 delta 函数,表示理想的载波频率成分,
- $ f_m $ 是消息信号的最大频率。
### FM 调制信号的频谱分布包括:
- **载波频率**$ f_c $,幅度为 $ \frac{A_c}{2} $
- **频率偏移分量**:位于 $ f_c \pm n f_m $$ n = 1, 2, 3, \dots $)处,幅度为 $ \frac{A_c k_f}{2} $
- **上边带**:在 $ f_c + n f_m $ 处,幅度为 $ \frac{A_c k_f}{2} $
- **下边带**:在 $ f_c - n f_m $ 处,幅度为 $ \frac{A_c k_f}{2} $
### FM 带宽
FM 信号的带宽由 **卡森带宽公式** 给出:
$$
B_{\text{FM}} = 2 \left( f_{\Delta} + f_m \right)
$$
其中:
- $ f_{\Delta} = k_f \cdot A_m $ 是频率偏移量,
- $ f_m $ 是消息信号的最大频率。
### 总结
FM 调制信号的频谱包括:
- 载波频率:$ f_c $,幅度为 $ \frac{A_c}{2} $
- 上边带:$ f_c + n f_m $,幅度为 $ \frac{A_c k_f}{2} $
- 下边带:$ f_c - n f_m $,幅度为 $ \frac{A_c k_f}{2} $
FM 信号的带宽是由 **卡森带宽公式** 计算的,带宽为 $ 2 \left( f_{\Delta} + f_m \right) $,其中 $ f_{\Delta} $ 是频率偏移,$ f_m $ 是消息信号的最大频率。
-32
View File
@@ -1,32 +0,0 @@
ADC 模拟信号 => 数字信号
数字是信号的意味着,1.用离散表示连续,2.数值范围固定,因此天然具有两个属性
属性
1. 采样率
2. 量化位数:电压值 到 数字形式 的映射
例如 电压 20v 映射到 [-100, 100],映射规则就采用均匀步进,设置位2,那么就有100个步进
用128,也就是 7个比特位就可以表示,就可以映射到 7个比特位的内存保存起来。类似这种规则,具体
看ADC文档
chatgpt 咒语
给我把上面的话写成 markdown代码框里
公式的话,给我多写一份 markdown格式的 markdown不要\(...)\
行内公式:使用 $...$ 来包围公式,适用于小范围内的公式表示。例如:$A_c$ 和 $f_c$。
块级公式:使用 $$...$$ 来包围公式,以便公式独立占一行并居中显示。例如:$$ s(t) = A_c \left[ 1 + k_a m(t) \right] \cos(2\pi f_c t) $$。
给公式的格式是
频谱公式
频域公式
然后才是其他
https://zhuanlan.zhihu.com/p/687037167
-3
View File
@@ -1,3 +0,0 @@
网站:http://www.sh315.com/
用户名:ytesun
密码:ysdz2015
-13
View File
@@ -1,13 +0,0 @@
https://github.com/OlivierLDff/QtWasmCMake
CMakePresets.json CMakeUserPresets.json
https://cloud.tencent.com/developer/article/2348379
https://cmake.org/cmake/help/v3.31/release/3.30.html#presets
https://cmake.org/cmake/help/v3.31/manual/cmake-presets.7.html#manual:cmake-presets(7)
https://dreampuf.github.io/GraphvizOnline
@@ -1,21 +0,0 @@
Linux命令行与shell脚本编程大全
linux系统的服务管理,早期是SysVinit,现代是systemd
systemd 方法通过将事件与单元文件(unit file)链接来决定运行哪些进程。每个单元文件定
义了特定事件发生时要启动的程序。systemctl 程序允许启动、停止和列出系统中当前运行的
单元文件。
systemd 方法将单元文件划归为目标(target)
我觉得看那些书, 我居然可以从编程角度去理解他, 编程很多的时候就是 找事物之间的相同点与不同点,然后分类
其核心就在于 我如何定义什么是特点
-10
View File
@@ -1,10 +0,0 @@
https://download.qt.io/official_releases/qt/
(推荐)新版本的安装器(4.0.1-1 后)支持 --mirror 命令行参数。
在命令行中执行安装器,添加 --mirror https://mirrors.aliyun.com/qt 参数。
例如 Windows 下执行当前目录的安装器的命令为 .\qt-unified-windows-x86-online.exe --mirror https://mirrors.aliyun.com/qt
.\qt-opensource-windows-x86-5.12.12.exe --mirror https://mirrors.aliyun.com/qt
-47
View File
@@ -1,47 +0,0 @@
@host = 127.0.0.1
#@host = [2409:8a3c:2730:1840:ad89:a71:d6e1:ff67]
#@host = 10.126.126.1
@port = 8317
@bearer = a1234567
@managementKey = a1234567
# http://127.0.0.1:8317/v1
### 获取模型列表
GET http://{{host}}:{{port}}/v1/models
Authorization: Bearer {{bearer}}
### 获取 usage
GET http://{{host}}:{{port}}/v0/management/usage
X-Management-Key: a1234567
### Chat Completions 测试
POST http://{{host}}:{{port}}/v1/chat/completions
Authorization: Bearer {{bearer}}
Content-Type: application/json
{
"model": "gpt-5.4",
"messages": [
{
"role": "user",
"content": "写一个C++ hello world"
}
]
}
###
### Responses API 测试
POST http://{{host}}:{{port}}/v1/responses
Authorization: Bearer {{bearer}}
Content-Type: application/json
{
"model": "gpt-5.4",
"input": "用C++写一个快速排序"
}
-129
View File
@@ -1,129 +0,0 @@
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "BASE=%~dp0"
if "%BASE:~-1%"=="\" set "BASE=%BASE:~0,-1%"
set "LOG_DIR=%BASE%\logs"
set "SERVICE_NAME=cli-proxy-api"
set "NSSM=%BASE%\nssm.exe"
set "APP_EXE=%BASE%\cli-proxy-api.exe"
set "CONFIG_FILE=%BASE%\config.yaml"
set "INSTALL_LOG=%LOG_DIR%\install.log"
if not exist "%LOG_DIR%" mkdir "%LOG_DIR%"
call :log "========== 开始安装/配置服务 =========="
call :log "BASE=%BASE%"
call :log "SERVICE_NAME=%SERVICE_NAME%"
call :log "NSSM=%NSSM%"
if not exist "%NSSM%" (
call :log "错误: 找不到 nssm.exe,路径=%NSSM%"
pause
exit /b 1
)
if not exist "%APP_EXE%" (
call :log "错误: 找不到程序 %APP_EXE%"
pause
exit /b 1
)
if not exist "%CONFIG_FILE%" (
call :log "错误: 找不到配置文件 %CONFIG_FILE%"
pause
exit /b 1
)
sc query "%SERVICE_NAME%" >nul 2>&1
set "SC_ERR=%errorlevel%"
call :log "sc query 返回码=%SC_ERR%"
if "%SC_ERR%"=="0" (
call :log "检测到服务已存在,准备替换"
call :log "尝试停止旧服务"
"%NSSM%" stop "%SERVICE_NAME%" >> "%INSTALL_LOG%" 2>&1
call :log "删除旧服务"
"%NSSM%" remove "%SERVICE_NAME%" confirm >> "%INSTALL_LOG%" 2>&1
if errorlevel 1 (
call :log "错误: 删除旧服务失败"
pause
exit /b 1
)
timeout /t 2 /nobreak >nul
) else if "%SC_ERR%"=="1060" (
call :log "服务不存在,执行全新安装"
) else (
call :log "错误: sc query 检测服务状态失败,返回码=%SC_ERR%"
pause
exit /b 1
)
call :log "安装服务"
"%NSSM%" install "%SERVICE_NAME%" "%APP_EXE%" >> "%INSTALL_LOG%" 2>&1
if errorlevel 1 (
call :log "错误: 安装服务失败"
pause
exit /b 1
)
call :log "设置工作目录"
"%NSSM%" set "%SERVICE_NAME%" AppDirectory "%BASE%" >> "%INSTALL_LOG%" 2>&1
if errorlevel 1 (
call :log "错误: 设置工作目录失败"
pause
exit /b 1
)
call :log "设置启动参数"
"%NSSM%" set "%SERVICE_NAME%" AppParameters "-config ""%CONFIG_FILE%""" >> "%INSTALL_LOG%" 2>&1
if errorlevel 1 (
call :log "错误: 设置启动参数失败"
pause
exit /b 1
)
call :log "设置标准输出日志"
"%NSSM%" set "%SERVICE_NAME%" AppStdout "%LOG_DIR%\out.log" >> "%INSTALL_LOG%" 2>&1
if errorlevel 1 (
call :log "错误: 设置标准输出日志失败"
pause
exit /b 1
)
call :log "设置错误输出日志"
"%NSSM%" set "%SERVICE_NAME%" AppStderr "%LOG_DIR%\err.log" >> "%INSTALL_LOG%" 2>&1
if errorlevel 1 (
call :log "错误: 设置错误输出日志失败"
pause
exit /b 1
)
call :log "设置开机自动启动"
"%NSSM%" set "%SERVICE_NAME%" Start SERVICE_AUTO_START >> "%INSTALL_LOG%" 2>&1
if errorlevel 1 (
call :log "错误: 设置开机自动启动失败"
pause
exit /b 1
)
call :log "启动服务"
"%NSSM%" start "%SERVICE_NAME%" >> "%INSTALL_LOG%" 2>&1
if errorlevel 1 (
call :log "错误: 启动服务命令执行失败"
pause
exit /b 1
)
call :log "========== 服务安装/配置完成 =========="
pause
exit /b 0
:log
echo [%date% %time%] %~1
>> "%INSTALL_LOG%" echo [%date% %time%] %~1
exit /b 0
-57
View File
@@ -1,57 +0,0 @@
api 聚合工具部署
方案
https://zhuanlan.zhihu.com/p/2015874448545326658
./cli-proxy-api --codex-login
# CLIProxyAPI
# 制作api一行就好
https://help.router-for.me/cn/configuration/provider/codex.html
# 配置本地codex使用模拟出来的api
https://help.router-for.me/cn/agent-client/codex.html
通用的 AI IDE 账号管理工具
https://github.com/jlcodes99/cockpit-tools?tab=readme-ov-file
认证信息保存到了
C:\Users\wyc\.cli-proxy-api\codex-cgz4ajo4@fasmtp.com-plus.json
curl http://127.0.0.1:8317/v1/models -H "Authorization: Bearer a1234567"
然后再做 Codex CLI 配置
确保 C:\Users\wyc\.codex\auth.json 也改成一样的值:
{
"OPENAI_API_KEY": "123456"
}
https://github.com/fightroad/nssm/releases
nssm.exe start openai
windows服务配置
./nssm.exe install 服务名 "程序路径"
./nssm.exe set 服务名 AppDirectory "工作目录"
./nssm.exe set 服务名 AppParameters "启动参数"
./nssm.exe set 服务名 Start SERVICE_AUTO_START
./nssm.exe set 服务名 AppStdout "标准输出日志"
./nssm.exe set 服务名 AppStderr "错误输出日志"
./nssm.exe start 服务名
./nssm.exe stop 服务名
./nssm.exe remove 服务名 confirm
./nssm.exe dump 服务名
-47
View File
@@ -1,47 +0,0 @@
#!/usr/bin/env bash
set -e
SSHD_CONFIG="/etc/ssh/sshd_config"
echo "== 开启 X11 Forwarding =="
# 备份
if [ ! -f ${SSHD_CONFIG}.bak ]; then
sudo cp $SSHD_CONFIG ${SSHD_CONFIG}.bak
fi
# 修改函数(不用 sed -i
set_config() {
KEY=$1
VALUE=$2
TMP_FILE=$(mktemp)
sudo awk -v key="$KEY" -v val="$VALUE" '
BEGIN {found=0}
{
if ($1 == key || $1 == "#"key) {
print key" "val
found=1
} else {
print
}
}
END {
if (found==0) print key" "val
}
' $SSHD_CONFIG > $TMP_FILE
sudo cp $TMP_FILE $SSHD_CONFIG
rm -f $TMP_FILE
}
set_config "X11Forwarding" "yes"
set_config "X11DisplayOffset" "10"
set_config "X11UseLocalhost" "yes"
echo "== 重启 SSH 服务 =="
sudo systemctl restart ssh
echo "== 完成 =="
-53
View File
@@ -1,53 +0,0 @@
#!/usr/bin/env bash
set -e
echo "== 更新软件源 =="
sudo apt update
sudo apt upgrade
echo "== 安装基础工具 + SSH =="
sudo apt install -y \
openssh-server nano rsync flex bison texinfo gawk net-tools zsh \
libncurses-dev libtinfo-dev ncurses-term zstd unrar
echo "== 安装构建工具链 =="
sudo apt install -y \
cmake build-essential git pkg-config ninja-build gdb \
linux-tools-common linux-tools-generic linux-tools-$(uname -r) valgrind
echo "== 安装 Qt 基础组件 =="
sudo apt install -y \
qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools
echo "== 安装 Qt 全量开发库 =="
QT_PKGS=$(apt-cache search '^libqt5.*-dev$' | awk '{print $1}')
sudo apt install -y $QT_PKGS
echo "== 安装 Qt 开发工具(QtCreator等) =="
sudo apt install -y \
qttools5-dev qttools5-dev-tools qtcreator
echo "== 安装 mingw 交叉编译工具链 =="
sudo apt install -y \
mingw-w64 gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 binutils-mingw-w64-x86-64
echo "== 安装 Python 环境 =="
sudo apt install -y \
python3 python3-dev python3-pip python3-venv \
python3-setuptools python3-wheel python3-distutils
echo "== 安装桌面相关组件 =="
sudo apt install -y gsettings-desktop-schemas
echo "== 启用 SSH 服务 =="
sudo systemctl enable ssh
sudo systemctl start ssh
echo "== 安装完成 =="
echo ""
echo "⚠️ 提示:"
echo "1. SSH 连接时需要在麒麟系统界面允许连接"
echo "2. 如果只能单向 ping,检查防火墙设置"
echo "3. 输入法配置:ibus-setup"
-35
View File
@@ -1,35 +0,0 @@
{
"WARNING_BANNER": "!!!!!!!!!!!!!!!!!!!! DO NOT SHARE ANY PART OF THE INFORMATION YOU SEE HERE. THIS INFORMATION IS SENSITIVE AND CAN GRANT ACCESS TO YOUR ACCOUNT. SHARING THIS INFORMATION IS LIKE SHARING YOUR PASSWORD. !!!!!!!!!!!!!!!!!!!!",
"user": {
"id": "user-9GGi31ghEhStkj8gtdy8JwDB",
"name": "our",
"email": "itzw@shareallai.com",
"idp": "auth0",
"iat": 1781746607,
"amr": [
"otp",
"urn:openai:amr:otp_email"
],
"mfa": false
},
"expires": "2026-09-16T09:29:52.539Z",
"account": {
"id": "a615e34b-a486-46e9-b11f-f3783ebc7cab",
"planType": "plus",
"structure": "personal",
"isConversationClassifierEnabledForWorkspace": true,
"isFinservEnabledWorkspace": false,
"isFedrampCompliantWorkspace": false,
"isDelinquent": false,
"residencyRegion": "no_constraint",
"computeResidency": "no_constraint"
},
"accessToken": "eyJhbGciOiJSUzI1NiIsImtpZCI6ImFlNjc5NWRjLTRiYWUtNDE4YS04NjVkLTA4YTY0MzllZWRhNiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MSJdLCJjbGllbnRfaWQiOiJhcHBfWDh6WTZ2VzJwUTl0UjNkRTduSzFqTDVnSCIsImh0dHBzOi8vYXBpLm9wZW5haS5jb20vYXV0aCI6eyJhbXIiOlsib3RwIiwidXJuOm9wZW5haTphbXI6b3RwX2VtYWlsIl0sImNoYXRncHRfYWNjb3VudF9pZCI6ImE2MTVlMzRiLWE0ODYtNDZlOS1iMTFmLWYzNzgzZWJjN2NhYiIsImNoYXRncHRfYWNjb3VudF91c2VyX2lkIjoidXNlci05R0dpMzFnaEVoU3RrajhndGR5OEp3REJfX2E2MTVlMzRiLWE0ODYtNDZlOS1iMTFmLWYzNzgzZWJjN2NhYiIsImNoYXRncHRfY29tcHV0ZV9yZXNpZGVuY3kiOiJub19jb25zdHJhaW50IiwiY2hhdGdwdF9wbGFuX3R5cGUiOiJwbHVzIiwiY2hhdGdwdF91c2VyX2lkIjoidXNlci05R0dpMzFnaEVoU3RrajhndGR5OEp3REIiLCJ1c2VyX2lkIjoidXNlci05R0dpMzFnaEVoU3RrajhndGR5OEp3REIifSwiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS9wcm9maWxlIjp7ImVtYWlsIjoiaXR6d0BzaGFyZWFsbGFpLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfSwiaXNzIjoiaHR0cHM6Ly9hdXRoLm9wZW5haS5jb20iLCJwd2RfYXV0aF90aW1lIjoxNzgxNzQ2NjA2NjQwLCJzY3AiOlsib3BlbmlkIiwiZW1haWwiLCJwcm9maWxlIiwib2ZmbGluZV9hY2Nlc3MiLCJtb2RlbC5yZXF1ZXN0IiwibW9kZWwucmVhZCIsIm9yZ2FuaXphdGlvbi5yZWFkIiwib3JnYW5pemF0aW9uLndyaXRlIl0sInNlc3Npb25faWQiOiJhdXRoc2Vzc19KMDN3MXRnNHBvSld1SHhRRndUWmF5OGkiLCJzbCI6dHJ1ZSwic3ViIjoiYXV0aDB8NjgyZDMxY2YwZmVhOTgyMmQ3NmI0Mzk1IiwiaWF0IjoxNzgxNzQ2NjA3LCJleHAiOjE3ODI2MTA2MDcsImp0aSI6IjFkOWI0NGRhODUxZTQ1YWZhYzI4YTA1YjVjYjYyNDA0IiwibmJmIjoxNzgxNzQ2NjA3fQ.Mm4U0g3p3wkoVm7HYN_NIUVHHTzIiWvQYPR5XpMPlc7FcqK9rND2dVOKqZGAPOAUPAiNPC6ZM_xm4ZVnFdyRdw1SXndglQVy0CFHFucCEjlAVjDJIsR5N9vfuJ59Ebz0G3qoo9IFtVCMRhklR9nOJ5x9QJP4Bj_akqVQ4PT8tTpm9RZi-pl3SeLcokaPaHTuOp0ZNH5bQ644xGFPNFJrM5qM4-ogxqt3qWOBg7h0UdRDRDvcOEmtqZH5mjjiLuPLx1OuLSKE03ZaPWvJTGcctBeV2NMRh61FaBOi4ZHGRBbMcy2pRT2_OAVn-h4mspttFVwqwDKp9xb7SIvd7UbE6hWaZBhf466vc11FS4mPNW4chlB_qYISqtCVEmuGFlONby6zTz6ReGd7wPp2JirITNXFHGseqRzx9ZvX9v4-wdkyvOD5oYMgbq0Ub7T4daic_PM3DeARfylTQjumvr3hh7lTaR4m7ENmk6X6LC2cQVCoDnwVfP_TeTFJCVcISMyrHyWGV9hi5ddfC6_U-2gzyJcaHp1mEiHWC68OKoYUHkxplTXhLlk_xVMLio_pHRaow5-3k8Qo82w2Miu2JNVm8Qdi3qFbkNSxJgxiN2D2iJmFA6StnEPW_xaKDrbzhE7EGajAKB2f9PLSnOhCENN6khNmWjFnQk6kEDk6_2bVGlk",
"authProvider": "openai",
"sessionToken": "eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..IaZcGw1Pxf8KzJcN.kBRBFYcDB3EdbBN19fEDzc4V3I5FFxyl_PsyYyiMW_3SC42OjE_zt9oLg2s7tP7UjYIpfEaTDeTtrXhe7uiu5c92Cu0wan_C8ZKldMlt6h6tiYJZeb-QH9ifuNn1RUanJ_JrSUhZzIfrPfHOE5rYW_IB3k2rOsN0alhsAoNJQJHKpF1gmgykAEgOzJg23JZ6jFB-Ou1qS-wa3cEpnDUVvF_Fkavga-d-9K5qi1FnVRQ_njar7f550a7NChS6FG8-XW4bo8m3NIZ8mgGNYofztEPIEPOn_RkoZLfQ1Ro_poOs4yh3DUNkWMMdfpttVA-a3BgyreiipGpohA3jrTNvTFg4lsOq6RPTejg3_Oiw7gvH01ODne-r8Q73wmzgutW6LmwbnkQ1492odjKqm648h6SW2S_FVpHyfWrIjHbiLya4pQcGQ9Noaqj-o_5HYUTQnlH1KjLFXl1Ku6bECBXxr_JoI7YL9PVaCJfbxMJgT100ZFcF6hjz1cy5JzjO6Cs32Madk6Rt5tnz9SJ6-SDK4xnmAq4J9DmOAnD4NCj9jcYit_gLRbuvMir448f084FLF8ImTJgtDH1GS98asWuVbGudPR0GeMsaJHr-y1a0mr0Mrmk3q98nAMqLas4MdupwsUJ1gf5Iu064jv20AxA9eIGE9vxMVj5FaTbRpQIUkXQZufMH0SP9Xcq78n1nT8Kv-HfBZseQ-VLuYtsMz3iRf4uQmPsjpyieiibR6ibbuMaAzS_mYA3L8vXGVjtbf4xfAldkUlOAJWQG-e-nD4cntkmDh5cXLbaIHMrtJZIPOR1_sJ7TVP8pA40ybT_mUYyVWi8M0dQ0ehsrm4iF37c2AXk_fygTifkqwVbZRCCm-fWcTnPX8HH6MxL9_vthJi9U0G6c3t8awdmS73eoELY43MqNAih07tYJX7wkiutBUluU3NwO4RLinQ6WsTIM6gTjMCA5Fda1bVTS_ZLbrr2ZTzEpoTs3kzePILSbBB_mZUC9PZIo1bu6Fcj1nYWZA8AZppKD_E-nXC5YVIahSpUzb6D-IyKOFvgtBcQ4yiyLC9tDDJiKxZwQUCYgS8qFvzCH5cVXWyAAV2jR23kJZhWQlkEynnD1NZhC0kk3Nk9SixsZlpRdobzxmX-j2tb0tFcm14aIclYTYpfz9OxwyBBlWLDu42dWQgoPuRfY9QjGX3SMJTbsTjDGMjCVVQeyVQ260UcSViDeaYVINHqOLBfBGVMat2dXeiIf-f6T_8g2vZkuJlch2f_DHuZ-SRKocuNyLhFvCcRs3McQAoCviJM5_YavjWpZlYD67C3PEMVyKPxd4hL7xpZ3CbaKoC95ubtbFQzQ_2IxtKq_hzNOMR6_MmRKuUXSENLEFO7yqutUU3GZw1iL59efWCUyLENwpMqBxHmv2T2zayVIE9BapeU0t9_46w1f4Kf6izJdVueI__eHWdsZwBs_MCbEoct-5niHfUU8XQ9PwrtLAfWRs9As1LvzPPQP_PK2_9J0DZ8BGDzecJwUVsGybCIdGe8rx4f6TgD5-8UdeUpKwIVmsHTzoUHcIRqVoFg_qOy4VZbbnDJ4cyL-i2_PNFNXDI0RERqCxwEh3VDxZlCQOg7-SHNWo6XsK4khHlPE34uumOs_-6USj0pDj5P4tkQdZaXb27XNLELApDXXXCxaWbyfdS8AbJRyE3tsslrBvhVqSfYxPmsWkAuUQXZcLG6_Hbu_hH9oFGjiHzqX2LgsaffQDmTM-pCiXtUxO5DGfWQ2jLJQ0f_vop8eQShUbbxjza8zMaNzP3mA_MXiyl_NuCtPokmATj1u45njG_CG4uS4eauFPDVALlYJ8-Z6OwUE8ko22SSV-Hx5UE4vPPcGNCN_xPk9Tapml0Vx7NhfwlnNHBbPkMIZjq6ZJMY5opyzkFiytQop3_3KBgFeZ-F-sVF1BQUNUIJIE7se32nfNF7RcfkFilShDAGLRjtTME8WiRrmJQiLu1v7x4PG3AuY7wiR5wmUYGYb4n9GqZCvJxn-G7GicANQLE9tt0reQMgL9aIrMJvJUko_7zLAI_oBfTVfru1jLk2LLY_Ou_gdCQfTMXmILZcGfyN-qrRP9X4K6Nt4It2_w_B8LrwFoGkpxqE7Mh81M7-oa-n82bKO9Z0KtcwwiOq8XFC-42mwJPTOgQRN9pZmpoLR3kEc9XSlK574YNVhgviE4zSCno6VKotwGnWfv_o-xtj0lQCtFG8bxhq01Zu58z_0zdrEF0QAKOQjc6blfdqGnmM2rFqkkN_FagvhK1jbKmSikR2VLR0AlpRN8d79vhQ0QE2axJyy9EbHvQdr7GazXr14GuhhB7L1FtIZY54mjcvbmsy9QkIDFnUJ9xahMxxFX8g9DJvlGHd9b3uJhgHk4uMUmfQ6c8sypWxIOVdDg4YVDGS9mLMSY28y8ZfIhdS0TM7WrMvS4zPod1mfQoA9O_Y816YwT7nYG1064hN-EYRz-4QJbQLpoTZjblLr-CNIQCYklfDTvsZwqT_x3_qAPEPijz6KPGpBQLrIUNeZYrnhl4caoZgxL2lS5L_Hvu8WaTn9Xn3r-ZrZJl43q5TpcK7gKY1QREIubY6oLDu4sjrf7IjGvLy3mcKLxe6QQSfwFmSJTP5e9d3Sc_piRvrusG2vm4RG-WWhxMGR-vff9zRQgpSav5Gn8DOG1nnDUE_AGocMm1xFln4qmYYDrhUX54KB8v-iVFxtnDM-scH2v2inTHrDAFZHJvexuEW9eilhrIDPZwEZ7Udt4-K0Mkve2FBaw9xA1haBwpIP3qwKwrGjj4AfsCYEBWscbYxAhAjUTbLDuLadfUJnw4sTvWeN3OyFAPJy_4qKGEhkZaX-Y-sukgQVHVmLhbS-jlNTuNUHtlfiSIbLMza7XZYkBoM1EXQJybpWpJGOg6hsmvFaVPlalYDg8aC78-ShGD20gFhbPJkBog2bftrMagms__3XzHNhiD_yfGdTd8N0HA7Gz-r4gCkzDN6LGh7dLWrw_vpUMU1eC2GNAqb-vlmS93RP61MbXFdPtHDn5ifc-npMbl7okuZTwOZRg4IOmzu7dvXLDBqs2zPZ01qef0Oq-sVJET__HPByfxEW1wXuMczWdBRb80yTASyw7YKTii3mKI6b-Ek6oTwb4DeTRX5JhwIH5OspySIcCEGkstpZG2DYaUANtncBbwHSgFaJ353Y-YgJ2d0tLtZv-KSFBFRR2INzy-TLD-wtd0wXDxoSJ1Jl_pIT27X_uz9bUNELFttK_gvYhZJwSLjKsU5rLkHSypVsoA8jJInmlSDfhdMYddDNuMDMKIhmpeuhlexciAWFESA6oxiRXAlxMlduerbKgi9uDQwU25BbrU-T-ZB7dZ8oaUy6xLJbz-BUPICUeupvPjc64q3sUqP4Rh4JdkKEmcIGfZPZrI59lcZMqP2zU6nkbb0tGuEnGG77-uNrd-bOAdUDi-Y_TptS4K2IcXjBzSq4-p5Ms5tR-V5LOHpF-Q6ODpwrctLXRFWjfKJeWf7S4b0Uho_GKlw43KTRnFeCAs1Lg1SqtS9qqfUJ-xexoHcySoAkpvCKR1ptZjhOVxwupCrFBtcgRG8qUIPWCOZkekIXsWfXPeDJi1_JMaosDHGMdLAC8wgzgCdGpAqXqDtvQ-14_VPsjpHdSAcSST_Vzp-oEMhR1Ewq8M5Fpi7E5MicwibODEtQJ5ozLzUPr2nkxK0a_Ac6rY3_rJnKUNRu8mhLIOhL9ZHSwYsQQkjee5iCch-tssd3GLV3XUFnMLOapkwxynN4NPJRUwJrwSkvIgNFp6-NB-b780ny6eRiupbYBz1o7GsgxlPYQ1AKvKXvH9-gtckrQ52OMpQVB55TDHupzsbvdjUEBZHF6savnyf4FxMBu-O6mTiovpq7SZ1-lVuxCdXlt2IDB5A1gwakb5hlbWMGNfjLuh3g2WQfFw.JBF8zWx07f-7UGgSU2_rJg",
"rumViewTags": {
"light_account": {
"fetched": false
}
}
}
-5
View File
@@ -1,5 +0,0 @@
https://chat.openai.com/api/auth/session
eyJhbGciOiJSUzI1NiIsImtpZCI6ImFlNjc5NWRjLTRiYWUtNDE4YS04NjVkLTA4YTY0MzllZWRhNiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MSJdLCJjbGllbnRfaWQiOiJhcHBfWDh6WTZ2VzJwUTl0UjNkRTduSzFqTDVnSCIsImh0dHBzOi8vYXBpLm9wZW5haS5jb20vYXV0aCI6eyJhbXIiOlsib3RwIiwidXJuOm9wZW5haTphbXI6b3RwX2VtYWlsIl0sImNoYXRncHRfYWNjb3VudF9pZCI6ImE2MTVlMzRiLWE0ODYtNDZlOS1iMTFmLWYzNzgzZWJjN2NhYiIsImNoYXRncHRfYWNjb3VudF91c2VyX2lkIjoidXNlci05R0dpMzFnaEVoU3RrajhndGR5OEp3REJfX2E2MTVlMzRiLWE0ODYtNDZlOS1iMTFmLWYzNzgzZWJjN2NhYiIsImNoYXRncHRfY29tcHV0ZV9yZXNpZGVuY3kiOiJub19jb25zdHJhaW50IiwiY2hhdGdwdF9wbGFuX3R5cGUiOiJwbHVzIiwiY2hhdGdwdF91c2VyX2lkIjoidXNlci05R0dpMzFnaEVoU3RrajhndGR5OEp3REIiLCJ1c2VyX2lkIjoidXNlci05R0dpMzFnaEVoU3RrajhndGR5OEp3REIifSwiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS9wcm9maWxlIjp7ImVtYWlsIjoiaXR6d0BzaGFyZWFsbGFpLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfSwiaXNzIjoiaHR0cHM6Ly9hdXRoLm9wZW5haS5jb20iLCJwd2RfYXV0aF90aW1lIjoxNzgxNzQ2NjA2NjQwLCJzY3AiOlsib3BlbmlkIiwiZW1haWwiLCJwcm9maWxlIiwib2ZmbGluZV9hY2Nlc3MiLCJtb2RlbC5yZXF1ZXN0IiwibW9kZWwucmVhZCIsIm9yZ2FuaXphdGlvbi5yZWFkIiwib3JnYW5pemF0aW9uLndyaXRlIl0sInNlc3Npb25faWQiOiJhdXRoc2Vzc19KMDN3MXRnNHBvSld1SHhRRndUWmF5OGkiLCJzbCI6dHJ1ZSwic3ViIjoiYXV0aDB8NjgyZDMxY2YwZmVhOTgyMmQ3NmI0Mzk1IiwiaWF0IjoxNzgxNzQ2NjA3LCJleHAiOjE3ODI2MTA2MDcsImp0aSI6IjFkOWI0NGRhODUxZTQ1YWZhYzI4YTA1YjVjYjYyNDA0IiwibmJmIjoxNzgxNzQ2NjA3fQ.Mm4U0g3p3wkoVm7HYN_NIUVHHTzIiWvQYPR5XpMPlc7FcqK9rND2dVOKqZGAPOAUPAiNPC6ZM_xm4ZVnFdyRdw1SXndglQVy0CFHFucCEjlAVjDJIsR5N9vfuJ59Ebz0G3qoo9IFtVCMRhklR9nOJ5x9QJP4Bj_akqVQ4PT8tTpm9RZi-pl3SeLcokaPaHTuOp0ZNH5bQ644xGFPNFJrM5qM4-ogxqt3qWOBg7h0UdRDRDvcOEmtqZH5mjjiLuPLx1OuLSKE03ZaPWvJTGcctBeV2NMRh61FaBOi4ZHGRBbMcy2pRT2_OAVn-h4mspttFVwqwDKp9xb7SIvd7UbE6hWaZBhf466vc11FS4mPNW4chlB_qYISqtCVEmuGFlONby6zTz6ReGd7wPp2JirITNXFHGseqRzx9ZvX9v4-wdkyvOD5oYMgbq0Ub7T4daic_PM3DeARfylTQjumvr3hh7lTaR4m7ENmk6X6LC2cQVCoDnwVfP_TeTFJCVcISMyrHyWGV9hi5ddfC6_U-2gzyJcaHp1mEiHWC68OKoYUHkxplTXhLlk_xVMLio_pHRaow5-3k8Qo82w2Miu2JNVm8Qdi3qFbkNSxJgxiN2D2iJmFA6StnEPW_xaKDrbzhE7EGajAKB2f9PLSnOhCENN6khNmWjFnQk6kEDk6_2bVGlk
-11
View File
@@ -1,11 +0,0 @@
aider --chat-language chinese --chat-mode ask
aider --chat-language chinese --gui
ctrl + L 视觉清屏
/clear
-2
View File
@@ -1,2 +0,0 @@
# C:\msys64\msys2_shell.cmd
# -mingw64 -defterm -no-start -here
-114
View File
@@ -1,114 +0,0 @@
破解clion
https://3.jetbra.in/
https://jb.1157pt.top/
2024.3 新版激活注意事项
设置->外观与行为->语言及地区->不要设置成中国大陆
LLDB 乱码
https://blog.csdn.net/gitblog_07374/article/details/148683197
安装的时候首先找到 /aenv/jetbra/scripts/install.sh 执行
检查 clion64.vmoptions 注意不是 jetbrains_client64.vmoptions
windows下是 clion64.exe.vmoptions
加上这几行
--add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED
--add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED
-javaagent:/aenv/jetbra/ja-netfilter.jar=jetbrains
cmake 子命令乱码 解决修改cmd.exe 永久为utf8
https://blog.csdn.net/h_hxx/article/details/105730043
代理成功会出现下面的几行
============================================================================
ja-netfilter 2022.2.0
A javaagent framework :)
https://github.com/ja-netfilter/ja-netfilter
============================================================================
tar -czvf a.tar.gz ./aa
tar -xzvf a.tar.gz
sudo chown <新用户> <文件路径>
注意文件所属的用户要是 你自己的那个用户
权限必须是
所有者 读取和写入
组 只能读取
其他 只能读取
[Desktop Entry]
Name=clion
Comment=Multi-platform code editor for Linux
Exec=/aenv/clion/bin/clion.sh
Icon=/aenv/clion/bin/clion.png
Type=Application
Categories=GNOME;GTK;Utility;
#Terminal=true
参考 /usr/share/applications
shift+ctrl+alt+/
Clion 插件开发
C:\Program Files\JetBrains\IntelliJ IDEA 2024.3.5\plugins\maven\lib\maven3\conf\settings.xml
官网文档
https://plugins.jetbrains.com/docs/intellij/welcome.html
<mirror>
<id>mirrorId</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
IDEA 插件开发教程
https://www.cnblogs.com/moutory/p/17752679.html
gradle代理 gradle.properties文件添加
# HTTP
systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=9081
# HTTPS
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=9081
# no strict
systemProp.http.proxyStrict=false
systemProp.https.proxyStrict=false
-14
View File
@@ -1,14 +0,0 @@
AI Coding
JO4UZMDPWOGOW1E-eyJsaWNlbnNlSWQiOiJKTzRVWk1EUFdPR09XMUUiLCJsaWNlbnNlZU5hbWUiOiJtZW5vcmFoIHBhcmFwZXQiLCJsaWNlbnNlZVR5cGUiOiJQRVJTT05BTCIsImFzc2lnbmVlTmFtZSI6IiIsImFzc2lnbmVlRW1haWwiOiIiLCJsaWNlbnNlUmVzdHJpY3Rpb24iOiIiLCJjaGVja0NvbmN1cnJlbnRVc2UiOmZhbHNlLCJwcm9kdWN0cyI6W3siY29kZSI6IlBBSUNPRElORyIsImZhbGxiYWNrRGF0ZSI6IjIwMjYtMDktMTQiLCJwYWlkVXBUbyI6IjIwMjYtMDktMTQiLCJleHRlbmRlZCI6ZmFsc2V9XSwibWV0YWRhdGEiOiIwMjIwMjQwNzAyUFNBWDAwMDAwM1giLCJoYXNoIjoiMTIzNDU2NzgvMDEyOTE0NTA4MzIiLCJncmFjZVBlcmlvZERheXMiOjcsImF1dG9Qcm9sb25nYXRlZCI6ZmFsc2UsImlzQXV0b1Byb2xvbmdhdGVkIjpmYWxzZSwidHJpYWwiOmZhbHNlLCJhaUFsbG93ZWQiOnRydWV9-bNu+WKDj0C4TkoTlsNZlHv26tHZqi6fzzhdHZj70ptx2hb7GwWsGoPWHbXieLKWLsFw3/Pexe8wz/2IFrWr6+yJyAbzxqg6qQ2lBEKZwzMVk9QjBd/YInC/tgeww+PLv7mo+z9pJWvi0GOWK0rM/QhsJAtPrYBQ2cqMiyKU1oCWYyUwqhd9IyZWmX37rPEPbWj5Ux9edLIJzP9Eji+GrlS2bUFBboaBgfdb7YEKq1tgrpX4ZWrhD4OOnMm1pWkH9QUbOXbbff5BngX/37GqCANDukWr3nMoFg2h5wdOYX4qwL+y04TJtb98tDt6TFxmVy14gzzFYL1YEuGph0dzMZA==-MIIETDCCAjSgAwIBAgIBDTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTIwMTAxOTA5MDU1M1oXDTIyMTAyMTA5MDU1M1owHzEdMBsGA1UEAwwUcHJvZDJ5LWZyb20tMjAyMDEwMTkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCUlaUFc1wf+CfY9wzFWEL2euKQ5nswqb57V8QZG7d7RoR6rwYUIXseTOAFq210oMEe++LCjzKDuqwDfsyhgDNTgZBPAaC4vUU2oy+XR+Fq8nBixWIsH668HeOnRK6RRhsr0rJzRB95aZ3EAPzBuQ2qPaNGm17pAX0Rd6MPRgjp75IWwI9eA6aMEdPQEVN7uyOtM5zSsjoj79Lbu1fjShOnQZuJcsV8tqnayeFkNzv2LTOlofU/Tbx502Ro073gGjoeRzNvrynAP03pL486P3KCAyiNPhDs2z8/COMrxRlZW5mfzo0xsK0dQGNH3UoG/9RVwHG4eS8LFpMTR9oetHZBAgMBAAGjgZkwgZYwCQYDVR0TBAIwADAdBgNVHQ4EFgQUJNoRIpb1hUHAk0foMSNM9MCEAv8wSAYDVR0jBEEwP4AUo562SGdCEjZBvW3gubSgUouX8bOhHKQaMBgxFjAUBgNVBAMMDUpldFByb2ZpbGUgQ0GCCQDSbLGDsoN54TATBgNVHSUEDDAKBggrBgEFBQcDATALBgNVHQ8EBAMCBaAwDQYJKoZIhvcNAQELBQADggIBABKaDfYJk51mtYwUFK8xqhiZaYPd30TlmCmSAaGJ0eBpvkVeqA2jGYhAQRqFiAlFC63JKvWvRZO1iRuWCEfUMkdqQ9VQPXziE/BlsOIgrL6RlJfuFcEZ8TK3syIfIGQZNCxYhLLUuet2HE6LJYPQ5c0jH4kDooRpcVZ4rBxNwddpctUO2te9UU5/FjhioZQsPvd92qOTsV+8Cyl2fvNhNKD1Uu9ff5AkVIQn4JU23ozdB/R5oUlebwaTE6WZNBs+TA/qPj+5/we9NH71WRB0hqUoLI2AKKyiPw++FtN4Su1vsdDlrAzDj9ILjpjJKA1ImuVcG329/WTYIKysZ1CWK3zATg9BeCUPAV1pQy8ToXOq+RSYen6winZ2OO93eyHv2Iw5kbn1dqfBw1BuTE29V2FJKicJSu8iEOpfoafwJISXmz1wnnWL3V/0NxTulfWsXugOoLfv0ZIBP1xH9kmf22jjQ2JiHhQZP7ZDsreRrOeIQ/c4yR8IQvMLfC0WKQqrHu5ZzXTH4NO3CwGWSlTY74kE91zXB5mwWAx1jig+UXYc2w4RkVhy0//lOmVya/PEepuuTTI4+UJwC7qbVlh5zfhj8oTNUXgN0AOc+Q0/WFPl1aw5VV/VrO8FCoB15lFVlpKaQ1Yh+DVU8ke+rt9Th0BCHXe0uZOEmH0nOnH/0onD
ChatGPT Coding
W6LOGT27JP2A08B-eyJsaWNlbnNlSWQiOiJXNkxPR1QyN0pQMkEwOEIiLCJsaWNlbnNlZU5hbWUiOiJtZW5vcmFoIHBhcmFwZXQiLCJsaWNlbnNlZVR5cGUiOiJQRVJTT05BTCIsImFzc2lnbmVlTmFtZSI6IiIsImFzc2lnbmVlRW1haWwiOiIiLCJsaWNlbnNlUmVzdHJpY3Rpb24iOiIiLCJjaGVja0NvbmN1cnJlbnRVc2UiOmZhbHNlLCJwcm9kdWN0cyI6W3siY29kZSI6IlBDSEFUR1BUQ09ESU5HIiwiZmFsbGJhY2tEYXRlIjoiMjAyNi0wOS0xNCIsInBhaWRVcFRvIjoiMjAyNi0wOS0xNCIsImV4dGVuZGVkIjpmYWxzZX1dLCJtZXRhZGF0YSI6IjAyMjAyNDA3MDJQU0FYMDAwMDA1WCIsImhhc2giOiIxMjM0NTY3OC8wMTMxOTUyNDQzMSIsImdyYWNlUGVyaW9kRGF5cyI6NywiYXV0b1Byb2xvbmdhdGVkIjpmYWxzZSwiaXNBdXRvUHJvbG9uZ2F0ZWQiOmZhbHNlLCJ0cmlhbCI6ZmFsc2UsImFpQWxsb3dlZCI6dHJ1ZX0=-A2nfIz02lGFfZlgppxlEiay4Jcc5ry+pdifnAwmukbAH8Q8z5yJTBSTYT/fF8YcZ6oqw9AnsCZ33V4+hAmWWxaCkE4Y6j2T5W4INb1PRN/wkfL9Pktl69KhTtqAvZTDlp2ynd4jhvqnHiihsBsz+sYbUcFbtFkYwxEjwWjeTO5q7crnnQvtoWn1JZizbewJPdXYJCBgmVI4ghNd0UcxFwZqgOHc9Uk4X6aDT64wznZlXyZ+fO3IhKNEWzveV6u/L006eUo7MeO+vphSN5bK/pLg+Zfcp52b3lGfyQZAleZJiEKKU9V/UxbMEn2DrQaSLxsz71sB4Gns9fqrIqXFBBA==-MIIETDCCAjSgAwIBAgIBDTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTIwMTAxOTA5MDU1M1oXDTIyMTAyMTA5MDU1M1owHzEdMBsGA1UEAwwUcHJvZDJ5LWZyb20tMjAyMDEwMTkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCUlaUFc1wf+CfY9wzFWEL2euKQ5nswqb57V8QZG7d7RoR6rwYUIXseTOAFq210oMEe++LCjzKDuqwDfsyhgDNTgZBPAaC4vUU2oy+XR+Fq8nBixWIsH668HeOnRK6RRhsr0rJzRB95aZ3EAPzBuQ2qPaNGm17pAX0Rd6MPRgjp75IWwI9eA6aMEdPQEVN7uyOtM5zSsjoj79Lbu1fjShOnQZuJcsV8tqnayeFkNzv2LTOlofU/Tbx502Ro073gGjoeRzNvrynAP03pL486P3KCAyiNPhDs2z8/COMrxRlZW5mfzo0xsK0dQGNH3UoG/9RVwHG4eS8LFpMTR9oetHZBAgMBAAGjgZkwgZYwCQYDVR0TBAIwADAdBgNVHQ4EFgQUJNoRIpb1hUHAk0foMSNM9MCEAv8wSAYDVR0jBEEwP4AUo562SGdCEjZBvW3gubSgUouX8bOhHKQaMBgxFjAUBgNVBAMMDUpldFByb2ZpbGUgQ0GCCQDSbLGDsoN54TATBgNVHSUEDDAKBggrBgEFBQcDATALBgNVHQ8EBAMCBaAwDQYJKoZIhvcNAQELBQADggIBABKaDfYJk51mtYwUFK8xqhiZaYPd30TlmCmSAaGJ0eBpvkVeqA2jGYhAQRqFiAlFC63JKvWvRZO1iRuWCEfUMkdqQ9VQPXziE/BlsOIgrL6RlJfuFcEZ8TK3syIfIGQZNCxYhLLUuet2HE6LJYPQ5c0jH4kDooRpcVZ4rBxNwddpctUO2te9UU5/FjhioZQsPvd92qOTsV+8Cyl2fvNhNKD1Uu9ff5AkVIQn4JU23ozdB/R5oUlebwaTE6WZNBs+TA/qPj+5/we9NH71WRB0hqUoLI2AKKyiPw++FtN4Su1vsdDlrAzDj9ILjpjJKA1ImuVcG329/WTYIKysZ1CWK3zATg9BeCUPAV1pQy8ToXOq+RSYen6winZ2OO93eyHv2Iw5kbn1dqfBw1BuTE29V2FJKicJSu8iEOpfoafwJISXmz1wnnWL3V/0NxTulfWsXugOoLfv0ZIBP1xH9kmf22jjQ2JiHhQZP7ZDsreRrOeIQ/c4yR8IQvMLfC0WKQqrHu5ZzXTH4NO3CwGWSlTY74kE91zXB5mwWAx1jig+UXYc2w4RkVhy0//lOmVya/PEepuuTTI4+UJwC7qbVlh5zfhj8oTNUXgN0AOc+Q0/WFPl1aw5VV/VrO8FCoB15lFVlpKaQ1Yh+DVU8ke+rt9Th0BCHXe0uZOEmH0nOnH/0onD
AI Commit
W2OA9ZDPCW9WOCS-eyJsaWNlbnNlSWQiOiJXMk9BOVpEUENXOVdPQ1MiLCJsaWNlbnNlZU5hbWUiOiJtZW5vcmFoIHBhcmFwZXQiLCJsaWNlbnNlZVR5cGUiOiJQRVJTT05BTCIsImFzc2lnbmVlTmFtZSI6IiIsImFzc2lnbmVlRW1haWwiOiIiLCJsaWNlbnNlUmVzdHJpY3Rpb24iOiIiLCJjaGVja0NvbmN1cnJlbnRVc2UiOmZhbHNlLCJwcm9kdWN0cyI6W3siY29kZSI6IlBDQUlDT01NSVRBUFAiLCJmYWxsYmFja0RhdGUiOiIyMDI2LTA5LTE0IiwicGFpZFVwVG8iOiIyMDI2LTA5LTE0IiwiZXh0ZW5kZWQiOmZhbHNlfV0sIm1ldGFkYXRhIjoiMDIyMDI0MDcwMlBTQVgwMDAwMDVYIiwiaGFzaCI6IjEyMzQ1Njc4LzAtMzAyMTQ1MTM3IiwiZ3JhY2VQZXJpb2REYXlzIjo3LCJhdXRvUHJvbG9uZ2F0ZWQiOmZhbHNlLCJpc0F1dG9Qcm9sb25nYXRlZCI6ZmFsc2UsInRyaWFsIjpmYWxzZSwiYWlBbGxvd2VkIjp0cnVlfQ==-EmlariDbts+RE5FFr/BodN6TJNTu158KRW88xw66yzRBS3w6Ce1w/r35AuGFG46qZy6+4BftNoG7WHL7m3c+hV8tx9dL/bp9VB1yHupjbKhbrVZoLQcY6C6yCneAWbwAqQsjBVQHXesNfJTAeGTbB5faYjzuWY279QebTooVmiBsX35+F8/emFPQP5JLr1wa14Wq0a74flWowYDQteOkjdNjOybJod8vPerRMcd1RqVuLS//ILxzxIxsZNrK50a6j4pXJLc4HaF8Tv5DZ80wBBPbfod0RGan+EHYU0WjE0B3acZlYnI9suTRT0bwtqvnOuzewHzm6UGW40qecKLneQ==-MIIETDCCAjSgAwIBAgIBDTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTIwMTAxOTA5MDU1M1oXDTIyMTAyMTA5MDU1M1owHzEdMBsGA1UEAwwUcHJvZDJ5LWZyb20tMjAyMDEwMTkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCUlaUFc1wf+CfY9wzFWEL2euKQ5nswqb57V8QZG7d7RoR6rwYUIXseTOAFq210oMEe++LCjzKDuqwDfsyhgDNTgZBPAaC4vUU2oy+XR+Fq8nBixWIsH668HeOnRK6RRhsr0rJzRB95aZ3EAPzBuQ2qPaNGm17pAX0Rd6MPRgjp75IWwI9eA6aMEdPQEVN7uyOtM5zSsjoj79Lbu1fjShOnQZuJcsV8tqnayeFkNzv2LTOlofU/Tbx502Ro073gGjoeRzNvrynAP03pL486P3KCAyiNPhDs2z8/COMrxRlZW5mfzo0xsK0dQGNH3UoG/9RVwHG4eS8LFpMTR9oetHZBAgMBAAGjgZkwgZYwCQYDVR0TBAIwADAdBgNVHQ4EFgQUJNoRIpb1hUHAk0foMSNM9MCEAv8wSAYDVR0jBEEwP4AUo562SGdCEjZBvW3gubSgUouX8bOhHKQaMBgxFjAUBgNVBAMMDUpldFByb2ZpbGUgQ0GCCQDSbLGDsoN54TATBgNVHSUEDDAKBggrBgEFBQcDATALBgNVHQ8EBAMCBaAwDQYJKoZIhvcNAQELBQADggIBABKaDfYJk51mtYwUFK8xqhiZaYPd30TlmCmSAaGJ0eBpvkVeqA2jGYhAQRqFiAlFC63JKvWvRZO1iRuWCEfUMkdqQ9VQPXziE/BlsOIgrL6RlJfuFcEZ8TK3syIfIGQZNCxYhLLUuet2HE6LJYPQ5c0jH4kDooRpcVZ4rBxNwddpctUO2te9UU5/FjhioZQsPvd92qOTsV+8Cyl2fvNhNKD1Uu9ff5AkVIQn4JU23ozdB/R5oUlebwaTE6WZNBs+TA/qPj+5/we9NH71WRB0hqUoLI2AKKyiPw++FtN4Su1vsdDlrAzDj9ILjpjJKA1ImuVcG329/WTYIKysZ1CWK3zATg9BeCUPAV1pQy8ToXOq+RSYen6winZ2OO93eyHv2Iw5kbn1dqfBw1BuTE29V2FJKicJSu8iEOpfoafwJISXmz1wnnWL3V/0NxTulfWsXugOoLfv0ZIBP1xH9kmf22jjQ2JiHhQZP7ZDsreRrOeIQ/c4yR8IQvMLfC0WKQqrHu5ZzXTH4NO3CwGWSlTY74kE91zXB5mwWAx1jig+UXYc2w4RkVhy0//lOmVya/PEepuuTTI4+UJwC7qbVlh5zfhj8oTNUXgN0AOc+Q0/WFPl1aw5VV/VrO8FCoB15lFVlpKaQ1Yh+DVU8ke+rt9Th0BCHXe0uZOEmH0nOnH/0onD
-19
View File
@@ -1,19 +0,0 @@
https://zhuanlan.zhihu.com/p/668667982
ja-netfilter 做方法注入
插件CODE 获取原理
先到插件市场下载到想要破解的插件jar包然后 winrar打开 META-INF/plugin.xml
读到这一行获取插件code
<product-descriptor code="PCMAKEPLUS"
<idea-plugin>
<idea-version since-build="213" until-build="253.*"/>
<id>artsiomch.cmake.plus</id>
<name>CMake Plus</name>
<version>253.1.0</version>
<vendor>achapialiou</vendor>
<product-descriptor code="PCMAKEPLUS" release-date="20251025" release-version="2531"/>
-32
View File
@@ -1,32 +0,0 @@
cmake 传递变量
cmake函数只支持传值调用,由于cmake函数可以访问到外部变量,那么通过传入外部变量名称
就可以对外部变量进行,赋值,修改。
当传入外部变量名称时,使用时要${${out_var_name}} 第一次解引用时获取外部变量名称,第二次解引用是
获取外部变量的值
而修改时需要 set(${out_list_var_name} "返回的值" PARENT_SCOPE) #一层解引用时获取到外部变量名称
1.1 传普通变量
1. 传值,传入"${外部变量名}"或${外部变量名},函数内部使用 ${形参名} 获取到传来的值
2. 传引用,传入外部变量名, 函数内部使用 ${${形参名}} 获取到传来的值
1.2 传列表变量
列表变量能和传值一样使用,列表变量传值时(${list_variableName}),会把每一个元素都当成一个函数参数弄到ARGN里,
有两种方式
1. 传值,传入"${外部列表变量名}", 函数使用 ${形参名}
2. 传引用,传入 外部列表变量名, 函数使用${${形参名}}, 第一层解引用获得外部变量名,第二层解引用获得变量值
1.3 传引用
返回值 set(${out_var_name} "返回的值" PARENT_SCOPE)
1.4
如果函数内部定义了临时的list列表存储中间状态,由于外部变量函数内部可以访问到,
需要set(listName)先置空
out_list_var_name 是外部列表变量的名称
function(out_list_var_name)
使用 ${${out_list_var_name}}
返回值 set(${out_list_var_name} "返回的值" PARENT_SCOPE)
变量作用域在 .cmake CMakeLists.txt 传递的区别
cmake 生成表达式 一定要拿""包起来,不知道什么原因
-24
View File
@@ -1,24 +0,0 @@
// 查看是否启用 core dump
root@RK356X:~# ulimit -c
0
// 表示禁用状态 然后启用core dump
root@RK356X:~# ulimit -c unlimited
root@RK356X:~#
ls -ld ./
chmod 777 ./ # 允许所有用户读、写、执行权限
echo "/root/core_dump.%e.%p" > /proc/sys/kernel/core_pattern
echo "core" > /proc/sys/kernel/core_pattern
cat /proc/sys/kernel/core_pattern
// 程序放后台运行
./your_program >console.log &
// 这个命令杀掉 程序 abort() 触发核心转储
kill -ABRT <pid>
有时候有些库会对MT,MTD,有特别要求,不注意表现为闪退,概率性,空指针错误
有些库 找不到库 会直接崩溃
-92
View File
@@ -1,92 +0,0 @@
https://cygwin.com/packages/
测试网速
http://mirrors.ustc.edu.cn
http://www.pirbot.com
http://mirrors.neusoft.edu.cn
https://www.cnblogs.com/cnxkey/articles/8759121.html
首次安装
.\setup-x86_64.exe -q -R C:\cygwin64 -P wget,make,gcc-core,gcc-g++,git,ninja,cmake -s http://mirrors.163.com/cygwin/
管理员权限打开cygwin命令行,创建ssh 用户
ssh-host-config
启动服务
net start cygsshd
设置自动启动
sc config cygsshd start= auto
CYGWIN cygsshd
后续添加包
.\setup-x86_64.exe -q -P openssh,gdb,gdbserver -s http://mirrors.163.com/cygwin/
PS C:\wyc\environment\cygwin> ./setup-x86_64.exe -help
PS C:\wyc\environment\cygwin>
选项处理期间出错。
Cygwin setup 2.932
命令行选项:
-t --allow-test-packages 考虑标记为测试版的软件包版本
--allow-unsupported-windows 允许旧的、不受支持的 Windows 版本
-a --arch 要安装的体系结构(选项:x86_64
或 x86
-C --categories 指定要安装的类别
--compact-os 使用 Compact OS
压缩已安装的文件(选项:xpress4k、xpress8k、xpress16k、lzx
-o --delete-orphans 删除孤立的软件包
-A --disable-buggy-antivirus 在执行过程中禁用已知或可疑的有缺陷的防病毒软件包
-D --download 从互联网下载软件包
-f --force-current 为所有软件包选择当前版本
-h --help 打印帮助
-I --include-source 为每个安装的软件包自动安装源代码
-i --ini-basename 使用不同的基本名称,例如"foo",而非"setup"
-U --keep-untrusted-keys 使用不受信任的密钥并保留所有密钥
--lang 指定 GUI 语言的 langid
-L --local-install 从本地目录安装软件包
-l --local-package-dir 本地软件包目录
-m --mirror-mode 从本地目录安装时跳过包可用性检查(要求本地目录是干净的镜像!)
-B --no-admin 不检查也不强制以管理员身份运行
-d --no-desktop 禁用桌面快捷方式的创建
-r --no-replaceonreboot 禁用在下次重新启动时替换正在使用的文件
-n --no-shortcuts 禁用桌面和开始菜单快捷方式的创建
-N --no-startmenu 禁用创建开始菜单快捷方式
-X --no-verify 不验证 setup.ini 的签名
--no-version-check 禁止检查是否有较新版本的安装程序可用
-w --no-warn-deprecated-windows 不要警告已弃用的 Windows 版本
--no-write-registry 不要将根安装目录写入注册表
--enable-old-keys 启用旧的 cygwin.com 密钥
-O --only-site 不要下载镜像列表。 仅使用 -s
指定的站点
-M --package-manager 半有人值守仅选择器模式
-P --packages 指定要安装的软件包
-p --proxy HTTP/FTP 代理(主机名:端口号)
-Y --prune-install 删减安装,只保留所需的软件包
-K --pubkey 额外公钥文件的 URL
或绝对路径(RFC4880 格式)
-q --quiet-mode 无人值守安装模式(选项:unattended、noinput、hidden
-c --remove-categories 指定要卸载的类别
-x --remove-packages 指定要卸载的软件包
-R --root 根安装目录
-S --sexpr-pubkey s-expr 格式的额外 DSA 公钥
-s --site 下载站点的网址、路径或 UNC 路径
--symlink-type 符号链接类型(选项:lnk、native、sys、wsl
-u --untrusted-keys 使用不受信任的已保存额外密钥
-g --upgrade-also 同时升级已安装的软件包
--user-agent 用于 HTTP 请求的用户代理(User
Agent)字符串
-v --verbose 详细输出
-V --version 显示版本
-W --wait 在提权时,等待提权的子进程
默认设置是下载和安装软件包,除非指定了 --download 或 --local-install。
-20
View File
@@ -1,20 +0,0 @@
1. Namespaces
Namespaces 是 Linux 内核中的一种特性,它为进程提供了一种隔离机制,使得不同的进程可以在各自的环境中运行,而彼此之间不受影响。
Linux 支持多种类型的 namespaces,例如:
PID Namespace:隔离进程 ID,使得不同的 PID 命名空间中的进程可以有相同的 PID。
Network Namespace:提供网络隔离,使得每个命名空间可以有自己的网络栈,包括 IP 地址、路由表和网络接口。
Mount Namespace:允许不同进程有不同的挂载点视图。
User Namespace:提供用户和组 ID 的隔离,使得一个命名空间中的用户可以在另一个命名空间中有不同的权限。
2. Control Groups (cgroups)
Control Groups (cgroups) 是一种 Linux 内核特性,用于限制、记录和隔离进程组的资源使用情况,包括 CPU、内存、磁盘 I/O 等。
cgroups 可以将系统资源分配给不同的进程或进程组,这样可以有效地管理系统资源,防止某个进程消耗过多的资源而影响到其他进程的正常运行。
cgroups 的基本功能在 Linux 内核 2.6.24 中引入,随着内核的发展,3.10 版本也对 cgroups 进行了许多改进,使得它们更加强大和灵活。
./test111: relocation error: /home/wyc/aa/aenv/../lib64/libc.so.6: symbol _dl_starting_up,
version GLIBC_PRIVATE not defined in file ld-linux-x86-64.so.2 with link time reference
@@ -1,16 +0,0 @@
[Unit]
Description=EasyTier Service
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=root
WorkingDirectory=/home/wyc/easytier/easytier-linux-aarch64
ExecStart=/home/wyc/easytier/easytier-linux-aarch64/easytier-core --ipv4 10.75.75.1 --network-name easytier --network-secret 123 -p tcp://[2409:8a3c:2730:1c90:da3a:ddff:fe46:6bc]:11010
Restart=always
RestartSec=3
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target
@@ -1,15 +0,0 @@
[Unit]
Description=EasyTier Web Console
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=root
WorkingDirectory=/home/wyc/easytier/easytier-linux-aarch64
ExecStart=/home/wyc/easytier/easytier-linux-aarch64/easytier-web-embed --api-server-port 11211 --api-host http://75.75.75.75:11211 --config-server-port 22020 --config-server-protocol udp
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
View File
-21
View File
@@ -1,21 +0,0 @@
# https://zhuanlan.zhihu.com/p/31370146
sudo apt-get update
sudo apt-get install gcc-10
sudo apt-get install g++-10
cd /usr/bin
sudo rm gcc g++
sudo ln -s gcc-10 gcc
sudo ln -s g++-10 g++
sudo apt-get update
sudo apt-get install gcc-10
sudo apt-get install g++-10
cd /usr/bin
sudo mv gcc gcc.old # 将 gcc 重命名为 gcc.old
sudo mv g++ g++.old # 将 g++ 重命名为 g++.old
sudo ln -s gcc-10 gcc # 创建 gcc 到 gcc-10 的符号链接
sudo ln -s g++-10 g++ # 创建 g++ 到 g++-10 的符号链接
升级到gcc10自动的就可以使用utf8代码了
-24
View File
@@ -1,24 +0,0 @@
下载地址 https://dl.gitea.com/gitea/
windows 上git服务搭建
https://zhuanlan.zhihu.com/p/466341348
#gitea.exe web
管理员权限运行打开
sc.exe create gitea start= auto binPath= '"D:\gitea\gitea-1.25.3-gogit-windows-4.0-amd64.exe" web --config "D:\gitea\custom\conf\app.ini"'
win+r services.msc
// 仓库新代码录入
git init
git branch -M main
git remote add origin http://192.168.1.75:3000/pac/plant_sun_cat.git
-180
View File
@@ -1,180 +0,0 @@
PS C:\Users\wyc> gn --help
Commands (type "gn help <command>" for more help):
analyze: Analyze which targets are affected by a list of files.
args: Display or configure arguments declared by the build.
check: Check header dependencies.
clean: Cleans the output directory.
clean_stale: Cleans the stale output files from the output directory.
desc: Show lots of insightful information about a target or config.
format: Format .gn files.
gen: Generate ninja files.
help: Does what you think.
ls: List matching targets.
meta: List target metadata collection results.
outputs: Which files a source/target make.
path: Find paths between two targets.
refs: Find stuff referencing a target or file.
Target declarations (type "gn help <function>" for more help):
action: Declare a target that runs a script a single time.
action_foreach: Declare a target that runs a script over a set of files.
bundle_data: [iOS/macOS] Declare a target without output.
copy: Declare a target that copies files.
create_bundle: [iOS/macOS] Build an iOS or macOS bundle.
executable: Declare an executable target.
generated_file: Declare a generated_file target.
group: Declare a named group of targets.
loadable_module: Declare a loadable module target.
rust_library: Declare a Rust library target.
rust_proc_macro: Declare a Rust procedural macro target.
shared_library: Declare a shared library target.
source_set: Declare a source set target.
static_library: Declare a static library target.
target: Declare an target with the given programmatic type.
Buildfile functions (type "gn help <function>" for more help):
assert: Assert an expression is true at generation time.
config: Defines a configuration object.
declare_args: Declare build arguments.
defined: Returns whether an identifier is defined.
exec_script: Synchronously run a script and return the output.
filter_exclude: Remove values that match a set of patterns.
filter_include: Remove values that do not match a set of patterns.
foreach: Iterate over a list.
forward_variables_from: Copies variables from a different scope.
get_label_info: Get an attribute from a target's label.
get_path_info: Extract parts of a file or directory name.
get_target_outputs: [file list] Get the list of outputs from a target.
getenv: Get an environment variable.
import: Import a file into the current scope.
not_needed: Mark variables from scope as not needed.
pool: Defines a pool object.
print: Prints to the console.
process_file_template: Do template expansion over a list of files.
read_file: Read a file into a variable.
rebase_path: Rebase a file or directory to another location.
set_default_toolchain: Sets the default toolchain name.
set_defaults: Set default values for a target type.
split_list: Splits a list into N different sub-lists.
string_join: Concatenates a list of strings with a separator.
string_replace: Replaces substring in the given string.
string_split: Split string into a list of strings.
template: Define a template rule.
tool: Specify arguments to a toolchain tool.
toolchain: Defines a toolchain.
write_file: Write a file to disk.
Built-in predefined variables (type "gn help <variable>" for more help):
current_cpu: [string] The processor architecture of the current toolchain.
current_os: [string] The operating system of the current toolchain.
current_toolchain: [string] Label of the current toolchain.
default_toolchain: [string] Label of the default toolchain.
gn_version: [number] The version of gn.
host_cpu: [string] The processor architecture that GN is running on.
host_os: [string] The operating system that GN is running on.
invoker: [string] The invoking scope inside a template.
python_path: [string] Absolute path of Python.
root_build_dir: [string] Directory where build commands are run.
root_gen_dir: [string] Directory for the toolchain's generated files.
root_out_dir: [string] Root directory for toolchain output files.
target_cpu: [string] The desired cpu architecture for the build.
target_gen_dir: [string] Directory for a target's generated files.
target_name: [string] The name of the current target.
target_os: [string] The desired operating system for the build.
target_out_dir: [string] Directory for target output files.
Variables you set in targets (type "gn help <variable>" for more help):
aliased_deps: [scope] Set of crate-dependency pairs.
all_dependent_configs: [label list] Configs to be forced on dependents.
allow_circular_includes_from: [label list] Permit includes from deps.
arflags: [string list] Arguments passed to static_library archiver.
args: [string list] Arguments passed to an action.
asmflags: [string list] Flags passed to the assembler.
assert_no_deps: [label pattern list] Ensure no deps on these targets.
bridge_header: [string] Path to C/Objective-C compatibility header.
bundle_contents_dir: Expansion of {{bundle_contents_dir}} in create_bundle.
bundle_deps_filter: [label list] A list of labels that are filtered out.
bundle_executable_dir: Expansion of {{bundle_executable_dir}} in create_bundle
bundle_resources_dir: Expansion of {{bundle_resources_dir}} in create_bundle.
bundle_root_dir: Expansion of {{bundle_root_dir}} in create_bundle.
cflags: [string list] Flags passed to all C compiler variants.
cflags_c: [string list] Flags passed to the C compiler.
cflags_cc: [string list] Flags passed to the C++ compiler.
cflags_objc: [string list] Flags passed to the Objective C compiler.
cflags_objcc: [string list] Flags passed to the Objective C++ compiler.
check_includes: [boolean] Controls whether a target's files are checked.
code_signing_args: [string list] Arguments passed to code signing script.
code_signing_outputs: [file list] Output files for code signing step.
code_signing_script: [file name] Script for code signing.
code_signing_sources: [file list] Sources for code signing step.
complete_static_lib: [boolean] Links all deps into a static library.
configs: [label list] Configs applying to this target or config.
contents: Contents to write to file.
crate_name: [string] The name for the compiled crate.
crate_root: [string] The root source file for a binary or library.
crate_type: [string] The type of linkage to use on a shared_library.
data: [file list] Runtime data file dependencies.
data_deps: [label list] Non-linked dependencies.
data_keys: [string list] Keys from which to collect metadata.
defines: [string list] C preprocessor defines.
depfile: [string] File name for input dependencies for actions.
deps: [label list] Private linked dependencies.
externs: [scope] Set of Rust crate-dependency pairs.
framework_dirs: [directory list] Additional framework search directories.
frameworks: [name list] Name of frameworks that must be linked.
friend: [label pattern list] Allow targets to include private headers.
include_dirs: [directory list] Additional include directories.
inputs: [file list] Additional compile-time dependencies.
ldflags: [string list] Flags passed to the linker.
lib_dirs: [directory list] Additional library directories.
libs: [string list] Additional libraries to link.
metadata: [scope] Metadata of this target.
module_name: [string] The name for the compiled module.
output_conversion: Data format for generated_file targets.
output_dir: [directory] Directory to put output file in.
output_extension: [string] Value to use for the output's file extension.
output_name: [string] Name for the output file other than the default.
output_prefix_override: [boolean] Don't use prefix for output name.
outputs: [file list] Output files for actions and copy targets.
partial_info_plist: [filename] Path plist from asset catalog compiler.
pool: [string] Label of the pool used by the action.
precompiled_header: [string] Header file to precompile.
precompiled_header_type: [string] "gcc" or "msvc".
precompiled_source: [file name] Source file to precompile.
product_type: [string] Product type for Xcode projects.
public: [file list] Declare public header files for a target.
public_configs: [label list] Configs applied to dependents.
public_deps: [label list] Declare public dependencies.
rebase: [boolean] Rebase collected metadata as files.
response_file_contents: [string list] Contents of .rsp file for actions.
script: [file name] Script file for actions.
sources: [file list] Source files for a target.
swiftflags: [string list] Flags passed to the swift compiler.
testonly: [boolean] Declares a target must only be used for testing.
visibility: [label list] A list of labels that can depend on a target.
walk_keys: [string list] Key(s) for managing the metadata collection walk.
weak_frameworks: [name list] Name of frameworks that must be weak linked.
write_runtime_deps: Writes the target's runtime_deps to the given path.
xcasset_compiler_flags: [string list] Flags passed to xcassets compiler
xcode_extra_attributes: [scope] Extra attributes for Xcode projects.
xcode_test_application_name: [string] Name for Xcode test target.
Other help topics:
all: Print all the help at once
buildargs: How build arguments work.
dotfile: Info about the toplevel .gn file.
execution: Build graph and execution overview.
grammar: Language and grammar for GN build files.
input_conversion: Processing input from exec_script and read_file.
file_pattern: Matching more than one file.
label_pattern: Matching more than one label.
labels: About labels.
metadata_collection: About metadata and its collection.
ninja_rules: How Ninja build rules are named.
nogncheck: Annotating includes for checking.
output_conversion: Specifies how to transform a value to output.
runtime_deps: How runtime dependency computation works.
source_expansion: Map sources to outputs for scripts.
switches: Show available command-line switches.
-22
View File
@@ -1,22 +0,0 @@
下面是几个直接可用的 Graphviz 在线编辑/显示地址:
Graphviz Online (dreampuf) — https://dreampuf.github.io/GraphvizOnline/
Dreampuf
Graphviz Visual Editor (magjac) — https://magjac.com/graphviz-visual-editor/
Magjac
+1
Free Graphviz / Dot online editor (DevToolsDaily) — https://www.devtoolsdaily.com/graphviz/
开发工具每日
Edotor — https://edotor.net/
Edotor
Sketchviz — https://sketchviz.com/new
Sketchviz
-183
View File
@@ -1,183 +0,0 @@
linux使用最佳实践:
1.使用稳定linux发行版。
2.永远不要把库下载到自己的系统目录下,要安装到自己定义的--installroot里,而且尽量使用装系统的iso源,永远不更新
3.自己编译安装的库,不要放入--installroot里,要放入单独的目录中
并且目录结构遵循
├─best_env
│ ├─iso_repo //挂载装系统的iso,或者直接就是iso的文件
│ └─iso_root //从iso源下载的库,目录结构和系统根目录一样
│ ├─...
│ └─...
│ └─src //存放源码的tar.gz,和加压后的源码
│ └─build //源码的构建目录
│ └─install //从源码编译安装的库,或者安装包安装的库,里面的第一层是库的名字,下面是版本号,如果是编译安装的库,就保持它原始的结构
│   ├─Library_A
│   │ ├─v2
│   │ └─v3
│   ├─Library_B
│   │ ├─v10
│   │ └─v12
│   └─Library_C
│     ├─v4
│     ├─v5
│     └─v6
==================== glibc 动态加载器找库规则 ====================
官方文档:
当链接器需要额外的共享库时,搜索顺序如下:
1.通过 -rpath-link 指定的目录。
2.通过 -rpath 指定的目录(这些目录会被包含在可执行文件中,并在运行时使用)。
3.在 ELF 系统中,如果没有使用 -rpath 和 -rpath-link,则会检查环境变量 LD_RUN_PATH 的内容。
4.在 SunOS 系统中,如果没有使用 -rpath,则会搜索 -L 选项指定的目录。
5.对于本地链接器,搜索环境变量 LD_LIBRARY_PATH 中的目录。
6.在本地 ELF 系统中,搜索共享库的 DT_RUNPATH 或 DT_RPATH 中的目录(如果 DT_RUNPATH 存在,则忽略 DT_RPATH)。
7.对于 Linux 系统的链接器,如果存在 /etc/ld.so.conf 文件,则搜索该文件中列出的目录。
8.在 FreeBSD 系统上,搜索 _PATH_ELF_HINTS 宏定义的目录。
9.通过链接器脚本中的 SEARCH_DIR 命令指定的目录,包括 -T 选项提供的脚本。
10.默认目录,如 /lib 和 /usr/lib。
11.由插件 LDPT_SET_EXTRA_LIBRARY_PATH 指定的目录。
12.默认链接器脚本中的 SEARCH_DIR 命令指定的目录。
查阅非官方文档的补充:
1.linux关于查库的规则主要是由glibc里的链接器(不仅能运行时查找库,还能编译时链接库)实现的,
2. rpath和runpath对间接依赖库的作用。 在搜索程序或库的间接依赖时,rpath和runpath是不同的,rpath设置的路径对间接库的搜索也生效。
即搜索间接库时,也会优先从rpath指定的路径中搜索。而runpath设置的路径在对间接库搜索时是不起作用的。
所谓的间接库是指一个库所依赖的库中又依赖的别的库,如test程序依赖liba.so,而liba.so又依赖libb.so
那么对于test程序来说,libb.so就是一个间接依赖库。那么加载器在加载test程序时,寻找libb.so的时候,rpath和runpath的作用是不同的
3. runpath和rpath的行为,和linux发行版中链接器的实现有关,不同的发行版,可能实现并不相同(elf文件格式,也属于用户空间,但是是标准化比较好的,各个发行版通用)
==================== 动态链接器找库规则 ====================
任务:打包可执行文件EXE到目录DIR下
首先把EXE间接或直接依赖的库,按文件结构复制到DIR/root下(注意:软连接的处理)
然后把DIR/root下所有的库的RPATH和RUNPATH的所有绝对路径换成相对与这个root的路径
然后把/etc/ld.so.cache转换为相对与这个root的路径存入PATHS里
然后为EXE下所有库的RPATH添加PATHS路径
这样的话只要我开发环境的内核 与 我发布环境的内核 二进制兼容 我就可以在任何地方跑
LD_DEBUG=libs来帮助调试库的加载过程
-rpath=dir
将目录添加到运行时库搜索路径。在将 ELF 可执行文件与共享目标文件链接时,将使用此选项。
所有 -rpath 参数都连接在一起并传递给运行时链接程序,运行时链接程序使用它们在运行时查找共享目标文件。
在查找链接中显式包含的共享对象所需的共享对象时,也会使用 -rpath 选项;请参阅 -rpath-link 选项的说明。
以这种方式搜索 -rpath 仅支持配置了 --with-sysroot 选项的本机链接器和交叉链接器。
如果在链接 ELF 可执行文件时未使用 -rpath,则将使用环境变量 “LD_RUN_PATH” 的内容(如果已定义)
-rpath选项也可以在SunOS上使用。在SunOS上默认情况下,链接器将从所有-L中形成一个运行时搜索路径
它提供了选项。如果使用-rpath选项,运行时搜索路径将仅使用-rpath选项形成,忽略-L选项。这在使用gcc时很有用
添加了许多-L选项,这些选项可能位于NFS挂载的文件系统上。
为了与其他 ELF 链接器兼容,如果 -R 选项后跟目录名称而不是文件名,则会将其视为 -rpath 选项。
-rpath=dir
Add a directory to the runtime library search path. This is used
when linking an ELF executable with shared objects. All -rpath
arguments are concatenated and passed to the runtime linker, which
uses them to locate shared objects at runtime.
The -rpath option is also used when locating shared objects which
are needed by shared objects explicitly included in the link; see
the description of the -rpath-link option. Searching -rpath in
this way is only supported by native linkers and cross linkers
which have been configured with the --with-sysroot option.
If -rpath is not used when linking an ELF executable, the contents
of the environment variable "LD_RUN_PATH" will be used if it is
defined.
The -rpath option may also be used on SunOS. By default, on SunOS,
the linker will form a runtime search path out of all the -L
options it is given. If a -rpath option is used, the runtime
search path will be formed exclusively using the -rpath options,
ignoring the -L options. This can be useful when using gcc, which
adds many -L options which may be on NFS mounted file systems.
For compatibility with other ELF linkers, if the -R option is
followed by a directory name, rather than a file name, it is
treated as the -rpath option.
-rpath-link=dir
使用 ELF 或 SunOS 时,一个共享库可能需要另一个共享库。当 “ld -shared” 链接包含共享库作为输入文件之一时,会发生这种情况。
当链接器在执行非共享、不可重定位的链接时遇到此类依赖项时,它将自动尝试查找所需的共享库并将其包含在链接中(如果未显式包含)。
在这种情况下,-rpath-link 选项指定要搜索的第一组目录。-rpath-link 选项可以通过指定以冒号分隔的名称列表或多次出现来
指定目录名称序列。
令牌 $ORIGIN 和 $LIB 可以显示在这些搜索目录中。对于 $ORIGIN,它们将被替换为包含程序或共享目标文件的目录的完整路径,
如果是 $LIB,则为 lib - 对于 32 位二进制文件,或 lib64 - 对于 64 位二进制文件。
也可以使用这些令牌的替代形式 - ${ORIGIN} 和 ${LIB}。不支持令牌 $PLATFORM。
应谨慎使用此选项,因为它会覆盖可能已硬编译到共享库中的搜索路径。在这种情况下,可能会无意中使用与运行时链接程序不同的搜索路径。
链接器使用以下搜索路径来查找所需的共享库:
1. 由 -rpath-link 选项指定的任何目录。
2. 由 -rpath 选项指定的任何目录。-rpath 和 -rpath-link 之间的区别在于,
由 -rpath 选项指定的目录包含在可执行文件中并在运行时使用,而 -rpath-link 选项仅在链接时有效。
以这种方式搜索 -rpath 仅支持配置了 --with-sysroot 选项的本机链接器和交叉链接器。
3. 在 ELF 系统上,对于本机链接器,如果未使用 -rpath 和 -rpath-link 选项,请搜索环境变量 “LD_RUN_PATH” 的内容。
4. 在 SunOS 上,如果未使用 -rpath 选项,请搜索使用 -L 选项指定的任何目录。
5. 对于本机链接器,搜索环境变量 “LD_LIBRARY_PATH” 的内容。
6. 对于本机 ELF 链接器,将在共享库的 “DT_RUNPATH” 或 “DT_RPATH” 中的目录中搜索其所需的共享库。
如果存在 “DT_RPATH” 条目,则忽略 DT_RUNPATH 条目。
7. 默认目录,通常为 lib 和 usr/lib。
8. 对于 ELF 系统上的本机链接器,如果文件 etcld.so.conf 存在,则为该文件中找到的目录列表。
如果未找到所需的共享库,链接器将发出警告并继续链接。
-rpath-link=dir
When using ELF or SunOS, one shared library may require another.
This happens when a "ld -shared" link includes a shared library as
one of the input files.
When the linker encounters such a dependency when doing a non-shared,
non-relocatable link, it will automatically try to locate
the required shared library and include it in the link, if it is
not included explicitly. In such a case, the -rpath-link option
specifies the first set of directories to search. The -rpath-link
option may specify a sequence of directory names either by
specifying a list of names separated by colons, or by appearing
multiple times.
The tokens $ORIGIN and $LIB can appear in these search directories.
They will be replaced by the full path to the directory containing
the program or shared object in the case of $ORIGIN and either lib
- for 32-bit binaries - or lib64 - for 64-bit binaries - in the
case of $LIB.
The alternative form of these tokens - ${ORIGIN} and ${LIB} can
also be used. The token $PLATFORM is not supported.
This option should be used with caution as it overrides the search
path that may have been hard compiled into a shared library. In
such a case it is possible to use unintentionally a different
search path than the runtime linker would do.
The linker uses the following search paths to locate required
shared libraries:
1. Any directories specified by -rpath-link options.
2. Any directories specified by -rpath options. The difference
between -rpath and -rpath-link is that directories specified by
-rpath options are included in the executable and used at
runtime, whereas the -rpath-link option is only effective at
link time. Searching -rpath in this way is only supported by
native linkers and cross linkers which have been configured
with the --with-sysroot option.
3. On an ELF system, for native linkers, if the -rpath and
-rpath-link options were not used, search the contents of the
environment variable "LD_RUN_PATH".
4. On SunOS, if the -rpath option was not used, search any
directories specified using -L options.
5. For a native linker, search the contents of the environment
variable "LD_LIBRARY_PATH".
6. For a native ELF linker, the directories in "DT_RUNPATH" or
"DT_RPATH" of a shared library are searched for shared
libraries needed by it. The "DT_RPATH" entries are ignored if
"DT_RUNPATH" entries exist.
7. The default directories, normally /lib and /usr/lib.
8. For a native linker on an ELF system, if the file
/etc/ld.so.conf exists, the list of directories found in that
file.
If the required shared library is not found, the linker will issue
a warning and continue with the link.
-42
View File
@@ -1,42 +0,0 @@
echo $PATH
which perf
nano ~/.bashrc == nano /home/wyc/.bashrc
export PATH="/usr/bin/:$PATH"
LD_LIBRARY_PATH
作用:LD_LIBRARY_PATH 用于指定动态链接库的搜索路径。在运行一个可执行文件时,Linux 系统会根据这个环境变量来查找程序所需的共享库。系统首先会在这个路径中查找,如果没有找到,再去默认的库路径(如 /lib 和 /usr/lib)查找。
优先加载:如果 LD_LIBRARY_PATH 中指定了多个路径,系统会按照它们的顺序逐个查找。因此,你可以通过调整这个变量来控制库的加载顺序,确保优先使用特定的版本。
用途:
多版本支持:允许同一程序使用不同版本的库。
自定义路径:在非标准目录中查找库文件。
LD_PRELOAD
作用:LD_PRELOAD 用于强制加载指定的共享库,即使该库不在程序的默认依赖中。它会在程序启动时优先加载你指定的库,覆盖系统中已有的相同函数。
功能替换:如果你在 LD_PRELOAD 中指定了一个库,并且这个库中实现了某些与标准库同名的函数(如 malloc 或 printf),程序将使用你提供的版本,而不是系统库中的版本。
用途:
功能扩展:在不修改程序代码的情况下,添加或替换某些功能。
调试和分析:允许开发人员监控和调试程序的函数调用。
性能优化:可以替换标准函数实现,以改善性能。
为什么需要 LD_PRELOAD
虽然 LD_LIBRARY_PATH 可以影响库的加载顺序,但它并不能直接替换或修改库中已存在的函数实现。以下是几个使用 LD_PRELOAD 的场景,进一步阐明其必要性:
函数覆盖:如果你想替换标准库函数(如 malloc、free、printf)的实现,你需要使用 LD_PRELOAD。LD_LIBRARY_PATH 只能指定库的搜索路径,但无法改变函数的具体实现。
动态注入:LD_PRELOAD 允许你在运行时将自定义的功能动态地注入到程序中。这对于调试和测试非常有用,例如你可以追踪内存分配或函数调用的次数。
临时性和灵活性:通过 LD_PRELOAD,你可以在不需要重新编译或修改程序的情况下,快速改变程序的行为。这种灵活性在开发和调试过程中非常重要。
小结
LD_LIBRARY_PATH:改变库的查找路径,以确保优先加载特定路径下的库文件。
LD_PRELOAD:在程序启动时强制加载指定的库,优先于其他库中的函数实现,从而实现功能的覆盖或注入。
一个很大的缺点是,不同发行版之间,同一发行版的不同版本之间,二进制常常不兼容。而导致这个问题的一个很大原因是,
几乎所有的 Linux 发行版都不允许在系统上同时存在多个版本的 glibc,就算允许,也必须通过 LD_LIBRARY_PATH 或 LD_PRELOAD 等方式来引入。
另外可执行程序默认会链接到系统的动态库而不是当前目录下的(实际上编译的时候可以使用 -rpath),
这使得我们很难把一个软件和它的所有依赖打包成一个独立的包。而为了解决这个问题,人们又搞出了 Docker、Flatpak、Snap、AppImage 这些方案……
然而我想说的是,你们直接在编译的时候设一下 rpath 然后把 .so 全都打包进去不就行了么!实际上仅仅对 kernel 而言,二进制应该是可以兼容的。
不兼容不仅仅是库的问题, kernel的ABI兼容性也是一个问题, 即使你把glibc都一起打包, kernel太老不满足ABI最低要求也没用……
-24
View File
@@ -1,24 +0,0 @@
wget -O metacubexd.zip https://github.com/MetaCubeX/metacubexd/archive/refs/heads/gh-pages.zip
http://192.168.31.120:9091/ui/#/overview
订阅链接转换
https://sub.asailor.org/
https://dash.xn--cp3a08l.com/api/v1/pq/8424b1c22e1363a5906a156b2e849937
-16
View File
@@ -1,16 +0,0 @@
mixed-port: 7890
allow-lan: false
external-controller: 0.0.0.0:9091
external-ui: /ae/metacubexd-gh-pages
secret: "123"
mode: rule
log-level: info
ipv6: false
proxies: []
proxy-groups: []
rules:
- MATCH,DIRECT
-44
View File
@@ -1,44 +0,0 @@
# export MSYS=winsymlinks:lnk
# tar -xzf linux_headers.tar.gz
# 一次可以安装一个或多个软件
pacman -S --noconfirm mingw-w64-x86_64-git openssh diffutils make pkg-config yasm nasm mingw-w64-x86_64-toolchain base-devel autoconf automake libtool m4 gettext pkg-config unzip help2man
pacman -S --noconfirm sshpass openssh
pacman -S --noconfirm mingw-w64-x86_64-git
git config --global http.proxy http://127.0.0.1:7897
git config --global https.proxy http://127.0.0.1:7897
pacman -S --noconfirm fixdep
pacman -S diffutils # ffmpeg cmp命令
pacman -S make # 安装GNU make
gcc -v # 查看 gcc 版本
pacman -Qs pkgkeyname 关键字检索已安装的包
# 一些路径
C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Auxiliary/Build/vcvarsall.bat
call "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Auxiliary/Build/vcvarsall.bat" x64
D:/wyc/Environment/msys64/usr/bin/bash.exe -l -c
D:/wyc/Environment/msys64/msys2_shell.cmd
D:/wyc/Environment/msys64/msys2_shell.cmd -defterm -here -no-start -mingw64 -c "/usr/bin/bash /c/wyc/CLionProjects/plantSunCat/0_cmake_library/cached_external_library/build_GNU.bash"
教程地址
https://blog.csdn.net/bank_dreamer/article/details/147988810
-62
View File
@@ -1,62 +0,0 @@
https://blog.csdn.net/ymzhu385/article/details/121449628
D:\wyc\Environment\msys64\msys2_shell.cmd -ucrt64 -defterm -no-start -here
D:\wyc\Environment\msys64\msys2_shell.cmd -mingw64 -defterm -no-start -here
git config --global http.proxy socks5h://127.0.0.1:7897
git config --global https.proxy socks5h://127.0.0.1:7897
git config --global --get http.proxy
git config --global --get https.proxy
// 安装时关掉梯子
https://www.msys2.org/
pacman -Syu
pacman -Su
MSYS2 CLANG64:
这个启动的是 MSYS2 环境,并且配置了 Clang 64 位工具链。
Clang 是一种编译器,它是 LLVM 的一部分。这个可以帮助你在 MSYS2 环境中使用 Clang 编译工具。
MSYS2 CLANGARM64:
这个启动的是 MSYS2 环境,并配置了用于 ARM 64 位架构的 Clang 工具链。
如果你需要编译针对 ARM 64 位架构的代码,可以使用这个。
MSYS2 MINGW64:
这个启动的是 MINGW64 环境,配置了 MinGW 64 位工具链。
MinGW (Minimalist GNU for Windows) 是一个为 Windows 提供 GCC (GNU Compiler Collection) 编译器的工具链。这个用于在 64 位 Windows 环境下开发并编译原生 Windows 应用程序。
MSYS2 MSYS:
这个启动的是 MSYS2 环境,并提供了一个类 Unix 环境,通常用于编译或运行基于 Unix-like 环境的软件。
与 MINGW64 环境不同,MSYS 环境更多的是用于支持 POSIX 标准,适用于跨平台的开发,或是你需要一个模拟 Unix 环境时使用。
MSYS2 UCRT64:
这个启动的是 MSYS2 环境,并配置了基于 UCRT (Universal C Runtime) 的 64 位工具链。
UCRT 是微软的 C 运行时库的一部分,它用于支持现代 Windows 应用程序的构建和运行。使用这个工具链可以编译针对 UCRT 的 Windows 应用。
D:/wyc/Environment/cross-ng/usr/bin
// 必须先cd ../
cd ../
cd d/wyc/Environment/cross-ng/usr/bin
// 从 MYSY2 访问本地文件
https://blog.csdn.net/bcbobo21cn/article/details/129339185
-247
View File
@@ -1,247 +0,0 @@
#!/bin/bash
#CLFS 安装路径,与 sysroot 类似
#CLFS_HOST 当前宿主机的三元组,例如 x86_64-cross-linux-gnu
#CLFS_TARGET 目标架构,比如 x86_64-unknown-linux-gnu
#PREFIX_CROSS 最终工具链所在路径
set -e
KERNEL_PATH=$1
TARGETS="x86_64-glibc-gnuabi64" #this name could change to release
#prefix="/opt/${target}"
#ROOTDIR="/opt/v1001" # ROOTDIR could change to /opt/
ROOTDIR="$(dirname $(pwd))" # ROOTDIR could change to /opt/
BUILD_DIR="Build_Output" #when release BUILD_DIR=null
PREFIX="${ROOTDIR}/${TARGETS}" #when release BUILD_DIR=null rootdir=/opt
PREFIX_CROSS="${PREFIX}"
SRCDIR="$(dirname $(pwd))/src"
OUTDIR="${PREFIX}"
CLFS="${OUTDIR}"
#CLFS_2="${ROOTDIR}/x86_64-glibc-cross-v1001"
export CLFS
export CLFS_HOST="$(echo ${MACHTYPE} | sed -e 's/-[^-]-/cross/')"
#export CLFS_HOST="x86_64-unknown-linux-gnu"
echo ${CLFS_HOST}
export CLFS_TARGET="x86_64-unknown-linux-gnu"
#export CLFS_TARGET32="$(echo ${CLFS_TARGET} | sed -e 's/64//gl')"
export BUILD32="-m32"
export BUILDN32="-mabi=n32"
export BUILD64="-m64"
export PATH="${PREFIX_CROSS}/bin:$PATH"
echo "CLFS $CLFS"
echo "PREFIX_CROSS $PREFIX_CROSS"
function fillvars ()
{
sgccdir="${tmpdir}/sgcc/${target}"
fgccdir="${outdir}/opt/${target}"
arch="${target%%-}"
echo ${arch}
arch="${arch%-u*}"
echo ${arch}
echo ${target}
}
function stdbuild ()
{
dir="$1"
shift
pushd "${SRCDIR}/${dir}"
echo "stdbuild: $(pwd)"
make distclean | cat
./configure "$@"
make -j 20
make install
popd
}
function reqbuild ()
{
stdbuild "$@" --prefix="${CLFS}/gcc_lib" --disable-shared
}
function build_binutils ()
{
pushd "${SRCDIR}/binutils-2.27"
rm -rf build
mkdir build
cd build
#--with-lib-path="${PREFIX_CROSS}/lib/" \
AR=ar AS=as ../configure \
--prefix="${PREFIX_CROSS}" \
--host="${CLFS_HOST}" \
--target="${CLFS_TARGET}" \
--with-sysroot='${exec_prefix}' \
--disable-nls \
--disable-static \
--enable-64-bit-bfd \
--disable-werror
#--exec-prefix="${EPREFIX}" \
make -j 20
make install
popd
}
function build_stage_gcc ()
{
pushd "${SRCDIR}/gcc-$ver_gcc"
chmod +x configure
chmod +x move-if-change
chmod +x install-sh
chmod +x libgcc -R
rm -rf build
mkdir -p build
cd build
make distclean | cat
sed -i '/stack protector/a\gcc_cv_libc_provides_ssp=yes' ../gcc/configure #run only once
AR=ar CFLAGS="-fPIC -fasynchronous-unwind-tables" \
../configure \
--prefix="${PREFIX_CROSS}" \
--build="${CLFS_HOST}" \
--host="${CLFS_HOST}" \
--target="${CLFS_TARGET}" \
--with-sysroot='${exec_prefix}' \
--with-native-system-headers-dir=${PREFIX_CROSS}/usr/include \
--with-local-prefix=${PREFIX_CROSS}/usr \
--disable-nls \
--disable-shared \
--with-gmp="${CLFS}/gcc_lib" \
--with-mpfr="${CLFS}/gcc_lib" \
--with-mpc="${CLFS}/gcc_lib" \
--without-headers \
--with-newlib \
--disable-decimal-float \
--disable-libgomp \
--disable-libmudflap \
--enable-libssp \
--disable-libatomic \
--disable-libitm \
--disable-libsanitizer \
--disable-libquadmath \
--disable-threads \
--disable-target-zlib \
--with-system-zlib \
--disable-multilib \
--enable-languages=c \
--enable-checking=release
#--exec-prefix="${EPREFIX}" \
make V=1 all-gcc all-target-libgcc -j 24
make install-gcc install-target-libgcc -j 24
popd
}
function install_kernel_headers ()
{
arch="${target%%-}"
arch="${arch%-gl*}"
pushd ${KERNEL_PATH}
# make ARCH=${arch} INSTALL_HDR_PATH="${fgccdir}/usr32" headers_install
# make ARCH=${arch} INSTALL_HDR_PATH="${fgccdir}/usrn32" headers_install
make mrproper
make ARCH=x86_64 headers_check
make ARCH=x86_64 INSTALL_HDR_PATH="${CLFS}/kernel_header" headers_install
popd
}
ver_gcc=10.4.0
function build_glibc64 ()
{
pushd "${SRCDIR}/glibc-2.24"
rm -rf build-64
mkdir build-64
cd build-64
make distclean | cat
BUILD_CC="gcc" CC="${CLFS_TARGET}-gcc" CFLAGS="-O2 -fPIC -fasynchronous-unwind-tables" \
AR="${CLFS_TARGET}-ar" RANLIB="${CLFS_TARGET}-ranlib" \
../configure --prefix="/usr" \
--host=${CLFS_TARGET} \
--build=${CLFS_HOST} \
--disable-profile \
--enable-obsolete-rpc \
--disable-werror \
--with-binutils=${PREFIX_CROSS}/bin \
--with-headers=${CLFS}/kernel_header/include \
libc_cv_forced_unwind=yes \
libc_cv_ctors_header=yes \
libc_cv_c_cleanup=yes \
libc_cv_ssp=yes
# --enable-stackguard-randomization \
# libc_cv_predef_stack_protector=yes
#--exec-prefix="${EPREFIX}" \
#--enable-kernel=3.14.28 \
# --libdir="${PREFIX_CROSS}/usr/lib" \
make V=1 -j 24
make V=1 install install_root=${PREFIX_CROSS}
popd
}
function build_full_gcc ()
{
pushd "${SRCDIR}/gcc-$ver_gcc"
cp -rf ${CLFS}/kernel_header/include/* ${PREFIX_CROSS}/usr/include/
rm -rf build
mkdir -p build
cd build
AR=ar CFLAGS="-fPIC -fasynchronous-unwind-tables" \
../configure \
--prefix="${PREFIX_CROSS}" \
--build="${CLFS_HOST}" \
--target="${CLFS_TARGET}" \
--host="${CLFS_HOST}" \
--with-sysroot='${exec_prefix}' \
--with-local-prefix=${PREFIX_CROSS}/usr \
--with-native-system-headers-dir=${PREFIX_CROSS}/usr/include \
--disable-nls \
--disable-static \
--enable-languages=c,c++ \
--enable-__cxa_atexit \
--enable-threads=posix \
--with-gmp="${CLFS}/gcc_lib" \
--with-mpfr="${CLFS}/gcc_lib" \
--with-mpc="${CLFS}/gcc_lib" \
--with-system-zlib \
--enable-checking=release \
--enable-libstdcxx-time \
--disable-multilib \
--enable-shared
#--exec-prefix="${EPREFIX}" \
make V=1 AS_FOR_TARGET="${CLFS_TARGET}-as" \
LD_FOR_TARGET="${CLFS_TARGET}-ld" -j 24
make V=1 install
popd
}
#reqbuild gmp-6.0.0
#reqbuild mpfr-3.1.5 --with-gmp="${CLFS}/gcc_lib" --with-mpfr="${CLFS}/gcc_lib"
#reqbuild mpc-1.0.3 --with-gmp="${CLFS}/gcc_lib" --with-mpfr="${CLFS}/gcc_lib"
for target in ${TARGETS}; do
# install_kernel_headers
# build_binutils
build_stage_gcc
build_glibc64
ln -s "${PREFIX}/usr/lib" "${PREFIX}/usr/lib64"
build_full_gcc
done
-108
View File
@@ -1,108 +0,0 @@
alientek@alientek-virtual-machine:#
$ ./x86_64-wyc-linux-gnu-gcc -print-search-dirs
安装:#
/../lib/gcc/x86_64-wyc-linux-gnu/15.1.0/
程序:=#
/../libexec/gcc/x86_64-wyc-linux-gnu/15.1.0/:#
/../libexec/gcc/:#
/../lib/gcc/x86_64-wyc-linux-gnu/15.1.0/../../../../x86_64-wyc-linux-gnu/bin/x86_64-wyc-linux-gnu/15.1.0/:#
/../lib/gcc/x86_64-wyc-linux-gnu/15.1.0/../../../../x86_64-wyc-linux-gnu/bin/
库:=#
/../lib/gcc/x86_64-wyc-linux-gnu/15.1.0/:#
/../lib/gcc/:#
/../lib/gcc/x86_64-wyc-linux-gnu/15.1.0/../../../../x86_64-wyc-linux-gnu/lib/x86_64-wyc-linux-gnu/15.1.0/:#
/../lib/gcc/x86_64-wyc-linux-gnu/15.1.0/../../../../x86_64-wyc-linux-gnu/lib/../lib64/:#
/../x86_64-wyc-linux-gnu/sysroot/lib/x86_64-wyc-linux-gnu/15.1.0/:#
/../x86_64-wyc-linux-gnu/sysroot/lib/../lib64/:#
/../x86_64-wyc-linux-gnu/sysroot/usr/lib/x86_64-wyc-linux-gnu/15.1.0/:#
/../x86_64-wyc-linux-gnu/sysroot/usr/lib/../lib64/:#
/../lib/gcc/x86_64-wyc-linux-gnu/15.1.0/../../../../x86_64-wyc-linux-gnu/lib/:#
/../x86_64-wyc-linux-gnu/sysroot/lib/:#
/../x86_64-wyc-linux-gnu/sysroot/usr/lib/
alientek@alientek-virtual-machine:/aenv/wyc_build/wyc_gcc_7500/x86_64-wyc-linux-gnu/bin$ /aenv/wyc_build/wyc_gcc_7500/x86_64-wyc-linux-gnu/bin/ld -verboseGNU ld (GNU Binutils) 2.44
支持的仿真:
elf_x86_64
elf32_x86_64
elf_i386
elf_iamcu
使用内部链接脚本:
==================================================
/* Script for -z combreloc -z separate-code */
/* Copyright (C) 2014-2025 Free Software Foundation, Inc.
Copying and distribution of this script, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. */
OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64")
OUTPUT_ARCH(i386:x86-64)
ENTRY(_start)
SEARCH_DIR("/aenv/wyc_build/wyc_gcc_7500/x86_64-wyc-linux-gnu/lib64");
SEARCH_DIR("=lib");
SEARCH_DIR("=lib64");
SEARCH_DIR("=usr/lib");
SEARCH_DIR("=usr/lib64");
SEARCH_DIR("/aenv/wyc_build/wyc_gcc_7500/x86_64-wyc-linux-gnu/lib");
/aenv/wyc_build/wyc_gcc/x86_64-wyc-linux-gnu/bin
alientek@alientek-virtual-machine:/aenv/wyc_build/wyc_gcc/bin$ /aenv/wyc_build/wyc_gcc/bin/../lib/gcc/x86_64-wyc-linux-gnu/15.1.0/../../../../x86_64-wyc-linux-gnu/bin/ld -verbose
GNU ld (GNU Binutils) 2.44
支持的仿真:
elf_x86_64
elf32_x86_64
elf_i386
elf_iamcu
使用内部链接脚本:
==================================================
/* Script for -z combreloc -z separate-code */
/* Copyright (C) 2014-2025 Free Software Foundation, Inc.
Copying and distribution of this script, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. */
OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64")
OUTPUT_ARCH(i386:x86-64)
ENTRY(_start)
SEARCH_DIR("/aenv/wyc_build/wyc_gcc_75/x86_64-wyc-linux-gnu/lib64");
SEARCH_DIR("/aenv/wyc_build/wyc_gcc_75/x86_64-wyc-linux-gnu/lib");
alientek@alientek-virtual-machine:/aenv/wyc_build/wyc_gcc$ /opt/atk-dlrk356x-toolchain/aarch64-buildroot-linux-gnu/bin/ld -verbose
GNU ld (GNU Binutils) 2.36.1
支持的仿真:
aarch64linux
aarch64elf
aarch64elf32
aarch64elf32b
aarch64elfb
armelf
armelfb
aarch64linuxb
aarch64linux32
aarch64linux32b
armelfb_linux_eabi
armelf_linux_eabi
使用内部链接脚本:
==================================================
/* Script for -z combreloc */
/* Copyright (C) 2014-2021 Free Software Foundation, Inc.
Copying and distribution of this script, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. */
OUTPUT_FORMAT("elf64-littleaarch64", "elf64-bigaarch64",
"elf64-littleaarch64")
OUTPUT_ARCH(aarch64)
ENTRY(_start)
SEARCH_DIR("=/home/alientek/ATK-DLRK3568/buildroot/output/rockchip_rk3568/host/aarch64-buildroot-linux-gnu/lib64");
SEARCH_DIR("=/usr/local/lib64");
SEARCH_DIR("=/lib64");
SEARCH_DIR("=/usr/lib64");
SEARCH_DIR("=/home/alientek/ATK-DLRK3568/buildroot/output/rockchip_rk3568/host/aarch64-buildroot-linux-gnu/lib");
SEARCH_DIR("=/usr/local/lib");
SEARCH_DIR("=/lib");
SEARCH_DIR("=/usr/lib");
-42
View File
@@ -1,42 +0,0 @@
>>> import site
>>> print(site.getsitepackages())
['D:\\wyc\\env\\win_arm_kylin\\win_arm_kylin\\releases_gcc-9.3.0_x86_64-w64-mingw32\\lib\\python3.12\\site-packages']
>>> import sys, importlib.util
>>> print(sys.executable)
>>> print(sys.path)
>>> print(importlib.util.find_spec("binascii"))
>>> import binascii
(gdb) show charset
The host character set is "auto; currently CP1252".
The target character set is "auto; currently CP1252".
The target wide character set is "auto; currently UTF-32".
(gdb) python
>import os, traceback
>try:
> import binascii
> os.write(1, b"IMPORT_OK\n")
>except BaseException as e:
> os.write(1, ("TYPE=" + type(e).__name__ + "\n").encode("ascii", "backslashreplace"))
> os.write(1, ("MSG=" + ascii(str(e)) + "\n").encode("ascii", "backslashreplace"))
> os.write(1, traceback.format_exc().encode("ascii", "backslashreplace"))
>end
TYPE=ImportError
MSG='DLL load failed while importing binascii: \u627e\u4e0d\u5230\u6307\u5b9a\u7684\u6a21\u5757\u3002'
Traceback (most recent call last):
File "<string>", line 3, in <module>
ImportError: DLL load failed while importing binascii: \u627e\u4e0d\u5230\u6307\u5b9a\u7684\u6a21\u5757\u3002
set charset UTF-8
set charset <TAB><TAB>
@@ -1,16 +0,0 @@
ssh-keygen -t ed25519 -f "D:\wyc/ssh\wyc_common_ed25519" -C "wyc通用公钥私钥"
Host jump-host
HostName 192.168.1.24
User wyc
Port 22
IdentityFile C:\Users\wyc\.ssh\private\id_rsa
-154
View File
@@ -1,154 +0,0 @@
# 免密登录配置
客户端使用私钥,服务端保存公钥
## 前置条件
### linux服务端
- 服务端(受控端)需要安装 sshserver
- 步骤:
- sudo apt install openssh-server
- sudo systemctl status ssh
### windows服务端
- 设置 设置管理 可选功能 添加可选功能 下载ssh服务器,SSH 连接中,控制端(客户端)和 受控端(服务器)
- win + r services.msc
- 找到“OpenSSH SSH Server”服务。
- 右键点击服务,选择“启动”来启动SSH服务。
## 生成密钥(windows linux通用)
## linux服务端配置 必须authorized_keys目录下
- **1、修改服务端配置文件**
修改三个位置
sudo nano /etc/ssh/sshd_config
StrictModes no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys/wyc_common_ed25519.pub .ssh/authorized_keys .ssh/authorized_keys2
- **2、重新启动服务**
service sshd restart
- **3、写入公钥**
进入主目录 CTRL+H 显示隐藏文件
新建.ssh 进入打开终端
新建 authorized_keys 写入公钥
## windows服务端配置
- **1、修改服务端配置文件**
C:\ProgramData\ssh\sshd_config
确保以下3条没有被注释
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no (需要将默认的yes改为no,很重要)
确保以下2条有注释掉
#Match Group administrators
#AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
- **2、重新启动服务**
win+r service.msc
- **3、写入公钥**
C:\Users\${wyc}\.ssh\authorized_keys 放置公钥
#### 客户端配置(windows linux通用) ***放入私钥***
- ${用户目录下}/config 写入
```
Host jump-host
HostName 192.168.1.24
User wyc
Port 22
IdentityFile C:\Users\wyc\.ssh\private\id_rsa
Host target-host
HostName 192.168.1.166
User bright
Port 22
ProxyJump jump-host
```
- ## 参考资料
- [windows Openssh-server(服务端-免密登陆设置)](https://www.jianshu.com/p/82f90716f9f0)
- [如何在 Ubuntu 上启用 SSH(适用于 20.04、22.04)?](https://developer.aliyun.com/article/1488008)
- [SSH配置文件 /etc/ssh/sshd_conf参数详细说明](https://blog.csdn.net/jxb513651608/article/details/110476607)
- ##### 客户端config
- [SSH config使用教程和总结](https://www.hi-linux.com/posts/14346.html)
- [ssh之 ~/.ssh/config 配置文件实现](https://blog.csdn.net/weixin_45697293/article/details/125119796)
- [SSH Config 那些你所知道和不知道的事](https://deepzz.com/post/how-to-setup-ssh-config.html)
- [FreeBSD Manual Pages](https://man.freebsd.org/cgi/man.cgi?query=ssh_config)
- ## 使用最佳实践
- 目录使用 新建一个~/.ssh/private文件夹 所有的公钥私钥都放在这个文件夹下
- 每台设备生成自己的公钥私钥 并在自己的authorized_keys里放置自己的公钥 谁想连接他就把私钥给谁
### 远程调试
注意使用clion 远程调试功能时 target remote 指的是gdb客户端 到 gdb服务端的命令 需要后台起一个ssh转发流量功能
target remote 127.0.0.1:1234
### 开启ssh隧道示例
ssh -L 1234:127.0.0.1:1234 wyc@ubuntu_22_04_5
PS C:\Users\wyc> gcc -print-search-dirs install: C:/wyc/toolchain/aaa/bin/../lib/gcc/x86_64-wyc-linux-gnu/15.1.0/
programs: =
C:/wyc/toolchain/aaa/libexec/gcc/x86_64-wyc-linux-gnu/15.1.0/;
C:/wyc/toolchain/aaa/libexec/gcc/x86_64-linux-gnu/;
C:/wyc/toolchain/aaa/libexec/gcc/;
C:/wyc/toolchain/aaa/x86_64-wyc-linux-gnu/bin/x86_64-wyc-linux-gnu/15.1.0/;
C:/wyc/toolchain/aaa/x86_64-wyc-linux-gnu/bin/x86_64-linux-gnu/;
C:/wyc/toolchain/aaa/x86_64-wyc-linux-gnu/bin/
libraries: =
C:/wyc/toolchain/aaa/lib/gcc/x86_64-wyc-linux-gnu/15.1.0/;
C:/wyc/toolchain/aaa/lib/gcc/x86_64-linux-gnu/;
C:/wyc/toolchain/aaa/lib/gcc/;
C:/wyc/toolchain/aaa/x86_64-wyc-linux-gnu/lib/x86_64-wyc-linux-gnu/15.1.0/;
C:/wyc/toolchain/aaa/x86_64-wyc-linux-gnu/lib/x86_64-linux-gnu/;
C:/wyc/toolchain/aaa/x86_64-wyc-linux-gnu/lib64/;
C:/wyc/toolchain/aaa/x86_64-wyc-linux-gnu/sysroot/lib/x86_64-wyc-linux-gnu/15.1.0/;
C:/wyc/toolchain/aaa/x86_64-wyc-linux-gnu/sysroot/lib/x86_64-linux-gnu/;
C:/wyc/toolchain/aaa/x86_64-wyc-linux-gnu/sysroot/lib64/;
C:/wyc/toolchain/aaa/x86_64-wyc-linux-gnu/sysroot/usr/lib/x86_64-wyc-linux-gnu/15.1.0/;
C:/wyc/toolchain/aaa/x86_64-wyc-linux-gnu/sysroot/usr/lib/x86_64-linux-gnu/;
C:/wyc/toolchain/aaa/x86_64-wyc-linux-gnu/sysroot/usr/lib64/;
C:/wyc/toolchain/aaa/x86_64-wyc-linux-gnu/lib/;
C:/wyc/toolchain/aaa/x86_64-wyc-linux-gnu/sysroot/lib/;
C:/wyc/toolchain/aaa/x86_64-wyc-linux-gnu/sysroot/usr/lib/
C:/wyc/toolchain/aaa/libexec/gcc/x86_64-wyc-linux-gnu/15.1.0/cc1.exe
-quiet -v -imultiarch x86_64-linux-gnu
-iprefix C:/wyc/toolchain/aaa/bin/../lib/gcc/x86_64-wyc-linux-gnu/15.1.0/
-isysroot C:/wyc/toolchain/aaa/bin/../x86_64-wyc-linux-gnu/sysroot
.\CMakeCCompilerId.c
-quiet -dumpdir c/wyc/CLionProjects/plantSunCat/build/
-dumpbase aaa.c
-dumpbase-ext .c
-mtune=generic
-march=x86-64
-version
-o C:\Users\wyc\AppData\Local\Temp\ccyN8nIV.s
PS C:\wyc\CLionProjects\plantSunCat\build\windows_to_linux_toolchain\CMakeFiles\3.31.6\CompilerIdC> gcc -### -c .\CMakeCCompilerId.c -o aaa.o
Using built-in specs.
COLLECT_GCC=C:\wyc\toolchain\aaa\bin\gcc.exe
Target: x86_64-wyc-linux-gnu
Configured with: ../configure --prefix=/aenv/mingw_wyc_176_toolchain --with-gmp=/aenv/mingw_wyc_176_toolchain --with-mpfr=/aenv/mingw_wyc_176_toolchain --with-mpfr=/aenv/mingw_wyc_176_toolchain --enable-languages=c,c++ --with-pkgversion='wyc 2025.07-25-plant_sun_cat' --with-bugurl=1104749580@qq.com --without-isl --without-cloog --disable-libssp --disable-multilib --disable-bootstrap --enable-shared --build=x86_64-pc-linux-gnu --host=x86_64-w64-mingw32 --target=x86_64-wyc-linux-gnu /aenv/mingw_wyc_176_toolchain x86_64-pc-linux-gnu x86_64-w64-mingw32 x86_64-wyc-linux-gnu --with-sysroot=/aenv/mingw_wyc_176_toolchain/x86_64-wyc-linux-gnu/sysroot
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 15.1.0 (wyc 2025.07-25-plant_sun_cat)
COLLECT_GCC_OPTIONS='-c' '-o' 'aaa.o' '-mtune=generic' '-march=x86-64'
"C:/wyc/toolchain/aaa/bin/../libexec/gcc/x86_64-wyc-linux-gnu/15.1.0/cc1.exe" -quiet -imultiarch x86_64-linux-gnu -iprefix "C:/wyc/toolchain/aaa/bin/../lib/gcc/x86_64-wyc-linux-gnu/15.1.0/" -isysroot "C:/wyc/toolchain/aaa/bin/../x86_64-wyc-linux-gnu/sysroot" ".\\CMakeCCompilerId.c" -quiet -dumpbase aaa.c -dumpbase-ext .c "-mtune=generic" "-march=x86-64" -o "C:\\Users\\wyc\\AppData\\Local\\Temp\\cc7Ncwwb.s"
COLLECT_GCC_OPTIONS='-c' '-o' 'aaa.o' '-mtune=generic' '-march=x86-64'
"C:/wyc/toolchain/aaa/bin/../lib/gcc/x86_64-wyc-linux-gnu/15.1.0/../../../../x86_64-wyc-linux-gnu/bin/as.exe" --64 -o aaa.o "C:\\Users\\wyc\\AppData\\Local\\Temp\\cc7Ncwwb.s"
COMPILER_PATH=C:/wyc/toolchain/aaa/bin/../libexec/gcc/x86_64-wyc-linux-gnu/15.1.0/;C:/wyc/toolchain/aaa/bin/../libexec/gcc/;C:/wyc/toolchain/aaa/bin/../lib/gcc/x86_64-wyc-linux-gnu/15.1.0/../../../../x86_64-wyc-linux-gnu/bin/
LIBRARY_PATH=C:/wyc/toolchain/aaa/bin/../lib/gcc/x86_64-wyc-linux-gnu/15.1.0/;C:/wyc/toolchain/aaa/bin/../lib/gcc/;C:/wyc/toolchain/aaa/bin/../lib/gcc/x86_64-wyc-linux-gnu/15.1.0/../../../../x86_64-wyc-linux-gnu/lib/../lib64/;C:/wyc/toolchain/aaa/bin/../x86_64-wyc-linux-gnu/sysroot/lib/x86_64-linux-gnu/;C:/wyc/toolchain/aaa/bin/../x86_64-wyc-linux-gnu/sysroot/lib/../lib64/;C:/wyc/toolchain/aaa/bin/../x86_64-wyc-linux-gnu/sysroot/usr/lib/x86_64-linux-gnu/;C:/wyc/toolchain/aaa/bin/../x86_64-wyc-linux-gnu/sysroot/usr/lib/../lib64/;C:/wyc/toolchain/aaa/bin/../lib/gcc/x86_64-wyc-linux-gnu/15.1.0/../../../../x86_64-wyc-linux-gnu/lib/;C:/wyc/toolchain/aaa/bin/../x86_64-wyc-linux-gnu/sysroot/lib/;C:/wyc/toolchain/aaa/bin/../x86_64-wyc-linux-gnu/sysroot/usr/lib/
COLLECT_GCC_OPTIONS='-c' '-o' 'aaa.o' '-mtune=generic' '-march=x86-64' '-dumpdir' 'aaa.'
-8
View File
@@ -1,8 +0,0 @@
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACC7eaOvuREWbtdh6T2x5jMKquhfP0Gb1lsyheyo6FgiwwAAAKgz0PK+M9Dy
vgAAAAtzc2gtZWQyNTUxOQAAACC7eaOvuREWbtdh6T2x5jMKquhfP0Gb1lsyheyo6Fgiww
AAAECT5gODBxKqPMVrxn+q68MB6yM6bvWZPcy8pbSQyUqpN7t5o6+5ERZu12HpPbHmMwqq
6F8/QZvWWzKF7KjoWCLDAAAAHnd5Y+mWq+awseaVpOmNj+6EhOaMnOe7ieS+gOaMnAECAw
QFBgc=
-----END OPENSSH PRIVATE KEY-----
-1
View File
@@ -1 +0,0 @@
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILt5o6+5ERZu12HpPbHmMwqq6F8/QZvWWzKF7KjoWCLD wyc閫氱敤鍏挜绉侀挜
-34
View File
@@ -1,34 +0,0 @@
# 四层网络模型
四层网络模型是一种简化的网络协议模型,通常用于网络通信的理解。它将OSI七层模型中的一些层合并,便于实际应用中理解网络通信过程。
## 四层网络模型概述
| 层次 | 主要功能 | 典型协议 | 常见设备/应用 |
|------------|----------------------------------------|------------------------------------|----------------------------------------|
| **应用层** | 提供用户与网络之间的接口,支持高层应用 | HTTP、FTP、SMTP、DNS、Telnet | 浏览器、电子邮件客户端、FTP工具、即时通讯 |
| **传输层** | 负责端到端的数据传输,确保数据可靠性 | TCP、UDP、SCTP | Web浏览、视频流、VoIP、文件传输 |
| **网络层** | 负责数据包的路由与寻址 | IP、ICMP、ARP | 路由器、IP地址分配、数据包路由 |
| **数据链路层** | 负责局域网内数据帧的封装与传输 | Ethernet、PPP、Frame Relay | 交换机、网卡、桥接设备 |
## 四层网络模型层次详细介绍
### 1. **应用层(Application Layer**
- **功能**:应用层是用户与计算机网络之间的接口。它直接为应用程序提供网络服务,负责与用户交互,处理高层的数据传输需求。
- **协议**HTTP、FTP、SMTP、DNS
- **常见应用**:Web浏览器、电子邮件客户端、文件传输、即时通讯工具
### 2. **传输层(Transport Layer**
- **功能**:传输层负责端到端的通信,确保数据可靠传输,管理数据的完整性、顺序和错误控制。传输层协议通过建立、维护和终止连接,确保数据从源到目标主机的正确传输。
- **协议**:TCP(传输控制协议)、UDP(用户数据报协议)、SCTP(流控制传输协议)
- **常见应用**:Web浏览、视频流、VoIP、文件传输
### 3. **网络层(Network Layer**
- **功能**:网络层负责数据包的路由和寻址,确保数据包能够从源主机通过多个路由中转到目标主机。它决定数据包的最佳传输路径,并处理网络间的通信。
- **协议**:IP(互联网协议)、ICMP(互联网控制消息协议)、ARP(地址解析协议)
- **常见应用**:路由协议(如RIP、OSPF、BGP)、数据包路由与寻址
### 4. **数据链路层(Data Link Layer**
- **功能**:数据链路层负责通过物理媒介在两个设备之间传输数据帧。它对数据进行封装,确保在物理层上正确地传送数据,并提供错误检测和纠正功能。
- **协议**Ethernet(以太网)、PPP(点对点协议)、Frame Relay(帧中继)
- **常见应用**:以太网交换机、网卡、桥接设备
-3
View File
@@ -1,3 +0,0 @@
sudo apt install openssh-server
sudo systemctl status ssh
@@ -1,75 +0,0 @@
# 虚拟机网络模式的区别
在虚拟机中,网络模式的选择会直接影响虚拟机与宿主机、外部网络的连接方式。常见的虚拟机网络模式有以下几种:
## 1. 桥接模式(Bridge Mode
- **虚拟机网络行为**:虚拟机就像与宿主机在同一局域网(LAN)中的一台独立机器。虚拟机将获得一个与宿主机在同一网段的 IP 地址,能够直接与物理网络中的其他设备通信。
- **优点**
- 虚拟机可以直接与外部网络通信,像真实的物理主机一样拥有一个独立的 IP 地址。
- 宿主机与虚拟机之间可以互相访问,且虚拟机可以直接访问互联网。
- **缺点**
- 如果宿主机的网络连接不稳定,虚拟机也会受到影响。
- 在某些情况下,桥接模式需要配置额外的网络设置(如静态 IP 或路由配置),并且依赖宿主机的网络连接。
- **适合场景**
- 当虚拟机需要访问外部网络并拥有与宿主机相同权限时,例如测试、开发环境中的网络服务配置。
## 2. NAT模式(Network Address Translation
- **虚拟机网络行为**:虚拟机通过宿主机的网络连接访问外部网络,但虚拟机本身并不会直接暴露到外部网络中。宿主机会为虚拟机提供网络地址转换服务(NAT),虚拟机获取的 IP 地址通常是私有地址(比如 `10.x.x.x``192.168.x.x`),而宿主机负责将数据包转发给外部网络。
- **优点**
- 简单易用,不需要额外的配置。只要宿主机连接到互联网,虚拟机也能通过宿主机访问外部网络。
- 宿主机和虚拟机共享一个公共 IP 地址,外部网络无法直接访问虚拟机。
- **缺点**
- 虚拟机不能直接被外部设备访问,除非使用端口转发(Port Forwarding)。
- 虚拟机与外部设备无法直接通信,虚拟机的网络配置更受宿主机控制。
- **适合场景**
- 当虚拟机不需要外部设备直接访问,只需要通过宿主机访问外部网络时,例如家庭网络、测试环境中的一般使用。
## 3. 仅主机模式(Host-Only
- **虚拟机网络行为**:虚拟机只能与宿主机进行通信,不能访问外部网络。宿主机会为虚拟机提供一个私有的网络,虚拟机和宿主机之间可以通过该网络进行通信,但虚拟机不能访问互联网。
- **优点**
- 提供一个隔离的网络环境,仅宿主机和虚拟机之间可以互相通信,适合用来测试虚拟机与宿主机之间的通信。
- 不需要外部网络连接,适合内部测试环境。
- **缺点**
- 虚拟机无法访问互联网或与其他设备通信。
- **适合场景**
- 用于需要隔离网络的测试环境,或者只需虚拟机与宿主机之间互通的场景。
## 4. 仅主机模式 + NAT
- **虚拟机网络行为**:虚拟机仅与宿主机通信,并且通过宿主机的 NAT 功能访问外部网络。虚拟机与宿主机之间是通过仅主机模式连接的,但虚拟机可以通过 NAT 模式访问外部网络。
- **优点**
- 虚拟机可以访问外部网络,但外部设备无法直接访问虚拟机。
- 提供了一定的隔离性,但同时保持了外部网络的访问能力。
- **缺点**
- 外部设备无法直接与虚拟机通信,虚拟机无法直接与外部设备通信,除非进行端口转发配置。
- **适合场景**
- 需要虚拟机访问外部网络,但不希望虚拟机暴露在外部网络中时。
## 5. 内部网络模式(Internal Network
- **虚拟机网络行为**:虚拟机之间可以相互通信,但不能访问宿主机或外部网络。该模式创建了一个内部虚拟网络,只有连接到该网络的虚拟机之间可以相互通信。
- **优点**
- 提供完全隔离的网络环境,适合多个虚拟机之间的独立网络测试。
- **缺点**
- 虚拟机无法访问宿主机或外部网络,不适合需要互联网访问的情况。
- **适合场景**
- 用于创建完全隔离的虚拟环境(例如,测试集群或虚拟化环境),虚拟机之间需要互通但不需要外部访问。
---
## 常见虚拟机网络模式的比较
| 网络模式 | 外部网络访问 | 宿主机与虚拟机通信 | 虚拟机与虚拟机通信 | 适用场景 |
|------------------|----------------|--------------------|--------------------|-------------------------------------|
| **桥接模式** | 是 | 是 | 是 | 需要虚拟机访问外部网络,适合开发、生产环境 |
| **NAT模式** | 是 | 是 | 是 | 简单的网络访问,适合一般用户和测试环境 |
| **仅主机模式** | 否 | 是 | 是 | 需要隔离网络的测试环境,宿主机与虚拟机通信 |
| **仅主机 + NAT** | 是 | 是 | 是 | 虚拟机访问外部网络但不被外部访问 |
| **内部网络模式** | 否 | 否 | 是 | 完全隔离的虚拟网络环境,适合多虚拟机测试 |
---
## 选择建议:
- **如果你想让虚拟机拥有一个独立的 IP 地址并且可以直接访问外部网络**,选择**桥接模式**。
- **如果你只需要虚拟机访问外部网络而不希望它被外部访问**,选择**NAT模式**。
- **如果你只希望虚拟机和宿主机之间进行通信,且不需要外部访问**,选择**仅主机模式**。
- **如果你希望虚拟机之间进行完全隔离的通信,并且虚拟机不能访问外部网络**,选择**内部网络模式**。
@@ -1,24 +0,0 @@
物理设备要安装
gdb server 通过离线安装包安装
focal (20.04LTS)
https://packages.ubuntu.com/focal/gdbserver
jammy (22.04LTS)
https://packages.ubuntu.com/jammy/gdbserver
sudo dpkg -r openssh-client
oracular (24.10)
https://packages.ubuntu.com/oracular/devel/gdbserver
openssh-server 通过网络安装
参考 https://developer.aliyun.com/article/1488008
sudo apt install openssh-server
sudo systemctl status ssh
iso 下载
https://releases.ubuntu.com/
https://releases.ubuntu.com/20.04/
https://releases.ubuntu.com/22.04/
-1
View File
@@ -1 +0,0 @@
https://zhuanlan.zhihu.com/p/145801160
-1
View File
@@ -1 +0,0 @@
#!/bin/bash
-10
View File
@@ -1,10 +0,0 @@
#!/bin/bash
sudo chmod 777 /opt
#如果是ubuntu20.04系统 先进去把中文输入法改好
sudo apt install libxcb-cursor0 libxcb-cursor-dev mesa-utils libgl1-mesa-dev libxcb-xinerama0 gcc g++ -y
sudo dpkg -i ./libiio-0.25.gb6028fd-Linux-Ubuntu-20.04.deb
./l_ipp_oneapi_p_2021.12.1.16_offline.sh
#sudo apt update && sudo apt upgrade -y
-24
View File
@@ -1,24 +0,0 @@
#!/bin/bash
# 检查是否以root权限运行
if [ "$(id -u)" -ne 0 ]; then
echo "请以root权限运行此脚本" >&2
exit 1
fi
newname="heco"
#Add New User
useradd -d /home/$newname -s /bin/bash -m $newname
usermod -aG sudo $newname
# 修改用户a123密码为123
echo "$newname:123456" | chpasswd
echo "success, Name:$newname, PassWord:123456"
echo "logout, use $newname log in."
echo "run delname.sh to del user a123
# adduser heco
# usermod -aG sudo heco
# deluser --remove-home a123
-156
View File
@@ -1,156 +0,0 @@
#!/bin/bash
echo "####################################################"
echo "############ ESUN ADRV9002 burn script #############"
echo "############ VERSION v1.0 #############"
echo "############ 2024-10-09 #############"
echo "############ Author: ZML #############"
echo "####################################################"
# set -x # 开启命令回显用于调试
export LC_ALL=C LANGUAGE=C LANG=C # 强制将本地语言设置为英文。这可以避免在进行文本和字符串处理时出现问题。
[ "$(id -u)" -ne 0 ] && SUDO="sudo" || SUDO="" # 检查当前用户是否为 root,如果是则设置 SUDO 为空,否则设置为 sudo
export ZN_SCRIPT_DIR="$(cd $(dirname ${BASH_SOURCE}) && pwd)" # 获取脚本所在的目录
if [ -f "${ZN_SCRIPT_DIR}/common.sh" ]; then # 导入 common.sh 中的本地函数
source common.sh
else
printf "\033[31m[ERROR]\033[0m Could not find file '${ZN_SCRIPT_DIR}/common.sh'\n"
return 1
fi
ZN_SCRIPT_NAME="$(basename ${BASH_SOURCE})" # 获取当前脚本的文件名
QSPI_DEVICE=${QSPI:="/dev/mtdblock0"} # 设置默认值,QSPI Flash位置
EMMC_DEVICE=${EMMC:="/dev/mmcblk1"}
#####################################################################
echo_info "[ $(date "+%Y/%m/%d %H:%M:%S") ] Starting ${ZN_SCRIPT_NAME}"
[ -e ${QSPI_DEVICE} ] && echo_info "检查 QSPI 设备: \"${QSPI_DEVICE}\" 存在!"
[ ! -e ${QSPI_DEVICE} ] && error_exit "检查 QSPI 设备: \"${QSPI_DEVICE}\" 不存在!"
[ -e ${EMMC_DEVICE} ] && echo_info "检查 eMMC 设备: \"${EMMC_DEVICE}\" 存在!"
[ ! -e ${EMMC_DEVICE} ] && error_exit "检查 eMMC 设备: \"${EMMC_DEVICE}\" 不存在!"
echo_info "卸载所有已挂载的分区"
for part in $(lsblk ${EMMC_DEVICE} -o mountpoint --noheadings); do
echo "${SUDO} umount ${part} && sleep 1"
${SUDO} umount ${part} && sleep 1
done
echo_info "删除 eMMC 设备上的所有现有分区"
for PARTITION in $(${SUDO} parted ${EMMC_DEVICE} print | awk '/^ /{print $1}'); do
echo "${SUDO} parted -s ${EMMC_DEVICE} rm ${PARTITION}"
${SUDO} parted -s ${EMMC_DEVICE} rm ${PARTITION}
done
read input
echo_info "选择 MBR 分区标准"
echo "${SUDO} parted -s ${EMMC_DEVICE} mklabel msdos"
${SUDO} parted -s ${EMMC_DEVICE} mklabel msdos
echo_info "创建 500MB 的 fat32 分区并设置为启动分区"
echo "${SUDO} parted -s ${EMMC_DEVICE} mkpart primary fat32 0% 500MiB && ${SUDO} parted -s ${EMMC_DEVICE} set 1 boot on"
${SUDO} parted -s ${EMMC_DEVICE} mkpart primary fat32 0% 500MiB && ${SUDO} parted -s ${EMMC_DEVICE} set 1 boot on
echo_info "创建 ext4 分区直到设备末尾"
echo "${SUDO} parted -s ${EMMC_DEVICE} mkpart primary ext4 500MiB 100%"
${SUDO} parted -s ${EMMC_DEVICE} mkpart primary ext4 500MiB 100%
echo_info "重新读取分区表而不重启 Linux 系统"
echo "${SUDO} partprobe ${EMMC_DEVICE} && sleep 1 && lsblk ${EMMC_DEVICE}"
${SUDO} partprobe ${EMMC_DEVICE} && sleep 1 && lsblk ${EMMC_DEVICE}
# 在新分区上创建文件系统
for PARTITION in $(lsblk -l ${EMMC_DEVICE} | grep part | awk '{print $1}'); do
PARTNUM=${PARTITION##*[[:alpha:]]}
case ${PARTNUM} in
1)
echo_info "在 /dev/${PARTITION} 上格式化 FAT32 文件系统,并设置磁盘标签为 'BOOT'"
echo "${SUDO} mkfs.vfat -F 32 -n "BOOT" /dev/${PARTITION}"
${SUDO} mkfs.vfat -F 32 -n "BOOT" /dev/${PARTITION}
;;
2)
echo_info "在 /dev/${PARTITION} 上格式化 ext4 文件系统,并设置磁盘标签为 'rootfs'"
echo "echo y | ${SUDO} mkfs.ext4 -L rootfs /dev/${PARTITION}"
echo y | ${SUDO} mkfs.ext4 -L rootfs /dev/${PARTITION}
;;
*)
echo_warn "意外的额外分区"
;;
esac
done
echo_info "[ $(date "+%Y/%m/%d %H:%M:%S") ] 完成emmc分区。"
###############################################################################
echo_info "部署启动镜像到 QSPI 闪存:"
echo "${SUDO} dd if=${ZN_SCRIPT_DIR}/../BOOT.bin of=${QSPI_DEVICE}"
${SUDO} dd if=${ZN_SCRIPT_DIR}/../BOOT.bin of=${QSPI_DEVICE}
if [ $? -eq 0 ]; then
echo_info "部署启动镜像到 QSPI Flash 成功!!!"
else
error_exit "部署启动镜像到 QSPI Flash 失败!!!"
fi
###############################################################################
echo_info "部署系统镜像到 eMMC:"
BOOT_MOUNT_POINT=/mnt/emmc/boot # 启动分区挂载点
ROOT_MOUNT_POINT=/mnt/emmc/rootfs # 根文件系统挂载点
echo "${SUDO} mkdir -p ${BOOT_MOUNT_POINT} ${ROOT_MOUNT_POINT}"
${SUDO} mkdir -p ${BOOT_MOUNT_POINT} ${ROOT_MOUNT_POINT}
# 遍历 eMMC 设备上的所有分区
for PARTITION in $(lsblk -l ${EMMC_DEVICE} | grep part | awk '{print $1}'); do
PARTNUM=${PARTITION##*[[:alpha:]]}
case ${PARTNUM} in
1)
# 检查启动分区是否为 FAT32 文件系统
[[ $(lsblk -no FSTYPE /dev/${PARTITION}) != 'vfat' ]] && error_exit "未找到可启动的设备"
echo_info "挂载启动分区到 ${BOOT_MOUNT_POINT}"
echo "${SUDO} mount -t vfat /dev/${PARTITION} ${BOOT_MOUNT_POINT}"
${SUDO} mount -t vfat /dev/${PARTITION} ${BOOT_MOUNT_POINT}
echo_info "安装启动镜像到 ${BOOT_MOUNT_POINT}"
# echo "${SUDO} rsync -rv ${ZN_SCRIPT_DIR}/boot/ ${BOOT_MOUNT_POINT} && sync"
# ${SUDO} rsync -rv ${ZN_SCRIPT_DIR}/boot/ ${BOOT_MOUNT_POINT} && sync
# 使用 cp 命令替代 rsync
echo "${SUDO} cp -r ${ZN_SCRIPT_DIR}/../* ${BOOT_MOUNT_POINT} && sync"
${SUDO} cp -r ${ZN_SCRIPT_DIR}/../* ${BOOT_MOUNT_POINT} && sync
echo_info "卸载启动分区从 ${BOOT_MOUNT_POINT}"
echo "${SUDO} umount ${BOOT_MOUNT_POINT}"
${SUDO} umount ${BOOT_MOUNT_POINT}
;;
2)
# 检查根文件系统分区是否为 ext4 文件系统
[[ $(lsblk -no FSTYPE /dev/${PARTITION}) != 'ext4' ]] && error_exit "未找到根文件系统分区"
echo_info "挂载根文件系统分区到 ${ROOT_MOUNT_POINT}"
echo "${SUDO} mount -t ext4 /dev/${PARTITION} ${ROOT_MOUNT_POINT}"
${SUDO} mount -t ext4 /dev/${PARTITION} ${ROOT_MOUNT_POINT}
# 检查根文件系统分区是否为空
if [ "$(ls -A ${ROOT_MOUNT_POINT})" != "lost+found" ]; then
${SUDO} umount ${ROOT_MOUNT_POINT}
error_exit "根文件系统分区不为空,请清理!"
fi
echo_info "安装根文件系统镜像到 ${ROOT_MOUNT_POINT}"
echo "${SUDO} tar zxf ${ZN_SCRIPT_DIR}/../rootfs.tar.gz -C ${ROOT_MOUNT_POINT} && sync"
${SUDO} tar zxf ${ZN_SCRIPT_DIR}/../rootfs.tar.gz -C ${ROOT_MOUNT_POINT} && sync
echo_info "卸载根文件系统分区从 ${ROOT_MOUNT_POINT}"
echo "${SUDO} umount ${ROOT_MOUNT_POINT}"
${SUDO} umount ${ROOT_MOUNT_POINT}
;;
*)
echo_warn "意外的额外分区"
;;
esac
done
print_info "[ $(date "+%Y/%m/%d %H:%M:%S") ] 烧录完成,请关闭设备,将拨码开关切换至eMMC启动,然后重新上电。\n"
###############################################################################
-62
View File
@@ -1,62 +0,0 @@
#!/bin/bash
# nmcli connection show
# nmcli device show
# NAME UUID TYPE DEVICE
# ens33 b6a6881e-97f1-42bd-8762-ce9468a7098c ethernet ens33
# virbr0 e81f5651-af1b-475c-ad9b-1b49ad2b93d9 bridge virbr0
# 通过设备获取 NAME
# echo "$(nmcli -t -f NAME,DEVICE connection show | grep "ens33" | cut -d':' -f1)"
# 通过类型获取 NAME
# echo "$(nmcli -t -f NAME,TYPE connection show | grep "ethernet" | cut -d':' -f1)"
#net_9002="有线连接 1"
#net_normal="有线连接 2"
net_9002="$(nmcli -t -f NAME,DEVICE connection show | grep "ens33" | cut -d':' -f1)"
net_normal="$(nmcli -t -f NAME,DEVICE connection show | grep "ens33" | cut -d':' -f1)"
if [[ ! -z "$net_9002" || ! -z "$net_normal" ]]; then
sudo nmcli connection modify "${net_9002}" ipv4.method manual
sudo nmcli connection modify "${net_9002}" ipv4.addresses 172.22.0.3/24
sudo nmcli connection modify "${net_9002}" ipv4.gateway 172.22.0.1
sudo nmcli connection modify "${net_normal}" ipv4.method auto
sudo systemctl restart NetworkManager.service
else
echo "网络设置错误! 请手动设置,当前网络设置如下:"
connections=$(nmcli -t -f NAME connection show)
for conn in $connections; do
echo "Connection: $conn"
ipv4_method=$(nmcli -g ipv4.method connection show "$conn")
echo " IPv4 Method: $ipv4_method"
ipv4_addresses=$(nmcli -g ipv4.addresses connection show "$conn")
echo " IPv4 Addresses: ${ipv4_addresses:-None}"
ipv4_gateway=$(nmcli -g ipv4.gateway connection show "$conn")
echo " IPv4 Gateway: ${ipv4_gateway:-None}"
done
fi
sudo cp ./a.tar.gz /home/heco
cd /home/heco || {
echo "cd /home/heco error!"
exit 1
}
sudo chmod 777 a.tar.gz
tar -xzvf ./a.tar.gz
cd /home/heco/ys_iio_test || {
echo "cd /home/heco/ys_iio_test error!"
exit 1
}
./run.sh
clear
current_time=$(date +"%Y-%m-%d %H:%M:%S")
echo "当前时间是: $current_time"
#ip a
#ip link show | awk '/^[0-9]+:/{iface=$2} /link/{print iface " " $2 " "}'
ip link show | awk '/^[0-9]+:/{iface=$2} /link/{printf "%-20s %-20s\n", iface, $2}'
echo "======================== 按任意键关机!,取消请按 ctrl+c ========================"
read input
unique_id=$(ip link show | awk '/^[0-9]+:/{iface=$2} /link/{print iface "[" $2 "]"}' | paste -sd "_" -)
log_file="./log/${current_time}_${unique_id}.log"
nmcli device show >"$log_file"
sudo shutdown now
-60
View File
@@ -1,60 +0,0 @@
#!/bin/bash
###############################################################################
# 版 权:米联客
# 技术社区:www.osrc.cn
# 功能描述:一些常用函数
# 版 本 号:V1.0
###############################################################################
# => Writing a Warning Message to the Console Window
echo_warn() {
local msg="$1"
printf "\033[33m[WARNING] \033[0m"
printf "$msg\n"
}
export -f echo_warn
# => Writing a Infomation Message to the Console Window
echo_info() {
local msg="$1"
printf "\033[32m[INFO] \033[0m"
printf "$msg\n"
}
export -f echo_info
# => Writing a Error Message to the Console Window
echo_error() {
local msg="$1"
printf "\033[31m[ERROR] \033[0m"
printf "$msg\n"
}
export -f echo_error
# => Writing a Warning Message to the Console Window
print_warn() {
local msg="$1"
printf "\033[33m$msg\033[0m"
}
export -f print_warn
# => Writing a Infomation Message to the Console Window
print_info() {
local msg="$1"
printf "\033[32m$msg\033[0m"
}
export -f print_info
# => Writing a Error Message to the Console Window
print_error() {
local msg="$1"
printf "\033[31m$msg\033[0m"
}
export -f print_error
# => Writing a Error Message to the Console Window and exit
error_exit() {
local msg="$1"
printf "\033[31m[ERROR] \033[0m"
printf "$msg\n"
exit 1
}
export -f error_exit
-1
View File
@@ -1 +0,0 @@
sudo dd if=out.img of=/dev/sda bs=4M status=progress
-34
View File
@@ -1,34 +0,0 @@
#!/bin/bash
# 检查是否以root权限运行
if [ "$(id -u)" -ne 0 ]; then
echo "请以root权限运行此脚本" >&2
exit 1
fi
newname="a123"
#Add New User
deluser --remove-home $newname
echo "delete success, Name:$newname"
# 修改系统语言为英文
LFILE="/etc/default/locale"
cp $LFILE $LFILE.bak
echo 'LANG="en_US.UTF-8"' | tee $LFILE >/dev/null
echo 'LANGUAGE="en_US.UTF-8"' | tee -a $LFILE >/dev/null
echo 'LC_ALL="en_US.UTF-8"' | tee -a $LFILE >/dev/null
source /etc/default/locale
echo "当前语言设置:"
locale
echo "注销系统或重启系统"
# adduser heco
# usermod -aG sudo heco
# deluser --remove-home a123

Some files were not shown because too many files have changed in this diff Show More