自动万能makefile(linux ubuntu gcc/g++),让makefile的编写不在烦人

ubuntu linux下建立stm32开发环境: GCC安装以及工程Makefile建立 买了一个STM32开发板,却不想在window下开发,也不想用那么占内存的IAR MDK等软件,所以决定在ubuntu下建立该开发环境,像之前avr linux一样,找了下资料,国内有人做过,但都没有很详尽的教程,所以花了三四天才完成.其实原理很简单,就是安装适用与STM32的GCC,以及建立该工程,主要是Makefile加上STM32的官方库. 阅读详情

自动万能makefile(linux ubuntu gcc/g++),让makefile的编写不在烦人

keyword: wildcard notdir patsubst findstring wordlist suffix foreach

 

功能:

     1、自动以makefile的父目录名为Target文件名称
     2、自动搜索源码文件(含子目录)
     3、自动搜索头文件文件(含子目录)
     4、自动搜索搜索库文件(含子目录)
     5、无需任何设置也可以编译可执行文件
     6、可以生成.a和.so文件
 

 注意:本文件不对您的代码编译结果担负任何法律和道德责任,使用时需谨慎

另一个项目管理级别的高度自动化的makefile链接地址:

https://blog.youkuaiyun.com/guestcode/article/details/81229127

 

本文demo下载地址:

https://download.youkuaiyun.com/download/guestcode/10451084

 

#########################################################
# 名称:自动万能makefile(linux ubuntu gcc/g++)
# 作者:码客(卢益贵)
# 微信qq:48092788
# 时间:2018-5-20
# 功能:
#     1、自动以makefile的父目录名为Target文件名称
#     2、自动搜索源码文件(含子目录)
#     3、自动搜索头文件文件(含子目录)
#     4、自动搜索搜索库文件(含子目录)
#     5、无需任何设置也可以编译可执行文件
#     6、可以生成.a和.so文件
#
# 注意:本文件不对您的代码编译结果担负任何法律和道德责任,使用时需谨慎
#
#########################################################


###############################################
# 工程定义项(常用项,不设置为使用缺省值)
###############################################
# 目录名后面不需要“/”,正确的:“src”,错误的:“src/”,下同
# 输出的目标文件名,不需路径信息
Target :=

# 源文件目录,缺省为src目录,如果没有src则为当前目录
SrcDir :=

# 头文件目录,缺省为lib目录,没有lib则等于SrcDir
IncDir :=

# 库文件(*.a/*.so)和其头文件的目录,缺省依次为lib\3rdparty目录,否则为当前目录
LibDir :=

# 目标文件Target的输出目录
OutDir :=

# 临时文件目录,缺省时,SrcDir、LibDir都不为当前目录时为obj,否则为当前目录
ObjDir :=

# 调试选项,任意值为调试设置
DEBUG :=

###############################################
# 编译定义项(常用项,不设置为使用缺省值)
###############################################
# c/c++编译器名称,缺省为自动搜索,有cpp文件则为g++,否则为gcc
# CC := gcc
CC :=
# 静态库文件编译器名称,缺省为ar
AR :=

# c编译标志,编译器时gcc时设置,缺省为:-Wall -O -g
GccFlags :=

# c++编译标志,编译器时g++时设置,缺省为:-std=c++11
GxxFlags :=

# 静态库编译标志,缺省为:-cr
ArFlags :=

# 链接标志,缺省为:-lpthread -lrt
LdFlags :=


###############################################
# 工程定义项缺省值,此后为非常用项,修改需谨慎
###############################################
# 如果Target没有定义输出的目标文件名,则默认为makefile的父目录名
ifeq ($(Target), )
Target := $(shell pwd)/$(lastword $(MAKEFILE_LIST))
Target := $(shell dirname $(Target))
Target := $(notdir $(Target))
endif

# 如果没有设置OutDir,默认为当前目录
ifeq ($(OutDir), )
OutDir := .
endif

# 如果没有设置SrcDir,默认为src,如果没有src目录则为当前目录
ifeq ($(SrcDir), )
SrcDir := $(shell if [ -d src ]; then echo ./src; else echo .; fi;)
endif


# 如果没有设置IncDir,默认为inc,如果没有inc目录等于SrcDir
ifeq ($(IncDir), )
IncDir := $(shell if [ -d inc ]; then echo ./inc; else echo $(SrcDir); fi;)
endif

# 如果没有设置LibDir,缺省依次为lib\3rdparty目录,否则为当前目录
ifeq ($(LibDir), )
LibDir := $(shell if [ -d lib ]; then echo ./lib; else echo ; fi;)
endif
ifeq ($(LibDir), )
LibDir := $(shell if [ -d 3rdparty ]; then echo ./3rdparty; else echo .; fi;)
endif

# 如果没有设置临时文件目录,默认为obj
ifeq ($(ObjDir), )
ObjDir := .
ifneq ($(SrcDir), .)
ifneq ($(LibDir), .)
ObjDir := ./obj
endif
endif
endif

###############################################
# 编译定义项缺省值
###############################################
# c/c++编译器名称,缺省值
# 自动搜索源码文件后缀,有cpp的则自动设置编译器是g++,反之是gcc
ifeq ($(CC), )
tmpVar := $(shell find ./ -type f -iname *.cpp)
ifeq ($(tmpVar), )
CC := gcc
else
CC := g++
endif
endif

# 静态库编译器缺省值
ifeq ($(AR), )
AR  := ar
endif

# c编译标志缺省值,编译器时gcc时设置
ifeq ($(GccFlags), )
GccFlags  := -Wall -O -g
endif

# c++编译标志缺省值,编译器时g++时设置
ifeq ($(GxxFlags), )
GxxFlags := -std=c++11
endif

# 编译标志缺省值,最终使用CFlags来配置编译选项
ifeq ($(CC), gcc)
CFlags := $(GccFlags)
else
CFlags := $(GxxFlags)
endif

# 静态库编译标志缺省值
ifeq ($(ArFlags), )
ArFlags := -cr
endif

# 链接标志缺省值
ifeq ($(ArFlags), )
LdFlags := -lpthread -lrt
endif

# 生成动态库时设置
ifeq ($(suffix $(Target)), .so)
CFlags += -fPIC
LdFlags += -shared
endif

ifneq ($(DEBUG), )
CFlags += -ggdb -rdynamic
else
CFlags += -O2 -s
endif


###############################################
# 自动搜索关联文件,从此处开始至结束,不建议修改
###############################################
# c/cpp文件源码文件搜索的目录,用于编译设置
VPATH := $(shell find $(SrcDir) -type d)

# 临时文件(*.o)列表,每个*.c/*.cpp对应一个*.o文件,用于链接设置
ifeq ($(CC), gcc)
ObjFiles := $(shell find $(LibDir) -type f -iname *.c) #如果库中有源码文件
ifneq ($(ObjFiles), )
VPATH += $(shell find $(LibDir) -type d)
endif
ObjFiles += $(shell find $(SrcDir) -type f -iname *.c)
else
ObjFiles := $(shell find $(LibDir) -type f -iname *.c -o -iname *.cpp) #如果库中有源码文件
ifneq ($(ObjFiles), )
VPATH += $(shell find $(LibDir) -type d)
endif
ObjFiles += $(shell find $(SrcDir) -type f -iname *.c -o -iname *.cpp)
endif
ObjFiles := $(notdir $(ObjFiles))            #去掉目录信息
ObjFiles := $(ObjFiles:%.c=$(ObjDir)/%.o)    #每个*.c对应一个*.o文件,并设置输出到临时目录ObjDir
ObjFiles := $(ObjFiles:%.cpp=$(ObjDir)/%.o)  #每个*.cpp对应一个*.o文件,并设置输出到临时目录ObjDir

# *.a/*.so文件列表,用于链接设置
LibFiles := $(shell find $(LibDir) -type f -iname *.a -o -iname *.so)
LibFiles := $(notdir $(LibFiles))    #去掉目录信息
LibFiles := $(LibFiles:lib%.a=-l%)   #每个*.a库文件名前加-l参数标志,去掉后缀.a和前缀lib
LibFiles := $(LibFiles:lib%.so=-l%)  #每个*.so库文件名前加-l参数标志,去掉后缀.so和前缀lib

# 所有include包含的*.h文件所在的目录列表,用于编译设置
IncDirs := $(shell find $(IncDir) -type d) #*.c/*.cpp文件所在目录,默认每个*.c/*.cpp对应一个*.h文件

# *.a/*.so和它们的定义文件*.h所在的目录列表,用于链接设置
LibDirs := $(shell find $(LibDir) -type d)
IncDirs += $(LibDirs)
LibDirs := $(LibDirs:%=-L%) #每个目录名前加-I参数标志

IncDirs := $(IncDirs:%=-I%) #每个目录名前加-I参数标志

###############################################
# 链接成最终文件
###############################################
all:$(Target)
$(Target): $(ObjFiles)
	@echo "\nlinking file: "$(Target)
ifneq ($(OutDir), .)
	$(shell if [ ! -d $(OutDir) ]; then mkdir $(OutDir); fi;)
endif
ifeq ($(suffix $(Target)), .a)
	$(AR) $(ArFlags) -o $(OutDir)/$(Target) $^
else
	$(CC) $(CFlags) $^ $(LibDirs) $(LibFiles) -o $(OutDir)/$(Target) $(LdFlags)
endif

###############################################
# 编译成obj文件
###############################################
# 编译c源码文件,生成.o文件
$(ObjDir)/%.o:%.c
ifneq ($(ObjDir), .)
	$(shell if [ ! -d $(ObjDir) ]; then mkdir $(ObjDir); fi;)
endif
	@echo "\ncompiling file: "$<
	$(CC) $(CFlags) -c $< -o $@ $(IncDirs)

$(ObjDir)/%.o:%.cpp
ifneq ($(ObjDir), .)
	$(shell if [ ! -d $(ObjDir) ]; then mkdir $(ObjDir); fi;)
endif
	@echo "\ncompiling file: "$<
	$(CC) $(CFlags) -c $< -o $@ $(IncDirs)

###############################################
# 清理临时文件
###############################################
clean:
ifeq ($(ObjDir), .)
	@rm -f *.o
else
	$(shell if [ -d $(ObjDir) ]; then rm -r $(ObjDir);fi;)
endif
ifeq ($(OutDir), .)
	@rm -f $(Target)
else
	$(shell if [ -d $(OutDir) ]; then rm -r $(OutDir);fi;)
endif
	@echo "cleaned"

.PHONY: all clean

 

 

 

在Ubuntu系统下使用gcc命令和makefile方式编译c程序 本文旨在win10系统上安装虚拟机Ubuntu系统,vim和gcc等环境后进行编译测试gcc和makefile编译方式熟悉linux编译方式 (一)在Ubuntu系统下用c语言编写一个简单的输出hellworld程序,并编译运行 1.在桌面建立一个自己文件夹,然后右键在终端打开 2.新建hello.c文件,输入命令vimhello.c 3.enter后输入i进入insert模式,开始编写代码 4.编写完成后enter回到normal模式,输入:wq(不... 阅读详情

相关推荐

游戏服务端配置“热更”终极方案(golang/ygluu/卢益贵)

游戏服务端配置“热更”终极方案(golang/ygluu/卢益贵) 众所周知,游戏服务端配置信息热更有几大问题: 1、因配置对象的指针被场景对象引用而导致热更复杂度提高 2、信息量大的配置表热更导致游戏卡顿、玩家闪断 3、一般重载后的配置信息仅影响重载后新创建的对应场景对象,不能影响已存在的场景对象 4、在高度解耦的模块化开发模式下导致热更复杂度提高 本示例代码将使用通用方法来演示在“高度解耦、模块化、模板化”的开发模式下对上述问题的解决方案。

Linux编译gcc/g++、自动化构建工具make/makefile

Linux中关于gcc/g++的基本操作,以及makefile的基本操作。

wjmhlh的博客 1249

鸿蒙读书笔记1:《鸿蒙操作系统设计原理与架构》

GUI、 语 音 控 制 方 式 的 VUI(Voice User Interface, 语 音 用 户 界。电话、多媒体、DFX、MSDP(Multimodal Sensor Data Platform,多。面)、手势/姿态控制的CVUI(Computer Vision User Interface,计算。KAL(Kernel Abstract Layer,内核抽象层)通过屏蔽多内核差异,JavaScript、C、C++等多语言的用户程序开发框架,以及UI框架、

jackyrongvip的专栏 2446

linux静态库,动态库编译

$ar cr libtest.a test1.o test2.o $ls libtest.a  test1.c  test1.o  test2.c  test2.o cr标志告诉ar将object文件封装(archive),我们可以使用nm -s 命令来查看.a文件的内容

iamhycljc的专栏 1514

保姆级教程:用Python+OpenCV实现相移法与格雷码三维重建(从生成条纹到点云生成)

本文详细介绍了使用Python和OpenCV实现相移法与格雷码三维重建的全流程,从条纹生成到点云计算。通过结构光技术,结合相移法和格雷码,实现高精度的三维重建,适用于无纹理物体表面的密集对应点生成。教程包含环境搭建、条纹生成、相位计算、三维点云重建及常见问题排查,适合计算机视觉开发者和研究人员。

weixin_33443333的博客 349

奥比中光Dabai深度相机SDK在Ubuntu22.04的兼容性安装指南

本文详细指导如何在Ubuntu22.04系统上安装奥比中光Dabai深度相机的SDK。针对新旧版本不兼容的核心问题,重点推荐使用经过验证的v1.10.18版本SDK,并提供了从系统依赖检查、SDK下载安装、Python环境配置到编译测试的完整步骤,帮助用户成功解决安装难题并实现相机驱动。

j2k3l4的博客 999

Makefile自动搜所目录及子目录下的的所有文件、自动生成编译目录

makefile进行项目管理,进行多目录文件编译、编译过程中自动生成编译目录、自动搜所当前目录下的所有源文件、生成静态库、合并静态库、静态库中函数的交叉调用等。根据一个比较特殊的需求而编写的一个工程模板,内容比较杂单没有进行系统性的解释说明。

青椒*^_^*凤爪爪的博客 1万+

施密特触发电路详细原理介绍

我们想获得矩形脉冲,有种方法是可以采用整形的方法获得矩形脉冲,但前提是可以找到频率和幅度都符合要求的电压信号。 我们设定矩形脉冲的几个指标。 施密特电路是脉冲波形变换中一种常采用的电路,主要有以下两个特点: 1.输入电平从低电平上升过程中电路状态转换为对应的输入电平,与高电平下降过程中对应的输入转换电平不同。 2.通过电路内部的正反馈使输出电压波形的边沿变得很陡。 施密特电路的结构和工作原理 我们先从模电的角度来分析此电路的工作原理。 此电路是通过公共发射极电阻耦合的两级正反馈放大器。 v1输入为低电平

fcxgfdjy的博客 1万+

Linux下C++的通用Makefile与解析

http://graybull.is-programmer.com/posts/37758.html 本文给出万能Makefile的具体实现,以及对其中的关键点进行解析。 号称万能Makefile,一统江湖。我对原版的Makefile做了些修改。首先揭开它的庐山真面目: #################################################### #

Hello World! 935

SMR实战指南:从GWAS数据到eQTL分析的完整流程

本文提供了基于汇总数据的孟德尔随机化(SMR)实战指南,详细解析了如何从GWAS汇总数据出发,整合eQTL数据,完成从数据准备、BESD格式转换到最终SMR与HEIDI分析的完整流程。文章重点阐述了核心操作步骤、常见避坑技巧与结果解读,旨在帮助遗传学研究者高效掌握这一分析基因表达与复杂性状潜在因果关系的强大工具。

weixin_29246195的博客 1063

学习stm32H7之路开始(STM32H7系列1) 前期准备,HAL库框架

2020.01.07 几个重要的参考网址 1.电子工程世界网 http://tags.eeworld.com.cn/tags/STM32H7 链接: link. 2.转:https://blog.youkuaiyun.com/simon223/article/list/2?t=1 链接: link. ———————————————— 版权声明:本文为优快云博主「Simon223」的原创文章,遵循 CC 4....

kengkengkeng963的博客 3408

项目管理级别的自动万能通用makefile模板:t-makefile (freetoo)

  项目管理级别的自动万能通用makefile模板:t-makefile (freetoo)   t-makefile源码及示例项目下载链接(会不定期更新): https://github.com/freetoo/t-makefile   一、t-makefile解决的痛点和难点 往往在一个项目工程中,目录名改变了、子目录变更位置了都需要去修改makefile,目录繁多的时候修改ma...

码客 卢益贵 ygluu 1697

【AI大模型应用开发】【LlamaIndex教程】2. 存储模块:如何在 LlamaIndex 中使用自定义的向量数据库?(附代码)

前面文章两行代码就实现了文档的切分和向量化存储以及持久化存储。如果我们想用自定义的向量化数据库呢?

同学小张的博客 2116

【Ubuntu】gcc与Makefile操作

gcc —— Linux环境下编译C程序的工具,Makefile可以快速编译C程序

一以贯之的努力 不得懈怠的人生 3万+

【YOLOv11改进 - 特征融合】DySample :超轻量级且高效的动态上采样器

【YOLOv11改进 - 特征融合】DySample :超轻量级且高效的动态上采样器

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 1070

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【Linux系统】Linux工具使用指南:从apt管理、gcc编译到makefile构建与gdb调试

Linux 是当今计算机领域最重要的操作系统之一,其强大的命令行工具和丰富的生态系统为开发者提供了极大的灵活性和效率。然而,对于新手和部分用户而言,如何使用这些工具高效管理软件、编译代码、自动化构建和调试程序仍然是一项挑战。这篇文章旨在为读者提供一站式的 Linux 工具指南,从软件包管理 (apt) 到编译器 (gcc/g++)、自动化构建工具 (make),再到调试器 (gdb),我们将以清晰、系统化的方式为您逐步解析这些工具的功能和使用方法。

17的博客 8046

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Linux Ubuntu操作系统下运行C语言Makefile文件编写.

Linux下C程序的编写 练习使用gcc 编译器编译C 程序并执行,编写Makefile文件,使用make 工具编译程序并执行 具体要求: (1)编写简单的C 程序,功能为在屏幕上输出“Hello gcc!”。利用该程序练习使用gcc 编译器的E、S、c、o、g 选项,观察不同阶段所生成的文件,即*.c、.i、.s、*.o 文件和可执行文件。 (2)编写一个由头文件greeting.h、自定义函数文件greeting.c、主函数文件myapp.c 构成的C 程序,并根据这三个文件的依赖关系编写Makefil

yiokio的博客 1万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

linux初试gcc makefile菜鸟教程

linux初试gcc makefile菜鸟教程 1.实验环境 1.ubuntu16(安装教程) 2.gcc (gcc安装:apt install gcc) 3.make (make安装 apt install make) 用C举个小例子 2.源码 main.c /************************************************************************* > File Name: main.c > Author: wuh

qq_43938052的博客 1万+

Linux 开发工具(vim、gcc/g++、make/Makefile)+【小程序:进度条】-- 详解

是的没错,还是从上往下读,执行第一对依赖关系,但是因为第一对依赖关系中的依赖文件proc.o并不存在于当前目录,那么此时make会在当前文件中找目标文件为proc.o的依赖关系,发现依赖文件proc.s也并不存在,以此类推,最后推导发现依赖文件procc存在,就执行对应的依赖方法,在从下往上。在 C 程序中,并没有定义 printf 的函数实现,且在预编译中包含的 stdio.h 中也只有该函数的声明,而没有定义函数的实现,那么是在哪里实现 printf 函数的呢?让清理工作总是被执行!

杀意感知的博客 2476

Ubuntu系统使用gcc和Makefile编译C程序

本实验围绕C语言程序在Ubuntu与Windows系统的开发、编译与运行展开,完成了三个核心任务:一是在Ubuntu中实现“Hello World”单文件程序的创建、编译与运行;二是编写 main1.c (主程序)与 sub1.c (子程序)多文件代码,分别在Ubuntu(gcc命令行)和Windows(VS)中完成跨系统编译与验证;三是在Ubuntu中通过编写Makefile简化多文件程序的编译流程,并最终按规范撰写Markdown实验报告。

2303_80679756的博客 1546

在Ubantu系统下使用gcc和Makefile编译c程序

在下载Ubuntu环境配置过程中,国内源确实大幅提高了软件下载速度,解决了 Ubuntu 默认源在国内访问慢的问题,在进行代码编写和编译运行过程中,多文件编译时一定需要确保函数声明正确,否则会出现链接错误,Windows 和 Linux 下的编译流程相似,但他们的可执行文件格式不同(.exe vs 无扩展名),也意识到Makefile在多文件项目的优势,只需要重新编译修改过的文件就可以,提高代码书写和修改效率。

2501_93443053的博客 1252

在Ubuntu中使用gcc和Makefile编译C语言

摘要: 本文介绍了在Ubuntu系统中使用gcc和Makefile进行C语言程序开发的完整流程。内容涵盖从编写简单的"hello world"程序、gcc多阶段编译原理(预处理/编译/汇编/链接)、多文件项目编译方法,到通过Makefile实现自动化构建。与Windows平台的Visual Studio进行对比,分析了两者在开发体验、调试工具和适用场景上的差异。最后通过实例演示了Makefile的编写规则和增量编译优势,强调Linux环境下gcc+Makefile组合对理解底层机制和提升

Suqinpiaopiao的博客 682

Ubuntu系统使用gcc和Makefile编译C语言程序

本文介绍了Ubuntu系统下的嵌入式开发基础操作:1)安装Ubuntu 22.04系统并参考优快云教程;2)编写运行Hello World程序,包括创建文件、编译执行过程;3)实现多文件编程,通过main1.c调用sub1.c中的算术函数;4)使用Makefile自动化编译,详细解释了Makefile语法规则,并演示了编译、运行及清理操作。整个过程涵盖了从系统安装到多文件项目管理的嵌入式开发基础环节。(149字)

2503_93444456的博客 1779

在ubuntu中使用gcc和Makefile编译c语言程序

Ubuntu 系统:有一定计算机基础,对命令行操作不陌生,或者未来打算从事 Linux 服务器端开发、云计算等方向的新手,可以在掌握了一定的 C 语言基础语法后,尝试在 Ubuntu 系统下学习使用 GCC 等工具进行编译,提前适应 Linux 开发环境。Windows 系统:如果是完全没有编程基础,对计算机操作也不太熟悉的新手,建议先从 Windows 系统下的 IDE 入手,如 Dev - C++,它轻量级且容易使用,可以帮助新手快速建立编程的基本概念,体验编写、运行程序的乐趣。

2401_83858903的博客 1680

初次使用Ubuntu编写C程序(gcc、makefile)

初次使用Ubuntu编写C程序(gcc、makefile) ** 目录 ** 实验目的 实验题目 实验内容 在ubuntu系统用gcc 命令行方式编译主程序main1.c 并运行 在windows系统下用DEV-C++编译主程序main1.c 并运行 在ubuntu系统下用Makefile方式编程主程序main1.c并运行 实验总结 一、实验目的 在windows环境下通过虚拟机软件(比如Vmware、VirtualBox)安装Ubuntu 16.04/18.04 Desktop,并设置网络参数保证系统能上

m0_48861452的博客 670
上一篇: 共享windows文件夹给VMware的ubuntu server虚拟机
下一篇: t-makefile:自动万能通用makefile模板(freetoo 码客 卢益贵)
ygluu
博客等级 码龄17年 300粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值