笔记移除
This commit is contained in:
Vendored
-1
@@ -1 +0,0 @@
|
||||
{}
|
||||
Vendored
-1
@@ -1 +0,0 @@
|
||||
{}
|
||||
Vendored
-33
@@ -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
|
||||
}
|
||||
Vendored
-196
@@ -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-offline,python不完整
|
||||
|
||||
|
||||
// 查看依赖
|
||||
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>.
|
||||
@@ -1,12 +0,0 @@
|
||||
|
||||
|
||||
|
||||
|
||||
https://www.gyan.dev/ffmpeg/builds/
|
||||
|
||||
|
||||
发布版本
|
||||
release builds
|
||||
|
||||
下载
|
||||
ffmpeg-release-full-shared.7z .ver .sha256
|
||||
@@ -1,12 +0,0 @@
|
||||
$$ C(n,m)= \frac{n!}{(n−m)!m!} $$
|
||||
$$ P(n, m) = \frac{n!}{(n - m)!} $$
|
||||
|
||||
$$ C(n,m)=C(n−1,m−1)+C(n−1,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)的信息,
|
||||
这个环境变量会使得标准错误直接输出到控制台(而不是默认的日志系统)。
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -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->size} }}</DisplayString>
|
||||
<Expand>
|
||||
<Item Name="[referenced]">d->ref.atomic._q_value</Item>
|
||||
<ArrayItems>
|
||||
<Size>d->size</Size>
|
||||
<ValuePointer>(QPoint*)((reinterpret_cast<char*>(d)) + d->offset)</ValuePointer>
|
||||
</ArrayItems>
|
||||
</Expand>
|
||||
</Type>
|
||||
|
||||
<Type Name="QPolygonF">
|
||||
<DisplayString>{{ size = {d->size} }}</DisplayString>
|
||||
<Expand>
|
||||
<Item Name="[closed]">
|
||||
d->size > 0
|
||||
&& ((((QPointF*)((reinterpret_cast<char*>(d)) + d->offset)[0]).xp
|
||||
== (((QPointF*)((reinterpret_cast<char*>(d)) + d->offset)[d->size - 1]).xp)
|
||||
&& ((((QPointF*)((reinterpret_cast<char*>(d)) + d->offset)[0]).yp
|
||||
== (((QPointF*)((reinterpret_cast<char*>(d)) + d->offset)[d->size - 1]).yp)
|
||||
</Item>
|
||||
<Item Name="[referenced]">d->ref.atomic._q_value</Item>
|
||||
<ArrayItems>
|
||||
<Size>d->size</Size>
|
||||
<ValuePointer>(QPointF*)((reinterpret_cast<char*>(d)) + d->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<Policy>(bits.horPolicy)}, vertical = {static_cast<Policy>(bits.verPolicy)}, type = {ControlType(1 << bits.ctype)} }}
|
||||
</DisplayString>
|
||||
<Expand>
|
||||
<Synthetic Name="[vertical policy]">
|
||||
<DisplayString>QSizePolicy::Policy::{static_cast<Policy>(bits.verPolicy)}</DisplayString>
|
||||
</Synthetic>
|
||||
<Synthetic Name="[horizontal policy]">
|
||||
<DisplayString>QSizePolicy::Policy::{static_cast<Policy>(bits.horPolicy)}</DisplayString>
|
||||
</Synthetic>
|
||||
<Synthetic Name="[control type]">
|
||||
<DisplayString>QSizePolicy::ControlType::{ControlType(1 << bits.ctype)}</DisplayString>
|
||||
</Synthetic>
|
||||
<Synthetic Name="[expanding directions]">
|
||||
<DisplayString
|
||||
Condition="(static_cast<Policy>(bits.verPolicy) & ExpandFlag)">
|
||||
Qt::Vertical (2)
|
||||
</DisplayString>
|
||||
<DisplayString
|
||||
Condition="(static_cast<Policy>(bits.horPolicy) & ExpandFlag)">
|
||||
Qt::Horizontal (1)
|
||||
</DisplayString>
|
||||
</Synthetic>
|
||||
<Item Name="[vertical stretch]">static_cast<int>(bits.verStretch)</Item>
|
||||
<Item Name="[horizontal stretch]">static_cast<int>(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<unsigned short*>(d)) + d->offset / 2),sub}</DisplayString>
|
||||
<StringView>((reinterpret_cast<unsigned short*>(d)) + d->offset / 2),sub</StringView>
|
||||
<Expand>
|
||||
<Item Name="[size]">d->size</Item>
|
||||
<Item Name="[referenced]">d->ref.atomic._q_value</Item>
|
||||
<ArrayItems>
|
||||
<Size>d->size</Size>
|
||||
<ValuePointer>((reinterpret_cast<unsigned short*>(d)) + d->offset / 2),c</ValuePointer>
|
||||
</ArrayItems>
|
||||
</Expand>
|
||||
</Type>
|
||||
|
||||
<Type Name="QByteArray">
|
||||
<DisplayString>{((reinterpret_cast<char*>(d)) + d->offset),sb}</DisplayString>
|
||||
<StringView>((reinterpret_cast<char*>(d)) + d->offset),sb</StringView>
|
||||
<Expand>
|
||||
<Item Name="[size]">d->size</Item>
|
||||
<Item Name="[referenced]">d->ref.atomic._q_value</Item>
|
||||
<ArrayItems>
|
||||
<Size>d->size</Size>
|
||||
<ValuePointer>((reinterpret_cast<char*>(d)) + d->offset),c</ValuePointer>
|
||||
</ArrayItems>
|
||||
</Expand>
|
||||
</Type>
|
||||
|
||||
<Type Name="QBitArray">
|
||||
<DisplayString>{{ size = {(d.d->size << 3) - *((reinterpret_cast<char*>(d.d)) + d.d->offset)} }}</DisplayString>
|
||||
<Expand>
|
||||
<Item Name="[referenced]">d.d->ref.atomic._q_value</Item>
|
||||
<IndexListItems>
|
||||
<Size>(d.d->size << 3) - *((reinterpret_cast<char*>(d.d)) + d.d->offset)</Size>
|
||||
<ValueNode>
|
||||
(*(reinterpret_cast<const unsigned char*>((reinterpret_cast<char*>(d.d)) + d.d->offset) + 1
|
||||
+ ($i >> 3)) & (1 << ($i & 7))) != 0
|
||||
</ValueNode>
|
||||
</IndexListItems>
|
||||
</Expand>
|
||||
</Type>
|
||||
|
||||
<Type Name="QVarLengthArray<*>">
|
||||
<AlternativeType Name="QVarLengthArray<*, int>"/>
|
||||
<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<*>">
|
||||
<DisplayString>strong reference to shared pointer of type {"$T1"}</DisplayString>
|
||||
<Expand>
|
||||
<Item Name="[is null]">value == 0</Item>
|
||||
<Item Name="[weak referenced]">d->weakref._q_value</Item>
|
||||
<Item Name="[strong referenced]">d->strongref._q_value</Item>
|
||||
</Expand>
|
||||
</Type>
|
||||
|
||||
<Type Name="QSharedDataPointer<*>">
|
||||
<DisplayString>pointer to implicit shared object of type {"$T1"}</DisplayString>
|
||||
<Expand>
|
||||
<ExpandedItem>d</ExpandedItem>
|
||||
</Expand>
|
||||
</Type>
|
||||
|
||||
<Type Name="QExplicitlySharedDataPointer<*>">
|
||||
<DisplayString>pointer to explicit shared object of type {"$T1"}</DisplayString>
|
||||
<Expand>
|
||||
<ExpandedItem>d</ExpandedItem>
|
||||
</Expand>
|
||||
</Type>
|
||||
|
||||
<Type Name="QPointer<*>">
|
||||
<DisplayString>guarded pointer to subclass of QObject of type {"$T1"}</DisplayString>
|
||||
<Expand>
|
||||
<Item Name="[is null]">wp.d == 0 || wp.d->strongref._q_value == 0 || wp.value == 0</Item>
|
||||
</Expand>
|
||||
</Type>
|
||||
|
||||
<Type Name="QWeakPointer<*>">
|
||||
<DisplayString>weak reference to shared pointer of type {"$T1"}</DisplayString>
|
||||
<Expand>
|
||||
<Item Name="[is null]">d == 0 || d->strongref._q_value == 0 || value == 0</Item>
|
||||
<Item Name="[weak referenced]">d->weakref._q_value</Item>
|
||||
<Item Name="[strong referenced]">d->strongref._q_value</Item>
|
||||
</Expand>
|
||||
</Type>
|
||||
|
||||
<Type Name="QScopedPointer<*>">
|
||||
<DisplayString>scoped pointer to a dynamically allocated object of type {"$T1"}</DisplayString>
|
||||
<Expand>
|
||||
<Item Name="[is null]">!d</Item>
|
||||
</Expand>
|
||||
</Type>
|
||||
|
||||
<Type Name="QScopedArrayPointer<*>">
|
||||
<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<*,*>">
|
||||
<DisplayString>({first}, {second})</DisplayString>
|
||||
<Expand>
|
||||
<Item Name="[first]">first</Item>
|
||||
<Item Name="[second]">second</Item>
|
||||
</Expand>
|
||||
</Type>
|
||||
|
||||
<Type Name="QVector<*>">
|
||||
<AlternativeType Name="QStack<*>"></AlternativeType>
|
||||
<DisplayString>{{ size = {d->size} }}</DisplayString>
|
||||
<Expand>
|
||||
<Item Name="[referenced]">d->ref.atomic._q_value</Item>
|
||||
<ArrayItems>
|
||||
<Size>d->size</Size>
|
||||
<ValuePointer>($T1*)((reinterpret_cast<char*>(d)) + d->offset)</ValuePointer>
|
||||
</ArrayItems>
|
||||
</Expand>
|
||||
</Type>
|
||||
|
||||
<Type Name="QList<*>">
|
||||
<AlternativeType Name="QStringList"></AlternativeType>
|
||||
<AlternativeType Name="QQueue<*>"></AlternativeType>
|
||||
<DisplayString>{{ size = {d->end - d->begin} }}</DisplayString>
|
||||
<Expand>
|
||||
<Item Name="[referenced]">d->ref.atomic._q_value</Item>
|
||||
<IndexListItems>
|
||||
<Size>d->end - d->begin</Size>
|
||||
<ValueNode>*reinterpret_cast<$T1*>((sizeof($T1) > sizeof(void*))
|
||||
? reinterpret_cast<Node*>(d->array + d->begin + $i)->v
|
||||
: reinterpret_cast<$T1*>(d->array + d->begin + $i))
|
||||
</ValueNode>
|
||||
</IndexListItems>
|
||||
</Expand>
|
||||
</Type>
|
||||
|
||||
<Type Name="QLinkedList<*>">
|
||||
<DisplayString>{{ size = {d->size} }}</DisplayString>
|
||||
<Expand>
|
||||
<Item Name="[referenced]">d->ref.atomic._q_value</Item>
|
||||
<LinkedListItems>
|
||||
<Size>d->size</Size>
|
||||
<HeadPointer>d->n</HeadPointer>
|
||||
<NextPointer>n</NextPointer>
|
||||
<ValueNode>(*(QLinkedListNode<$T1>*)this).t</ValueNode>
|
||||
</LinkedListItems>
|
||||
</Expand>
|
||||
</Type>
|
||||
|
||||
<Type Name="QMapNode<*,*>">
|
||||
<DisplayString>({key}, {value})</DisplayString>
|
||||
<Expand>
|
||||
<Item Name="[key]">key</Item>
|
||||
<Item Name="[value]">value</Item>
|
||||
</Expand>
|
||||
</Type>
|
||||
|
||||
<Type Name="QMap<*,*>">
|
||||
<AlternativeType Name="QMultiMap<*,*>"/>
|
||||
<DisplayString>{{ size = {d->size} }}</DisplayString>
|
||||
<Expand>
|
||||
<Item Name="[referenced]">d->ref.atomic._q_value</Item>
|
||||
<TreeItems>
|
||||
<Size>d->size</Size>
|
||||
<HeadPointer>d->header.left</HeadPointer>
|
||||
<LeftPointer>left</LeftPointer>
|
||||
<RightPointer>right</RightPointer>
|
||||
<ValueNode>*((QMapNode<$T1,$T2>*)this)</ValueNode>
|
||||
</TreeItems>
|
||||
</Expand>
|
||||
</Type>
|
||||
|
||||
<Type Name="QHashNode<*,*>">
|
||||
<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<*,*>">
|
||||
<AlternativeType Name="QMultiHash<*,*>"/>
|
||||
<DisplayString>{{ size = {d->size} }}</DisplayString>
|
||||
<Expand>
|
||||
<ArrayItems IncludeView="buckets">
|
||||
<Size>d->numBuckets</Size>
|
||||
<ValuePointer>reinterpret_cast<Node **>(d->buckets)</ValuePointer>
|
||||
</ArrayItems>
|
||||
<CustomListItems ExcludeView="buckets">
|
||||
<Variable Name="n" InitialValue="d->numBuckets"/>
|
||||
<Variable Name="bucket" InitialValue="d->buckets"/>
|
||||
<Variable Name="node" InitialValue="d->buckets[0]"/>
|
||||
<Variable Name="keyValuePair" InitialValue="reinterpret_cast<Node *>(0)"/>
|
||||
<Size>d->size</Size>
|
||||
<Loop>
|
||||
<Break Condition="n == 0"/>
|
||||
<Exec>node = *(bucket++)</Exec>
|
||||
<Exec>--n</Exec>
|
||||
<Loop>
|
||||
<Break Condition="!node || !node->next"/>
|
||||
<Exec>keyValuePair = reinterpret_cast<Node *>(node)</Exec>
|
||||
<Item Name="[{keyValuePair->key}]">keyValuePair->value</Item>
|
||||
<Exec>node = node->next</Exec>
|
||||
</Loop>
|
||||
</Loop>
|
||||
</CustomListItems>
|
||||
</Expand>
|
||||
</Type>
|
||||
|
||||
<Type Name="QHashNode<*,QHashDummyValue>">
|
||||
<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<*>">
|
||||
<DisplayString>{{ size = {q_hash.d->size} }}</DisplayString>
|
||||
<Expand>
|
||||
<ExpandedItem>q_hash</ExpandedItem>
|
||||
</Expand>
|
||||
</Type>
|
||||
|
||||
<Type Name="QCache<*,*>::Node">
|
||||
<DisplayString>({*keyPtr}, {*t})</DisplayString>
|
||||
<Expand>
|
||||
<Item Name="[key]">*keyPtr</Item>
|
||||
<Item Name="[value]">*t</Item>
|
||||
</Expand>
|
||||
</Type>
|
||||
|
||||
<Type Name="QCache<*,*>">
|
||||
<DisplayString>{{ size = {hash.d->size} }}</DisplayString>
|
||||
<Expand>
|
||||
<Item Name="[max coast]">mx</Item>
|
||||
<Item Name="[total coast]">total</Item>
|
||||
<Item Name="[referenced]">hash.d->ref.atomic._q_value</Item>
|
||||
<LinkedListItems>
|
||||
<Size>hash.d->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<QString,QVariant>*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))}
|
||||
</DisplayString>
|
||||
<DisplayString Condition="d.type == QMetaType::QVariantList">
|
||||
{*((QList<QVariant>*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))}
|
||||
</DisplayString>
|
||||
<DisplayString Condition="d.type == QMetaType::QString">
|
||||
{*((QString*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))}
|
||||
</DisplayString>
|
||||
<DisplayString Condition="d.type == QMetaType::QStringList">
|
||||
{*((QStringList*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))}
|
||||
</DisplayString>
|
||||
<DisplayString Condition="d.type == QMetaType::QByteArray">
|
||||
{*((QByteArray*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))}
|
||||
</DisplayString>
|
||||
<DisplayString Condition="d.type == QMetaType::QBitArray">
|
||||
{*((QBitArray*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))}
|
||||
</DisplayString>
|
||||
<DisplayString Condition="d.type == QMetaType::QDate">
|
||||
{*((QDate*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))}
|
||||
</DisplayString>
|
||||
<DisplayString Condition="d.type == QMetaType::QTime">
|
||||
{*((QTime*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&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->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))}
|
||||
</DisplayString>
|
||||
<DisplayString Condition="d.type == QMetaType::QRectF">
|
||||
{*((QRectF*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))}
|
||||
</DisplayString>
|
||||
<DisplayString Condition="d.type == QMetaType::QSize">
|
||||
{*((QSize*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))}
|
||||
</DisplayString>
|
||||
<DisplayString Condition="d.type == QMetaType::QSizeF">
|
||||
{*((QSizeF*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))}
|
||||
</DisplayString>
|
||||
<DisplayString Condition="d.type == QMetaType::QLine">
|
||||
{*((QLine*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))}
|
||||
</DisplayString>
|
||||
<DisplayString Condition="d.type == QMetaType::QLineF">
|
||||
{*((QLineF*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))}
|
||||
</DisplayString>
|
||||
<DisplayString Condition="d.type == QMetaType::QPoint">
|
||||
{*((QPoint*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))}
|
||||
</DisplayString>
|
||||
<DisplayString Condition="d.type == QMetaType::QPointF">
|
||||
{*((QPointF*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&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<QString,QVariant>*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&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->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))
|
||||
</StringView>
|
||||
|
||||
<StringView Condition="d.type == QMetaType::QByteArray">
|
||||
*((QByteArray*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))
|
||||
</StringView>
|
||||
|
||||
<!--End region DisplayView QVariant-->
|
||||
|
||||
<!--Region Expand QVariant-->
|
||||
|
||||
<Expand>
|
||||
<ExpandedItem Condition="d.type == QMetaType::QVariantMap">
|
||||
*((QMap<QString,QVariant>*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))
|
||||
</ExpandedItem>
|
||||
<ExpandedItem Condition="d.type == QMetaType::QVariantList">
|
||||
*((QList<QVariant>*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))
|
||||
</ExpandedItem>
|
||||
<ExpandedItem Condition="d.type == QMetaType::QString">
|
||||
*((QString*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))
|
||||
</ExpandedItem>
|
||||
<ExpandedItem Condition="d.type == QMetaType::QStringList">
|
||||
*((QStringList*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))
|
||||
</ExpandedItem>
|
||||
<ExpandedItem Condition="d.type == QMetaType::QByteArray">
|
||||
*((QByteArray*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))
|
||||
</ExpandedItem>
|
||||
<ExpandedItem Condition="d.type == QMetaType::QBitArray">
|
||||
*((QBitArray*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))
|
||||
</ExpandedItem>
|
||||
<ExpandedItem Condition="d.type == QMetaType::QDate">
|
||||
*((QDate*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))
|
||||
</ExpandedItem>
|
||||
<ExpandedItem Condition="d.type == QMetaType::QTime">
|
||||
*((QTime*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))
|
||||
</ExpandedItem>
|
||||
<ExpandedItem Condition="d.type == QMetaType::QRect">
|
||||
*((QRect*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))
|
||||
</ExpandedItem>
|
||||
<ExpandedItem Condition="d.type == QMetaType::QRectF">
|
||||
*((QRectF*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))
|
||||
</ExpandedItem>
|
||||
<ExpandedItem Condition="d.type == QMetaType::QSize">
|
||||
*((QSize*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))
|
||||
</ExpandedItem>
|
||||
<ExpandedItem Condition="d.type == QMetaType::QSizeF">
|
||||
*((QSizeF*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))
|
||||
</ExpandedItem>
|
||||
<ExpandedItem Condition="d.type == QMetaType::QLine">
|
||||
*((QLine*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))
|
||||
</ExpandedItem>
|
||||
<ExpandedItem Condition="d.type == QMetaType::QLineF">
|
||||
*((QLineF*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))
|
||||
</ExpandedItem>
|
||||
<ExpandedItem Condition="d.type == QMetaType::QPoint">
|
||||
*((QPoint*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))
|
||||
</ExpandedItem>
|
||||
<ExpandedItem Condition="d.type == QMetaType::QPointF">
|
||||
*((QPointF*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))
|
||||
</ExpandedItem>
|
||||
<ExpandedItem Condition="d.type == QMetaType::QVariantHash">
|
||||
*((QHash<QString,QVariant>*)(d.is_shared ? d.data.shared->ptr
|
||||
: reinterpret_cast<const void *>(&d.data.ptr)))
|
||||
</ExpandedItem>
|
||||
</Expand>
|
||||
|
||||
<!--End region Expand QVariant-->
|
||||
</Type>
|
||||
|
||||
</AutoVisualizer>
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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.
|
||||
@@ -1,4 +0,0 @@
|
||||
https://www.cnblogs.com/Braveliu/p/13951178.html
|
||||
|
||||
|
||||
https://juejin.cn/post/7240636469461696570
|
||||
-125
@@ -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.
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -1,74 +0,0 @@
|
||||

|
||||
|
||||
这张图展示了射频信号处理中的一个重要概念: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
|
||||
@@ -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调制和解调的关键在于将信号分解为同相和正交分量,并利用这些分量进行调制和解调。
|
||||
@@ -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
|
||||
$$
|
||||
@@ -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 +0,0 @@
|
||||

|
||||
@@ -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 $ 是消息信号的最大频率。
|
||||
@@ -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
|
||||
@@ -1,3 +0,0 @@
|
||||
网站:http://www.sh315.com/
|
||||
用户名:ytesun
|
||||
密码:ysdz2015
|
||||
@@ -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)
|
||||
|
||||
|
||||
我觉得看那些书, 我居然可以从编程角度去理解他, 编程很多的时候就是 找事物之间的相同点与不同点,然后分类
|
||||
其核心就在于 我如何定义什么是特点
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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++写一个快速排序"
|
||||
}
|
||||
@@ -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
|
||||
@@ -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 服务名
|
||||
@@ -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 "== 完成 =="
|
||||
@@ -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"
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
@@ -1,11 +0,0 @@
|
||||
aider --chat-language chinese --chat-mode ask
|
||||
|
||||
|
||||
aider --chat-language chinese --gui
|
||||
|
||||
|
||||
|
||||
ctrl + L 视觉清屏
|
||||
|
||||
/clear
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
# C:\msys64\msys2_shell.cmd
|
||||
# -mingw64 -defterm -no-start -here
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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"/>
|
||||
@@ -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 生成表达式 一定要拿""包起来,不知道什么原因
|
||||
@@ -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,有特别要求,不注意表现为闪退,概率性,空指针错误
|
||||
|
||||
有些库 找不到库 会直接崩溃
|
||||
@@ -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。
|
||||
@@ -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
|
||||
@@ -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
@@ -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
|
||||
@@ -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.
|
||||
@@ -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
|
||||
@@ -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.
|
||||
@@ -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最低要求也没用……
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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");
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.'
|
||||
@@ -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 +0,0 @@
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILt5o6+5ERZu12HpPbHmMwqq6F8/QZvWWzKF7KjoWCLD wyc閫氱敤鍏挜绉侀挜
|
||||
@@ -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(帧中继)
|
||||
- **常见应用**:以太网交换机、网卡、桥接设备
|
||||
@@ -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 +0,0 @@
|
||||
https://zhuanlan.zhihu.com/p/145801160
|
||||
@@ -1 +0,0 @@
|
||||
#!/bin/bash
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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"
|
||||
###############################################################################
|
||||
@@ -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
|
||||
@@ -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 +0,0 @@
|
||||
sudo dd if=out.img of=/dev/sda bs=4M status=progress
|
||||
@@ -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
Reference in New Issue
Block a user