全志H5,NanopiKP1lus移植QT5.12记录
移植步骤
- 机器环境
- 下载QT5.12.0源码
- 安装交叉编译器
- 修改qmake.conf文件
- 配置编译选项
- qt5的configure选项说明
- 基本配置选项
- 编译器和链接器选项
- 功能模块配置
- 第三方库集成
- 注意事项
- 配置过程报错解决
- 配置完成
- 编译过程报错解决
- 编译完成
- 将arm-qt文件夹传送到开发板
- 配置板子环境变量
- 运行自带例子检验
- 宿主机QT arm环境开发
- 程序验证
- 移植完毕
机器环境
主机
Linux版本:Ubuntu24.04
板卡硬件:NanoPi K1 Plus,全志H5芯片,ARMv8架构,aarch64指令集,屏幕为1.96寸ST7789V屏幕(已移植好framebuffer驱动)
下载QT5.12.0源码
官方下载地址:https://download.qt.io/archive/qt/5.12/
下载qt-everywhere-src-5.12.0.tar.xz源码包
下载qt-opensource-linux-x64-5.12.0.run安装文件用于主机linux环境QT开发
安装交叉编译器
Nanopi_K1_Plus官方wiki教程里有链接,自行下载:
开发板使用教程wiki:https://wiki.friendlyelec.com/wiki/index.php/NanoPi_K1_Plus/zh
内核编译教程wiki:https://wiki.friendlyelec.com/wiki/index.php/Building_U-boot_and_Linux_for_H5/H3/H2%2B/zh
官方推荐编译器:gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu.tar.xz下载地址:https://download.friendlyelec.com/nanopineo2
下载交叉编译器gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu.tar.xz,然后解压编译器:
sudo mkdir -p /opt/FriendlyARM/toolchain
sudo tar xf gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu.tar.xz -C /opt/FriendlyARM/toolchain/
将编译器的路径加入到PATH中,用vi编辑vi ~/.bashrc,在末尾加入以下内容:
$ export PATH=/opt/FriendlyARM/toolchain/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin:$PATH
$ export GCC_COLORS=auto
执行一下~/.bashrc脚本让设置立即在当前shell窗口中生效,注意"."后面有个空格:
$ . ~/.bashrc
安装完成后,你可以快速的验证是否安装成功:
$ aarch64-linux-gnu-gcc -v
gcc version 6.3.1 20170109 (Linaro GCC 6.3-2017.02)
修改qmake.conf文件
将之前下载的qt源码qt-everywhere-src-5.12.0.tar.xz进行解压,我的解压目录如下:/home/image/work/nanopi-k1/qt,将解压目录名称缩短为qt-src-5.12.0,原名称太长,解压完成后源码根目录如下:/home/image/work/nanopi-k1/qt/qt-src-5.12.0
不同的硬件架构对应不同的qmake.conf,在下载的Qt5.12.11源码中的qtbase/mkspecs/目录下有各种不同的平台,H5使用的是linux-aarch64-gun-g++目录下的qmake配置文件。我们先创建一个文件夹aarch64,将linux-aarch64-gun-g++这个目录的文件拷贝到aarch64目录中。之前文件夹作备份。
mkdir aarch64
cd linux-aarch64-gnu-g++/
cp * ../aarch64/
修改前配置文件内容如下:
#
# qmake configuration for building with aarch64-linux-gnu-g++
#MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublibinclude(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)# modifications to g++.conf
QMAKE_CC = aarch64-linux-gnu-gcc
QMAKE_CXX = aarch64-linux-gnu-g++
QMAKE_LINK = aarch64-linux-gnu-g++
QMAKE_LINK_SHLIB = aarch64-linux-gnu-g++# modifications to linux.conf
QMAKE_AR = aarch64-linux-gnu-ar cqs
QMAKE_OBJCOPY = aarch64-linux-gnu-objcopy
QMAKE_NM = aarch64-linux-gnu-nm -P
QMAKE_STRIP = aarch64-linux-gnu-strip
load(qt_config)
修改后的文件内容如下:
MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib
# 指定编译平台
QT_QPA_DEFAULT_PLATFORM = linuxfb
# 指定平台架构
QMAKE_CFLAGS_RELEASE += -O2 -march=armv8-a -lts
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv8-a -ltsinclude(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
# 添加自己的交叉编译器路径
# modifications to g++.conf
QMAKE_CC = /opt/FriendlyARM/toolchain/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc
QMAKE_CXX = /opt/FriendlyARM/toolchain/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
QMAKE_LINK = /opt/FriendlyARM/toolchain/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
QMAKE_LINK_SHLIB = /opt/FriendlyARM/toolchain/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++# modifications to linux.conf
QMAKE_AR = /opt/FriendlyARM/toolchain/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ar cqs
QMAKE_OBJCOPY = /opt/FriendlyARM/toolchain/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-objcopy
QMAKE_NM = /opt/FriendlyARM/toolchain/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-nm -P
QMAKE_STRIP = /opt/FriendlyARM/toolchain/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-strip
load(qt_config)
配置编译选项
在解压的Qt5.12.0源码根目录下使用./configure -h命令,可以查看编译配置选项。
qt5的configure选项说明
Qt 5是一个跨平台的C++应用程序框架,用于开发具有图形用户界面(GUI)的应用程序以及非GUI程序,如服务器和命令行工具。在开始使用Qt 5开发之前,通常需要配置和编译Qt库。这个过程可以通过configure脚本进行,这个脚本位于Qt源码的根目录下。下面是一些常用的configure选项的说明:
基本配置选项
-prefix <dir>指定安装目录,例如 -prefix /usr/local/qt5。-release构建 release 版本。这是默认选项,如果你不需要 debug 符号,应该使用此选项。-debug构建 debug 版本,包含调试信息,有助于开发时调试。-opensource使用开源版本。这是默认选项,除非你有商业许可。-commercial使用商业版本。如果你购买了商业许可,应该使用此选项。
编译器和链接器选项
-make <tool>指定使用的 make 工具,例如 gmake 或 nmake。-platform <spec>指定平台规范,例如 linux-g++ 或 win32-msvc。-extapi <version>设置扩展 API 的版本号,用于二进制兼容性。-c++std <standard>指定 C++ 标准,例如 c++11、c++14、c++17 等。
功能模块配置
-nomake examples不编译示例程序。-nomake tests不编译测试程序。-skip <module>跳过指定的模块编译,例如 -skip qt3d。-feature-<feature>启用或禁用特定功能,例如 -feature-style_windowsmobile。
第三方库集成
-I<dir> 或 -L<dir> 或 -l<lib>分别用于添加头文件搜索路径、库文件搜索路径和链接到特定的库。例如,-I/usr/include/mylib 添加头文件搜索路径。-no-<feature> 和 -<feature>禁用或启用特定的特性或模块,例如 -no-opengl 禁用 OpenGL 支持。
注意事项
在运行
configure脚本之前,确保你的系统上已安装了所有必需的依赖项和开发工具。对于不同的操作系统和编译器,平台规范(如-platform选项)会有所不同。使用./configure -help可以查看所有可用的配置选项和更详细的说明。通过适当配置这些选项,你可以根据项目需求定制Qt的构建过程。
根据选项将需要编译的内容添加到一个shell脚本中进行QT功能裁减,在源码的根目录下新增autoconfig.sh这个文件,名称可以随便定义。
touch autoconfig.sh
chmod +x autoconfig.sh
下面为文件的内容。
./configure -prefix /home/image/work/nanopi-k1/qt/qt-src-5.12.0/arm-qt \ #这里路径要和自己相配-opensource -confirm-license \-release \-strip \-shared \-xplatform aarch64 \ #这里名称要和自己相配-optimized-qmake \-c++std c++11 \--rpath=no \-pch \-skip qt3d \-skip qtactiveqt \-skip qtandroidextras \-skip qtcanvas3d \-skip qtconnectivity \-skip qtdatavis3d \-skip qtdoc \-skip qtgamepad \-skip qtlocation \-skip qtmacextras \-skip qtnetworkauth \-skip qtpurchasing \-skip qtremoteobjects \-skip qtscript \-skip qtscxml \-skip qtsensors \-skip qtspeech \-skip qtsvg \-skip qttools \-skip qttranslations \-skip qtwayland \-skip qtwebengine \-skip qtwebview \-skip qtwinextras \-skip qtx11extras \-skip qtxmlpatterns \-make libs \-make examples \-nomake tools -nomake tests \-gui \-widgets \-dbus-runtime \--glib=no \--iconv=no \--pcre=qt \--zlib=qt \-no-openssl \--freetype=qt \--harfbuzz=qt \-no-opengl \-linuxfb \--xcb=no \--libpng=qt \--libjpeg=qt \--sqlite=qt \-plugin-sql-sqlite \-recheck-all
配置过程报错解决
运行./autoconfig.sh,生成makefile文件。如果您的ubuntu版本高于16.04,脚本执行可能出现以下问题:
问题1:
qrandom.cpp:455:62: error: no matching function for call to ‘std::mersenne_twister_engine
解决方法:定位到qrandom.cpp文件,文件编辑器打开后,在220行添加类型声明:typedef quint32 result_type;
问题2:
error: ‘numeric_limits’ is not a member of ‘std’
解决方法:在报错的.h和.cpp的文件加上#include <limits>头文件(configure会有提示错误,看看哪个文件出现numeric_limits这个报错,就给它添加上这个头文件)
配置完成
配置完成后提示以下内容,makefile文件已生成
Note: Also available for Linux: linux-clang linux-iccNote: -optimized-tools is not useful in -release mode.Qt is now configured for building. Just run 'gmake'.
Once everything is built, you must run 'gmake install'.
Qt will be installed into '/home/image/work/nanopi-k1/qt/qt-src-5.12.0/arm-qt'.Prior to reconfiguration, make sure you remove any leftovers from
the previous build.
执行make指令,源码开始编译
编译过程报错解决
问题1:
sh: 1: python: not found Project ERROR: Building QtQml requires Python. make: *** [Makefile:157:module-qtdeclarative-make_first] 错误 3
解决方法:1.用nano或者vi修改别名文件
$ vi .bashrc
添加别名
alias python=python3
保存后,输入下面命令生效
$ source .bashrc
这个时候python已经能打印信息了
2.编译依然有错误,复制python3文件夹为python。
先查询python3路径,命令:
$ which python3
$ sudo cp /usr/bin/python3 /usr/bin/python
问题2:
error::make_unique is not a member of ‘std’该类型错误由于交叉编译器版本较低,qt5.12源码含c++14以上版本代码,该编译器会报错。解决如下:
将报错文件中的声明类型
std::make_unique<T>(...)
替换为c++14更早期写法,错误有很多处,不要担心,请注意修改
std::unique_ptr<T>(new T())
编译完成
编译完成后,执行make install指令,在根目录生成arm-qt文件夹,里面包含目标板qt运行所需文件,宿主机qt编译所需编译器。
将arm-qt文件夹传送到开发板
压缩文件夹
tar czvf arm-qt.tar.gz arm-qt
scp命令把文件传送到开发板
scp arm-qt.tar.gz pi@192.168.199.177:/home/pi
在开发板上执行:将arm-qt文件夹放入/usr/lib
sudo cp arm-qt.tar.gz /usr/lib
在开发板上执行:在/usr/lib目录下解压压缩包
tar xzvf arm-qt.tar.gz
配置板子环境变量
开发板上执行:编辑/etc/profile文件,末尾添加以下内容
export QT_ROOT=/usr/lib/arm-qt #虚拟机中编译出来的arm-qt文件,根据自己的目录来填写
export QT_QPA_FONTDIR=/usr/share/fonts #字体的目录,如果Qt中有中文显示,需要拷贝电脑C盘中的字体文件到这个目录下面
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins#Qt支持的插件
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0
export QT_PLUGIN_PATH=$QT_ROOT/plugins
export LD_LIBRARY_PATH=$QT_ROOT/lib:$QT_ROOT/plugins/platforms
export QML2_IMPORT_PATH=$QT_ROOT/qml
开发板上执行:更新一下环境变量信息
source /etc/profile
运行自带例子检验
开发板上执行:运行一下自带例程
. /arm-qt/examples/widgets/animation/animatedtiles/animatedtiles
效果如下:


宿主机QT arm环境开发
电脑ubuntu安装之前下载的QT程序,qt-opensource-linux-x64-5.12.0.run
sudo ./qt-opensource-linux-x64-5.12.0.run
安装完成后,点击工具—选项配置编译器
QT Version这里选择编译好的qmake路径,也就是上面arm-qt文件夹中的qmake
配置交叉编译器路径,开发板厂提供的编译器aarch64-linux-gnu路径。
将前面配置好的信息添加到编译组件中

程序验证
选择配置好的套件新建工程
随便拉点控件

生成可执行文件,这里查看文件信息已经是ARM平台的可执行程序文件了

开发板效果展示,这里由于开发板没有拷贝相关字体库,所以这里的控件都没有文字。

移植完毕
参考链接:https://blog.csdn.net/libofu/article/details/118641287
相关文章:
全志H5,NanopiKP1lus移植QT5.12记录
移植步骤 机器环境下载QT5.12.0源码安装交叉编译器修改qmake.conf文件配置编译选项qt5的configure选项说明基本配置选项编译器和链接器选项功能模块配置第三方库集成注意事项 配置过程报错解决配置完成编译过程报错解决编译完成将arm-qt文件夹传送到开发板配置板子环境变量运行…...
定制一款国密浏览器(10):移植SM2算法前,解决错误码的定义问题
上一章中,我给大家介绍了 SM4 在 BoringSSL 上的移植要点,本来计划本章介绍 SM2 算法的移植要点。在移植 SM2 过程中,遇到了一个拦路虎,所以先扫除这个拦路虎,这就是错误码的定义问题。 在铜锁中,引入了几个错误码和错误字符串,在文件 sm2_err.c 中: static const ER…...
使用EXCEL绘制平滑曲线
播主播主,你都多少天没更新了!!!泥在干什么?你还做这个账号麻?!!! 做的做的(哭唧唧),就是最近有些忙,以及…… 前言&…...
Warcraft Logs [Classic] [WCL] Usage Wizard <HTOC>
HTOC(十字军的试炼)副本中各个BOSS的ID如下: 629 - 诺森德野兽 633 - 加拉克苏斯大王 637 - 派系冠军 641 - 瓦格里双子 645 - 阿努巴拉克 encounterID!637 and encounterID!641 encounterID NOT IN (637,641) 伤害 …...
【笔记】网络安全管理
计算机硬件中,运算器和控制器通常集成在一块芯片内,一般称为()。 数据库DB、数据库系统DBS、数据库管理系统DBMS,三者之间的关系是()。 OSI/RM体系结构中的网络层与TCP/IP体系结构中的&#x…...
在服务器上部署MinIO Server
MinIO的优势 高性能:MinIO号称是目前速度最快的对象存储服务器,据称在标准硬件上,对象存储的读/写速度最高可以高达183 GB/s和171 GB/s,可惜我的磁盘跟不上 兼容性:MinIO基于Amazon S3协议,并提供了与S3兼…...
一个改善Entity Framework异常处理和错误信息的开源项目
使用DDD从零构建一个完整的系统 使用Entity Framework作为ORM框架应该是绝大多数项目的选择,使得我们操作数据库变得简单方便;但是我们操作数据库,绝对是无法避免数据库发生异常的情况,数据库针对每一种异常也都会提供一个编码来…...
计算机视觉——基于 Yolov8 目标检测与 OpenCV 光流实现目标追踪
1. 概述 目标检测(Object Detection)和目标追踪(Object Tracking)是计算机视觉中的两个关键技术,它们在多种实际应用场景中发挥着重要作用。 目标检测指的是在静态图像或视频帧中识别出特定类别的目标对象࿰…...
PHP使用pandoc把markdown文件转为word
文章目录 首先安装pandocPHP处理 服务器操作系统是Linux,centos 首先安装pandoc yum install -y pandoc安装完成后输入如下代码,检查安装是否成功 pandoc --versionPHP处理 我把markdown内容存到了数据库里,所以要从数据库读取内容。对内容…...
第二十四天 - 分布式任务队列 - Celery高级应用 - 练习:分布式监控任务系统
一、Celery核心机制解析 1.1 分布式架构四要素 # celery_config.py BROKER_URL redis://:passwordlocalhost:6379/0 # 消息中间件 RESULT_BACKEND redis://:passwordlocalhost:6379/1 # 结果存储 TASK_SERIALIZER json ACCEPT_CONTENT [json] TIMEZONE Asia/Shanghai核…...
针对MCP认证考试中的常见技术难题进行实战分析与解决方案分享
一、身份与权限管理类难题 场景1:Active Directory组策略(GPO)不生效 问题现象:客户端计算机未应用新建的组策略。排查步骤: 检查GPO链接顺序:使用gpresult /r查看策略优先级,确保目标OU的GPO…...
【滑动窗口】最⼤连续 1 的个数 III(medium)
⼤连续 1 的个数 III(medium) 题⽬描述:解法(滑动窗⼝):算法思路:算法流程: C 算法代码:Java 算法代码: 题⽬链接:1004. 最⼤连续 1 的个数 III …...
OBS 日期时间.毫秒时间脚本 date-and-time.lua
文章目录 OBS 日期时间.毫秒时间脚本:效果 OBS 日期时间.毫秒时间脚本: obs obslua source_name ""last_text "" format_string "" activated false-- 此函数用于获取精确的毫秒级时间戳&#…...
探索大语言模型(LLM):目标、原理、挑战与解决方案
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言语言模型的目标语言模型的数学表示语言模型面临的挑战解决参数量巨大的方法1. 马尔可夫假设2. 神经网络语言模型3.自监督学习4. 分布式表示 脑图总结 前言 在自…...
ES基本操作(Java API)
1. 导入restClient依赖 <!-- es --><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.12.1</version></dependency> <!…...
得物官网sign签名逆向分析
打开得物官网,点击鞋类,可以看到请求 直接搜sign function p(e) {return f()("".concat(e ? s()(e).sort().reduce(function(t, n) {return "".concat(t).concat(n).concat(e[n])}, "") : "", "048a9…...
Agent的九种设计模式 介绍
Agent的九种设计模式 介绍 一、ReAct模式 原理:将推理(Reasoning)和行动(Acting)相结合,使Agent能够在推理的指导下采取行动,并根据行动的结果进一步推理,形成一个循环。Agent通过生成一系列的思维链(Thought Chains)来明确推理步骤,并根据推理结果执行相应的动作,…...
vivado 时钟IP核(MMCM PLL)
CMT简介 FPGA中时钟管理模块(CMT)包括PLL和MMCM,用于将时钟倍频(比如输入时钟25M,我们要产生50M时钟)、分频(在不影响系统功能的前提下,较低的工作时钟,能够降低系统功耗)、改变相位偏移或占空比等。 当需要…...
hackmyvm-airbind
收集信息 arp-scan -l nmap -sS -v 192.168.195.162 访问扫描到的ip,直接跳转到登录页面,利用admin/admin弱口令登录 在settings.php中找到一处文件上传,上传一句话木马,上传成功 反弹shell 上传php-reverse-shell.php 抓包&am…...
知识了解03——怎么解决使用npm包下载慢的问题?
1、为什么使用npm下载包会下载的慢 因为使用npm下载包时,默认使用国外服务器进行下载,此时的网络传输需要经过漫长的海底电缆,因此下载速度会变慢 2、怎么解决?(切换镜像源) (1)方…...
[晕事]今天做了件晕事71,_GNU_SOURCE
今天碰到一件晕,从别的地方搬运来一段代码,里面有使用in6_pktinfo这个结构体: struct in6_pktinfo pktinfo; 通过搜索发现需要include的头文件就是:netinet/in.h。加上这个头文件,还是出现找不到结构体的错误。最后通过仔细查看头文件,发现,这个结构体定义是在宏判断里…...
【算法数据结构】leetcode37 解数独
37. 解数独 - 力扣(LeetCode) 题目描述: 题目要求每一行 ,每一列,每个3*3 的子框只能出现一次。每个格子的数字范围1-9. 需要遍历每个空格填入可能的数字,并验证符合规则。如果符合就填入,不符…...
招商信诺原点安全:一体化数据安全管理解决方案荣获“鑫智奖”!
近日,“鑫智奖 2025第七届金融数据智能优秀解决方案评选”榜单发布,原点安全申报的《招商信诺:数据安全一体化管理解决方案》荣获「信息安全创新优秀解决方案」。 “鑫智奖第七届金融数据智能优秀解决方案评选”活动由金科创新社主办&#x…...
楼宇自控系统如何为现代建筑打造安全、舒适、节能方案
在科技飞速发展的当下,现代建筑对功能和品质的要求日益提升。楼宇自控系统作为建筑智能化的核心技术,宛如一位智慧的“管家”,凭借先进的技术手段,为现代建筑精心打造安全、舒适、节能的全方位解决方案,让建筑真正成为…...
吃透LangChain(四):消息管理与聊天历史存储
消息存储在内存 下面我们展示一个简单的示例,其中聊天历史保存在内存中,此处通过全局 Python 字典实现。我们构建一个名为 get_session_history 的可调用对象,引用此字典以返回chatMessageHistory实例。通过在运行时向 RunnablewithMessageHi…...
【差分隐私相关概念】瑞丽差分隐私(RDP)命题4
命题4的证明详解(分情况讨论) 背景与设定 机制: f : D → R f: \mathcal{D} \to \mathcal{R} f:D→R 是由 n n n 个 ϵ \epsilon ϵ-差分隐私机制自适应组合而成。相邻输入: D D D 和 D ′ D D′ 是相邻数据集。目标…...
RoBoflow数据集的介绍
https://public.roboflow.com/object-detection(该数据集的网址) 可以看到一些基本情况 如果我们想要下载,直接点击 点击图像可以看到一些基本情况 可以点击红色箭头所指,右边是可供选择的一些yolo模型的格式 如果你想下载…...
免费将AI生成图像放大4倍的方法
有些人不需要任何高级工具和花哨的技巧;他们只需要一种简单的方法来提升图像分辨率而不损失任何质量 — 今天,我们将学习如何做到这一点。 生成AI图像最大的问题之一是什么?最终结果通常分辨率非常低。 这会导致很多不同的问题,特别是对于那些想要在内容或项目中使用这些…...
滑动过期机制——延长 Token有效期
文章目录 1. Flask 后端代码(支持 WebSocket)2. Android Studio Java 前端代码(使用 Socket.IO)代码说明后端前端 注意事项 前端使用 Android Studio(Java)和 Socket.IO 库,后端使用 Flask。 1…...
《JVM考古现场(二十三):归零者·重启奇点的终极奥义》
目录 楔子:归零者文明觉醒 上卷十维弦理论破译 第一章:JVM弦论代码考古 第二章:超膜引用解析算法 第三章:量子真空涨落监控 中卷归零者心法实战 第四章:宇宙重启倒计时引擎 第五章:内存奇点锻造术 第…...
