从原理到项目实践一步一步解析①cmake如何管理真实的项目 ②CMakeLists编写细节以及遇到的坑。

Cmake(1)——Cmake的基本介绍和原理、Cmake的安装、如何使用Cmake构建项目 CMake 是一个强大、灵活且跨平台的构建工具。通过学习并掌握 CMake 的使用,开发者可以更加高效地构建和管理项目,为未来的复杂项目做好准备。无论是在语法简洁性、跨平台支持、灵活性还是在大规模项目管理方面,CMake 都表现出色并值得推荐给那些追求高效的开发者和项目团队使用。 阅读详情

环境部署

即构建CMake项目之前的环境准备,请自行Google。涉及到各个平台(如linux)CMake、GCC、make、等等

Cmake

特性:跨平台、开源、提升编译效率、跨编译器版本(至少08之后、GCC 前向兼容cmake -G"Visual Studio 9 2008 Win64", 以上命令得用cd命令切换到顶层CMakeLists.txt的当前目录,才能生效)、支持单元测试(如GTEST

https://blog.youkuaiyun.com/sun_ashe/article/details/104527591/)

格式:CMakeLists.txt

功能: cmake这样的工具来帮助我们构建并维护项目代码。它能够输出各种各样的makefile或者project文件,简化编译构建过程和编译过程

 

Make

make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式—通过调用makefile文件中用户指定的命令来进行编译和链接的。

跟make命令使用:

如果经常在Linux系统下面与C、C++文件打交道的话,一定经常遇到四/五步走:

mkdir build

cd build

cmake ..

make

// 如果是安装依赖库的时候会用到

make installhttps://zhuanlan.zhihu.com/p/102955723(安装到系统目录便于其他模块使用)

前两步并不难理解,就是想把对应项目的编译文件放在build目录下不用提交,这样便于管理。为什么要新建一个 build 文件夹?一般我们采用 cmake的out-of-source方式来构建(即生成的中间产物和源代码分离),这样做可以让生成的文件和源文件不会弄混,且目录结构看起来也会清晰明了。所以推荐使用这种方式,至于这个文件夹的命名并无限制,我们习惯命名为 build。

 

CMakeLists(支持大小写)

  • 基础概念
  1. 环境变量的使用
  2. 预定义宏:

         CMAKE_CURRENT_SOURCE_DIR  cmake当前源文件根目录

         PROJECT_SOURCE_DIR   当前项目的顶级源目录

         CMAKE_COMPILER_IS_CUNCXX

  • 基本语法

一个CMakeLists项目必须的也是最基本的几条:

project(xxx) #必须

add_subdirectory(子文件夹名称) #父目录必须,子目录不必

add_library(库文件名称 STATIC 文件) #通常子目录(二选一)

add_executable(可执行文件名称 文件) #通常父目录(二选一)

include_directories(路径) #必须

link_directories(路径) #必须

target_link_libraries(库文件名称/可执行文件名称 链接的库文件名称) #必须

  • 项目实践
├── qaxtgs

│   ├── build

│   │   ├── CMakeCache.txt

│   │   ├── CMakeFiles

│   │   │   ├── 3.9.2

│   │   │   │   ├── CMakeCCompiler.cmake

│   │   │   │   ├── CMakeCXXCompiler.cmake

│   │   │   │   ├── CMakeDetermineCompilerABI_C.bin

│   │   │   │   ├── CMakeDetermineCompilerABI_CXX.bin

│   │   │   │   ├── CMakeSystem.cmake

│   │   │   │   ├── CompilerIdC

│   │   │   │   │   ├── a.out

│   │   │   │   │   ├── CMakeCCompilerId.c

│   │   │   │   │   └── tmp

│   │   │   │   └── CompilerIdCXX

│   │   │   │       ├── a.out

│   │   │   │       ├── CMakeCXXCompilerId.cpp

│   │   │   │       └── tmp

│   │   │   ├── cmake.check_cache

│   │   │   ├── CMakeDirectoryInformation.cmake

│   │   │   ├── CMakeOutput.log

│   │   │   ├── CMakeTmp

│   │   │   ├── feature_tests.bin

│   │   │   ├── feature_tests.c

│   │   │   ├── feature_tests.cxx

│   │   │   ├── Makefile2

│   │   │   ├── Makefile.cmake

│   │   │   ├── progress.marks

│   │   │   └── TargetDirectories.txt

│   │   ├── cmake_install.cmake

│   │   ├── common

│   │   │   ├── CMakeFiles

│   │   │   │   ├── CMakeDirectoryInformation.cmake

│   │   │   │   └── progress.marks

│   │   │   ├── cmake_install.cmake

│   │   │   ├── jsoncpp

│   │   │   │   ├── CMakeFiles

│   │   │   │   │   ├── CMakeDirectoryInformation.cmake

│   │   │   │   │   └── progress.marks

│   │   │   │   ├── cmake_install.cmake

│   │   │   │   └── Makefile

│   │   │   ├── Makefile

│   │   │   ├── platform

│   │   │   │   ├── CMakeFiles

│   │   │   │   │   ├── CMakeDirectoryInformation.cmake

│   │   │   │   │   └── progress.marks

│   │   │   │   ├── cmake_install.cmake

│   │   │   │   └── Makefile

│   │   │   └── QaxLog

│   │   │       ├── CMakeFiles

│   │   │       │   ├── CMakeDirectoryInformation.cmake

│   │   │       │   └── progress.marks

│   │   │       ├── cmake_install.cmake

│   │   │       └── Makefile

│   │   ├── Makefile

│   │   ├── qaxtgs

│   │   │   ├── CMakeFiles

│   │   │   │   ├── CMakeDirectoryInformation.cmake

│   │   │   │   ├── progress.marks

│   │   │   │   └── qaxtgs.dir

│   │   │   │       ├── build.make

│   │   │   │       ├── cmake_clean.cmake

│   │   │   │       ├── CXX.includecache

│   │   │   │       ├── DependInfo.cmake

│   │   │   │       ├── depend.internal

│   │   │   │       ├── depend.make

│   │   │   │       ├── dllmain.cpp.o

│   │   │   │       ├── fc_s_apis.cpp.o

│   │   │   │       ├── FileMonRule.cpp.o

│   │   │   │       ├── FileMonRuleMgr.cpp.o

│   │   │   │       ├── flags.make

│   │   │   │       ├── link.txt

│   │   │   │       ├── pch.cpp.o

│   │   │   │       ├── progress.make

│   │   │   │       ├── QaxTgsImpl.cpp.o

│   │   │   │       ├── ReportWorker.cpp.o

│   │   │   │       └── TgcDataConversion.cpp.o

│   │   │   ├── cmake_install.cmake

│   │   │   └── Makefile

│   │   └── README.md

│   ├── CMakeLists.txt

│   ├── common

│   │   ├── CMakeLists.txt

│   │   ├── interface

│   │   │   ├── fc_s_apis.h

│   │   │   ├── IQaxTgscBase.h

│   │   │   └── IQKFileMon.h

│   │   ├── jsoncpp

│   │   │   ├── CMakeLists.txt

│   │   │   ├── json

│   │   │   │   ├── allocator.h

│   │   │   │   ├── assertions.h

│   │   │   │   ├── autolink.h

│   │   │   │   ├── config.h

│   │   │   │   ├── features.h

│   │   │   │   ├── forwards.h

│   │   │   │   ├── json.h

│   │   │   │   ├── reader.h

│   │   │   │   ├── value.h

│   │   │   │   ├── version.h

│   │   │   │   └── writer.h

│   │   │   ├── JsonHelper.h

│   │   │   └── src

│   │   │       ├── json_reader.cpp

│   │   │       ├── json_tool.h

│   │   │       ├── json_value.cpp

│   │   │       ├── json_valueiterator.inl

│   │   │       └── json_writer.cpp

│   │   ├── platform

│   │   │   ├── api_os_util.h

│   │   │   ├── CMakeLists.txt

│   │   │   ├── dlfcn.h

│   │   │   ├── DllLoader.h

│   │   │   ├── platform_Thread.cpp

│   │   │   ├── platform_Thread.h

│   │   │   ├── str.h

│   │   │   ├── StringUtils.cpp

│   │   │   ├── StringUtils.h

│   │   │   └── XdFileSystem.h

│   │   └── QaxLog

│   │       ├── CMakeLists.txt

│   │       ├── QaxLog.cpp

│   │       ├── QaxLog.h

│   │       └── Qaxlog.ini

│   └── qaxtgs

│       ├── bin

│       │   └── x64

│       │       └── Release

│       │           └── libqaxtgs.so

│       ├── CMakeLists.txt

│       ├── dllmain.cpp

│       ├── fc_s_apis.cpp

│       ├── FileMonRule.cpp

│       ├── FileMonRule.h

│       ├── FileMonRuleMgr.cpp

│       ├── FileMonRuleMgr.h

│       ├── framework.h

│       ├── lib

│       │   └── libqaxtgs.so

│       ├── obj

│       │   └── x64

│       │       └── Release

│       │           ├── dllmain.o

│       │           ├── fc_s_apis.o

│       │           ├── FileMonRuleMgr.o

│       │           ├── FileMonRule.o

│       │           ├── json_reader.o

│       │           ├── json_value.o

│       │           ├── json_writer.o

│       │           ├── pch.o

│       │           ├── platform_Thread.o

│       │           ├── QaxLog.o

│       │           ├── QaxTgsImpl.o

│       │           ├── ReportWorker.o

│       │           ├── StringUtils.o

│       │           └── TgcDataConversion.o

│       ├── pch.cpp

│       ├── pch.h

│       ├── QaxTgsImpl.cpp

│       ├── QaxTgsImpl.h

│       ├── ReportWorker.cpp

│       ├── ReportWorker.h

│       ├── TgcDataConversion.cpp

│       ├── TgcDataConversion.h

│       └── TgcPolicyServer.json

└── test

    ├── bin

    │   └── x64

    │       └── Release

    │           └── test.out

    ├── CMakeLists.txt

    ├── include

    │   └── dlfcn.h

    ├── obj

    │   └── x64

    │       └── Release

    │           └── main.o

    └── src

        └── main.cpp

步骤(顺序无所谓、搞清楚原理GUI->API):

  1. 根目录CMakeLists

  1. 各子目录CMakeLists

解释:

Q1:CMakeLists应该出现在工程的那些位置,那些不需要

A1:CMakeLists粒度是二进制文件(exe\so\dll\lib\a\out\...)

QA

Q: 为什么选cmake,vs不就可以?

A: 刚接触的时候深深体会到cmake的方便:如果目标平台是windows,它可以帮你自动构建出vs工程;如果是安卓,自动构建出eclipse工程,如果是IOS,自动构建出xcode工程。想想以前用vs建工程的时候,如果要引入第三方库,必须要手动配置第三方库路径,如果引入的库少,那还没什么,如果多的话就悲剧了,配个环境都要半天。再想想以前在linux平台下手动写Makefile的时候,如果工程比较小,模块少还好办,如果工程大,模块多,各种写依赖关系都要让你抓狂。有了cmake这个工具,我们完全可以靠它来帮我们构建vs工程,写Makefile文件。既然cmake构建工程这么方便,当然需要拿来用

 

Q: 原理书推荐?训练git?

A: 《程序员的自我修养—链接、装载与库》& https://github.com/ttroy50/cmake-examples

QT Creator新手必看:解决CMake项目只加载CMakeLists.txt的7种方法(附截图) 本文为QT Creator新手提供了7种解决CMake项目只加载CMakeLists.txt的实用方法,包括项目加载原理、配置检查、缓存清理等。通过详细步骤和截图,帮助开发者快速掌握QT Creator与CMake的集成技巧,提升开发效率。 阅读详情

相关推荐

关于Cmake的入门学习(一)

1、Cmake编译原理 CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库(so(shared object))。 2、一个cmakelists的例子详解 #.指定项目的...

还没学明白 2835

pg内核之日志管理器(一)SLRU缓冲池

每个段都有一个段号,通过段号找到对应的文件,相反的如果知道日志的页面号,就可以找到该页面所在的段文件及该页在段文件中的偏移,当需要对这些文件进行操作时,需要先将其读入内存中,在内存中则以SLRU缓冲池的形式存在。因为往磁盘中写入是以块为单位的,而大多数情况是一个日志记录比一个块小多了,为了降低写入日志带来的IO开销,数据库中就设置了日志缓冲区,缓冲区以页为单位,当日志缓冲区满了之后就以块为单位写入磁盘。pg中的日志管理主要包括两种日志,一种是XLOG日志,记录的是事务对数据更新的过程和事务的最终状态。

mirai_D_zoro的博客 1581

CMake的原理与使用方法

一.为什么需要CMake,什么是CMake 1.由于各种make工具遵循不同的规范和标准,所执行的Makefile格式也不同,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。

热土程序园,利他愉己~ 1729

cmake编译原理

一. CMake编译原理   CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库(so(shared object))。因此CMake的编译基本就两个步骤: cmake m...

梦心之魂的博客 4326

CMake项目构建与管理实战样例

在使用现成的Find模块时,开发者可能需要根据项目需求进行调整。这包括修改查找的路径、更改库的名称或指定特定的版本要求。以下是如何自定义Find模块以适应特定需求的示例:# 自定义Find模块示例代码块# 修改FindZLIB模块以查找特定版本的ZLIB库# 修改FindXXX.cmake模块中的查找逻辑通过这种方式,开发者可以确保Find模块能够准确地找到符合项目特定要求的依赖项。

weixin_35756130的博客 1013

CMake构建系统源码解析与应用

CMake(Cross Platform Make)是一个跨平台的自动化构建系统,它使用CMakeLists.txt文件来描述项目的构建过程,通过生成原生的构建环境(如Makefile、Visual Studio Solutions等)来控制软件的构建过程。它能够让开发者使用相同的CMakeLists.txt文件,在不同的操作系统和编译环境中构建软件。# 自定义命令,执行一个简单的复制任务# 将自定义命令与目标关联起来:定义了一个自定义的构建命令,本例中为复制文件。

weixin_42443533的博客 1020

CMake原理

CMake的定义 是Cross Platform Make的缩写。跨平台,支持Linux、Mac和Windows。编译语言简单,易用,简化编译构建过程和编译过程。CMake可以“读取”并执行CMakeLists.txt文件的语句,生成Makefile文件 与其他编译工具的对比 GCC。项目简单时,可以gcc/g++编译目标和项目,复杂时,只用gcc组织编译架构就变得很困难。 Makefile。一种有条理的gcc编译命令的文件,利用make工具来执行Makefile文件的编译指令。项目简单时,可以手写Ma

weixin_46275484的博客 2169

CMakeDirectoryInformation.cmake

CMakeDirectoryInformation.cmake

【CMake】15分钟入门CMake

上面介绍了CMake的工作原理,以及一些基本的语法操作,掌握上述语法之后,可以简单的阅读一些项目的CMakeLists.txt。下面给出了上述例子的项目地址,感兴趣的童鞋可以下载运行一下。

从善若水的博客 1072

orangepi 5 plus ubuntu24.04上安装redroid

OrangePi 5 Plus运行reDroid云手机方案总结 在RK3588+Ubuntu 24.04上部署reDroid(Android容器化方案)的关键步骤: 内核要求:确保启用binderfs(无需ashmem,新版reDroid使用memfd替代); 安装流程: 安装Docker并配置代理加速镜像拉取; 拉取reDroid镜像(推荐Android 12/13 ARM64版本); 通过挂载binderfs启动容器,指定分辨率与DPI参数; 多实例管理: 脚本化创建多个容器(如8个实例),分配独立端口

babytiger的专栏 2287

中介效应、调节效应与交互效应:从概念辨析到统计建模全指南

在社会科学与数据分析研究中,理解变量之间的因果关系与条件性影响是核心任务之一。回归分析作为最基础的统计工具,常被用于探索自变量对因变量的作用机制,而中介效应与调节效应则分别回答了“如何影响”与“何时影响不同”的深层问题。中介效应通过路径分析拆解因果链条,揭示内部的传导机制;调节效应则借助交互项识别影响的边界条件。Bootstrap法已成为检验间接效应的主流手段,而简单斜率分析则让调节作用的模式更加直观。无论是用户研究、医学统计还是产品数据分析,掌握这些模型都能帮助研究者构建更具解释力的实证框架。本文基于大量

weixin_29051149的博客 330

CMake构建Makefile深度解析:从底层原理到复杂项目

CMake构建Makefile深度解析:从底层原理到复杂项目

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 1779

IPD(集成产品开发)管理之道

IPD,是集成产品开发(Integrated Product Development)的缩写,它是集成了众多管理模型和理论、众多企业最佳管理实践的一整套体系,可以帮助企业快速响应市场变化、缩短产品上市时间、减少资源浪费、提高生产力,最终取得商业成功。IPD的思想最早来源于美国PRTM公司出版的《产品及生命周期优化法》一书中,该书详细描述了IPD模式所包含的各个方面。但IPD在中国的普及,源于IBM和华为的推行使用。IPD作为一套先进的产品研发管理模式,其成功的基础是功能部门和各团队之间的密切配合。

钢镚·真的博客 2709

【002】CMake 零基础:编写你的第一个 CMakeLists.txt

还在手动编译你的 C++ 项目吗?告别繁琐的命令行,让 CMake 来拯救你!CMakeLists.txt 文件是 CMake 的输入,通过该文件定义项目的构建规则。了解 CMake 的基本命令和语法,将为顺利编写 CMakeLists.txt 打下基础。本文将通过具体的步骤演示如何创建一个简单的 CMakeLists.txt 文件,并配置项目以生成可执行文件,帮助读者快速上手 CMake。

Lion_Long的博客 1460

AutoSAR从0开始实战 --- 目录

​​​​​​本专栏是全网最真实的AutoSAR实战专栏,博主将从一个0基础小白的身份来讲解AutoSAR工具的配置,以及相应代码的讲解。

wj博客 1726

十一、Cadence ic 617以及assura使用总结

1.617的端口和514不同,没有网络属性,使用时不能直接放在原理图上,如果要直接放在图上要接线并且放上标签。2.617的端口也不能直接放在线上,514中将端口直接放在线上是可以使端口和线连接,但617看似连接,但拉出来线没有交点,实际上没有连接。这里set switches里的选项表示不同的模块,也就是选择一个就只对这一部分进行DRC验证,要验证整个版图的DRC就要把所有的选项选中,然后一个个改正。LVS中也是一样,要全部选中改正。

0 2294

CMakeLists文件的编译

文章目录CMakeLists的编译CMakeLists编译原理**文件路径:****编写CMakeLists.txt**CMakeLists常用命令CmkeLists的基本步骤1.1 CMake版本1.2 软件包名称1.3 查找相关的CMake包1.4 设置配置环境1.5 **指定头文件目录**1.6 可执行目标Qt CMakeLists使用案例 CMakeLists的编译 参考链接 CMakeLists编译原理 ​ CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLi

m0_51451952的博客 8527

【OpenClaw从入门到精通】第41篇:2026年4月最新版——从零开始搭建你的第一个安全AI助理(保姆级实战教程)

2026年3月CNCERT联合发布《OpenClaw安全使用实践指南》后,安全部署成为OpenClaw使用的核心前提。本文针对新手及进阶用户,基于官方安全指引,提供三套实战部署方案:阿里云一键部署(新手首选)、Docker容器隔离部署(进阶推荐)、本地安全安装(测试专用),并详解阿里云百炼Coding Plan API接入流程。全文涵盖环境准备、分步实操、安全加固、问题排查等全流程,所有命令可直接复制执行,无需依赖外部代码库。通过本文,读者可零基础搭建安全隔离的OpenClaw AI助理,兼顾实用性与安全性

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2196

CMake编写教程

示例项目 示例项目的目录树结构可能如下所示: - myProject/ - CMakeLists.txt - sdkconfig - components/ - component1/ - CMakeLists.txt - Kconfig - src1.c

Horsdy123的专栏 6751

BEV和OCC学习-4:数据准备生成pkl文件(NuSences)

info[‘cam_instances’][‘CAM_XXX’][i][‘bbox_3d’]:长度为 7 的列表,以 (x, y, z, l, h, w, yaw) 的顺序表示实例的 3D 边界框。info[‘cam_instances’][‘CAM_XXX’][i][‘bbox’]:2D 边界框标注(3D 框投影的矩形框),顺序为 [x1, y1, x2, y2] 的列表。info[‘cam_instances’][‘CAM_XXX’][i][‘attr_label’]:实例的属性标签。

zfjBIT的专栏 1699

[实践篇]13.13 再来梳理一下HAB的设计原理

HAB全称为Hypervisor Abstraction,即硬件抽象,主要用于提供对HOST OS硬件资源的访问。

从0到1,突破自己 7256

【C++】Vscode 中使用CMakeLists(推荐)构建C++项目:项目结构、各个文件夹的作用、从编码到debug

Vscode建立C++项目结构及各个文件夹的作用(不使用CMakeList.txt版)_玛丽莲茼蒿的博客-优快云博客首先要明白,vscode只是一个记事本,本身是不能够进行任何程序语言开发的。只不过这个记事本可以安装插件,可以和命令行程序结合起来使用,使得它可以进行开发。一、Vscode下C++项目的目录结构首先,类似于我们在IDEA中新建一个普通java项目,项目的目录结构是这样的:新建一个maven模板的java项目,项目的目录结构是这样的:构建一个web模板的java项目,项目的目录结构是这样的:用

qq_44886213的博客 2万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Cmake入门教程 - 编写CMakeLists.txt文件编译C/C++程序

1.CMake编译原理 CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库(so(shared object))。因此CMake的编译基本就两个步骤: cmake make ...

SeekAndFindYou的博客 751

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

cmake_cmake简介

CMake(Cross-platform Make)是Kitware公司主导的一个开源的、跨平台自动化构建、测试系统。CMake最初是被设计为各种Makefile方言的生成器,如今的CMake为现代构建系统例如Ninja生成构建文件、也可以为Visual Studio 和Xcode等 IDE 生成项目文件。

weixin_43916755的博客 1299

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

cmake入门教程 跨平台项目构建工具cmake介绍

cmake的安装命令如下:CMake提供cmake、ctest和cpack三个命令行工具分别负责构建、测试和打包。本文主要介绍cmake命令。生成构建系统(buildsystem,比如make工具对应的Makefile);执行构建(比如make),生成目标文件;执行测试、安装或打包。

朝气蓬勃 4100
上一篇: REST跟RPC
下一篇: 关于回调函数跟this指针的一些理解
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ปรัชญา แค้วคำมูล

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值