makefile 之多目录,多目标编译

嵌套执行make,多目标编译,多目标清理,多目标安装 假设work文件夹下有三个文件夹a,b,c.各自可以独立编译成一个目标,且a,b,c文件夹下已经存在makefile。在work下面写一个总的makefile来调用a,b,c各自的makefile TARGET=a b c LDIR=$(shell pwd) all:$(TARGET) $(TARGET): $(MAKE) -C $(LDIR)/$@ -f $(LDIR)/$@/makefile .PHONY:$(TARGET) all #需要设置成伪目标,因为a,b,c并不是执行文件,只是文 阅读详情

makefile 编译程序,经常会遇到需要编译不同的子模块,需要先编译好子模块,再编译自己的应用的情况。

子模块分布在不同的目录(可能直接就是不同的组成员写的),这时候需要顶层makefile进入子模块目录执行makefile编译。

  • 进入不同的目录,不需要使用 cd 进入对应目录,可以使用
$(MAKE)  -C  XX(目录)

会自动进入相关的目录执行寻找makefile,执行make,进行编译,编译完之后,退出到当前目录。

  • 要希望从顶层 makefile 传递变量到下层的makefile,可以使用
variable = value

export  variable

参考网址,http://www.gnu.org/savannah-checkouts/gnu/make/manual/html_node/Variables_002fRecursion.html#Variables_002fRecursion


举例说明,比如,现在有项目代码,顶层是自己的程序,包含下属两个子模块, eXosip2 目录,存放eXosip2库文件;sdp目录存放sdp分析文件。

顶层的makefile编译时,需要先编译出 eXosip2 与 sdp 静态库,再进行链接编译 自己的应用

目录视图如下,

|     makefile

|----eXosip2

| |__ makefile 

|----sdp

| |__ makefile


makefile 

CROSS_COMPILE=
CC = $(CROSS_COMPILE)gcc
CFLAG += -Wall -W -g -Os -o
STRIP = $(CROSS_COMPILE)strip

SRC := $(wildcard *.c)
OBJ := $(SRC:%.c=%.o)

all: eXosip SDP $(OBJ) 
    $(CC) -shared $(CFLAG) $(TARGET) $(OBJ) $(LIBS) $(INCLUDE)
   @$(STRIP) --strip-unneeded $(TARGET)
    $(MAKE) install

export CROSS_COMPILE
eXosip: 
    $(MAKE) -C SIP/eXosip

SDP: 
    $(MAKE) -C sdp

$(OBJ): %.o:%.c
    $(CC) -c $< $(CFLAG) $@ $(INCLUDE)

install:
    cp -rf include/ ../
    rm -rf ../lib
    mkdir ../lib
    cp $(TARGET) ../lib

clean:
    rm -rf $(OBJ)
    rm -rf SIP/eXosip/*.o 
    rm -rf sdp/*.o 
    rm -rf ../include 
    rm -rf ../lib 


简析,

    $(MAKE) -C SIP/eXosip
是进入 eXosip 目录,执行 eXosip 目录下的 makefile

    export CROSS_COMPILE
往底层makefile(eXosip、sdp目录的makefile),传递 CROSS_COMPILE 变量的值。

当然传递变量值的方法并不单有这种方式,还可以设置环境变量等。


Ubuntu16.04编译nexus6p内核及make多目标异常分析 尝试着编译Android内核,居然花了一天的时间用来调bug,是我太笨了还是Google太坑了呢。 正题 主要包括两部分 - 为Nexus6P编译内核 - make多目标匹配异常调试 环境 主机:ThinkPad T450, i5-5200U(弱爆了),内存12G,机械硬盘 主机OS:Ubuntu16.04 LTS 终端:Huawei Nexus6P 32G 国际版 源 阅读详情

相关推荐

深入GD32/STM32引脚复用:你的JTAG/SWD接口是怎么‘消失’的?一次讲清原理与预防

本文深入解析GD32/STM32调试接口(JTAG/SWD)突然失效的原理与预防措施。通过分析MCU启动流程、引脚复用机制及典型错误代码模式,揭示调试接口'消失'的根本原因,并提供硬件设计检查清单、软件防护代码及开发流程优化方案,帮助开发者有效避免烧录失败问题。

weixin_42532938的博客 369

[工具使用:Makefile] Makefile学习笔记

如果执行总控 Makefile 时,make 命令带有参数或者在上层的 Makefile 中定义了这个变量,那么 MAKEFLAGS 变量的值将会是 make 命令传递的参数,并且会传递到下层的 Makefile 中,这是一个系统级别的环境变量。它会继续载入其它的文件,一旦完成makefile的读取,make会再重试这些没有找到,或是不能读取的文件,如果还是不行,make才会出现一条致命信息。当使用 make 的选项 “-C” 的时候,命令就会进入指定的目录中,然后此变量就会被重新赋值。

stm32stu的博客 3275

VS2019+CAXACAD2023二次开发教程(一、环境搭建)

CAXACAD2023的二次开发相关文件和库都在的文件夹下。CAXACAD2023的默认开发环境是VS2019,如果是用VS2019的环境话,可以直接安装这个插件,安装好后就可以一键新建的项目,新建的项目会自动帮我们配置好所有的环境,并且生成必要的代码和初始的框架。(本来想用VS2022的,但配置环境太麻烦,用VS2022,增加一个环境变量是可以运行自带的例程的,但新建项目要配置的东西和环境太多,就放弃折腾了)

weixin_42968757的博客 4623

makefile--->总目录

makefile 初步认识\color{pink}{初步认识}初步认识

qq_42069216的博客 508

医药领域知识图谱快速及医药问答项目(项目全过程)

该项目是中科院软件所刘焕勇老师在github上的开源项目,基于知识图谱的医药领域问答项目 Github项目地址:mirrors / liuhuanyong / qasystemonmedicalkg · GitCode 一、项目环境搭建 该部分要十分注意,由于版本升级的问题,一些用法及格式已经不兼容了。 python3.8 下载地址:Python Release Python 3.8.10 | Python.orght...

qq_52062182的博客 9917

十一种室内定位传感器方案汇总介绍与对比(机器人、物联网领域)

室内定位传感器方案汇总 目录 室内定位传感器方案汇总 1、定位方案概述 1.1、内定位系统有最基本的5种算法: 1.2、常用的室内定位技术主要包括以下几种: 1.3、定位理论 1.4、不同的定位方案对比 2、各种定位方案详细介绍 2.1、单线激光定位 2.2、多线激光定位: 2.3、视觉定位: 2.4、基于射频识别(RFID)技术室内定位 2.4.1、RFID标签(不涉及...

JK-Cool的博客 3万+

Linux下,方便的makefile

如果在纯命令行的生产环境下进行编译,使用vim编写后在推出,再链接各个库文件极其繁琐,因此可以通过执行make命令,自动执行当前目录下的makefile文件内容来实现便捷操作。

Jacker优快云的博客 176

Codex 调试记录获取完全指南:日志查看、工具调用与实战排查教程

本文主要介绍了Codex 调试记录获取完全指南:日志查看、工具调用与实战排查教程,希望能对使用Codex的同学们有所帮助。 文章目录 1. 背景 2. 实战教程

weixin_43178406的博客 6万+

makefile 常规+进阶使用方法(附代码示例)

makefile格式,使用规则,最快的编写方法

m0_66766911的博客 1503

反爬虫:对抗最新反爬技术 Cloudflare详解

本文针对Cloudflare最新反爬机制提供完整解决方案,覆盖TLS指纹、行为轨迹、设备指纹等检测场景。文章首先分析Cloudflare的三重检测体系(TLS指纹、行为指纹、设备指纹)及其拦截表现,随后提出四种绕过方案:1)使用curl_cffi模拟浏览器TLS指纹;2)通过undetected-chromedriver移除自动化特征;3)Playwright结合stealth插件模拟人类行为;4)动态请求调度策略。重点推荐轻量级Python方案curl_cffi和浏览器自动化方案Playwright-st

数据知道的博客 4626

Windows Server 2016远程桌面服务配置和授权激活

Server 2016默认远程桌面连接数是2个用户,如果多余两个用户进行远程桌面连接时,系统就会提示超过连接数,可以通过添加远程桌面授权解决:1、添加远程桌面授权服务第一步:服务器管理 - 添加角色和功能打开添加角色和功能向导窗口,选择基于角色或给予功能安装:第二步:添加远程桌面会话主机和远程桌面授权功能:以上配置完成后即可使用多于2用户同时登陆,但使用期限为120天,再次登陆会有如下提示:2、添...

mahailiang的专栏 6万+

makefile

 (zz)概述——什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不

水过无痕 1612

车载以太网:PHY(物理层)介绍

本文以TJA1101芯片为实例介绍了车载以太网PHY(物理层)组成。

kevin1499的博客 6231

Makefile自动化编译实战项目指南

本文介绍了Makefile在项目自动化编译中的实用指南。主要内容包括:基本Makefile结构示例(定义变量、规则和目标),多目录项目的文件路径管理技巧,使用-MMD选项自动生成依赖关系,以及条件编译、多目标构建等高级功能实现。文章还提供了最佳实践建议,如使用.PHONY声明伪目标、添加帮助信息和静默模式等,帮助开发者创建高效、可维护的构建系统。通过合理组织Makefile,可以显著提升C语言等项目的编译管理效率。

qq_34665985的博客 394

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Makefile基础教程:从入门到工程实践

Makefile作为自动化构建工具的核心,通过定义目标、依赖和命令的关系实现高效编译。其核心原理是基于文件时间戳的依赖检查机制,通过变量系统和模式规则显著提升构建脚本的可维护性。在工程实践中,Makefile的自动化变量和内置函数可以简化复杂项目的构建流程,而条件判断和模块化组织则能实现跨平台支持和团队协作。对于C/C++项目开发,合理使用Makefile可以规范编译过程、实现增量构建,并通过并行编译大幅提升大型项目的构建效率。本文以gcc编译器为例,详解从基础语法到多目录管理的完整知识体系。

weixin_42584758的博客 340

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Makefile总结(多级目录、多目标)

一、多目标 .PHONY:clean all CC= gcc CFLAGS= -Wall -g LOCAL_PATH=$(shell pwd) BIN=test01 test02 all:$(BIN) #%.o:%.c .c.o: $(CC) $(CFLAGS) -c $< -o $@ test01:test01.o sub.o $(CC) $(CFLAGS) -o $@...

wh1312142954的博客 4867

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

从零开始写 Makefile

本文旨在介绍如何从零开始写Makfile,实现多文件、多目标、多级目录自动切换的代码编译。文中代码已全部测试通过,注释齐全。

Zhwers的博客 2518

makefile 多层多级目录 多main 如何制作自动化编译脚本【转】

多个Makefile文件编译,Makefile多目标编译和多层次编译 README Makefile多目标编译 Makefile多层次编译 a文件夹 b文件夹 include文件夹 obj文件夹 多个Makefile文件编译 相关截图 make文件夹 a_b文件夹 project2文件夹 README 文件夹以及文件说明。 根文件夹为make,实现多个Makefile文件编译。 Dir make----- /* 一级文件夹:多Ma.

loveboon1的专栏 662

多目录时Makefile 的编写方法

多级目录结构的Makefile

君莫笑的博客 2570

Makefile多目标规则:一次性构建多个文件的终极指南

Makefile多目标规则是提升项目构建效率的关键技术,尤其适合需要同时处理多个文件的场景。通过合理配置多目标规则,开发者可以显著减少重复代码,实现自动化批量处理文件,让复杂项目的构建过程变得简单高效。 ## 为什么需要多目标规则? 在日常开发中,我们经常需要对多个同类文件执行相同操作。例如: - 同时编译多个C文件为目标文件 - 批量处理图片或文档 - 一次性清理多种类型的临时文件 传统方

gitblog_00635的博客 343

从0到1:Makefile自动化编译实战之旅

本文详细介绍了Makefile在文本处理项目中的实战应用。首先阐述了Makefile的基础概念、优势及基本结构,包括变量定义、自动变量和模式规则的使用。然后通过一个文本处理项目实例,讲解了如何编写完整的Makefile,实现自动化编译、条件判断、伪目标等核心功能。文章还深入探讨了Makefile的高级技巧,如目录创建自动化、自动依赖生成、多目标构建和构建信息控制。最后总结了常见问题的解决方法,并展望了Makefile在复杂项目中的应用前景。本文为开发者提供了全面的Makefile实践指南,帮助提升项目构建效

大雨淅淅的博客 893

Makefile自动化编译实战项目

Makefile是Linux下自动化构建的核心工具,通过规则定义目标、依赖和命令实现编译流程管理。其核心价值在于增量编译(依赖时间戳机制)、多文件批量处理(模式规则)和跨平台支持。特殊符号和变量简化编写,伪目标管理非文件任务。大型项目通过动态文件列表(wildcard)组织,Android平台扩展NDK支持。实战中结合调试技巧提升效率。

QT性能优化QT原理源码QT界面美化 1047

makefile增量编译(生成依赖关系)

1Makefile基本用法 1.1常用符号 1.1.1编译器 CC // C语言编译器,默认值为gcc默认的变量,无需用户自定义,也可以改变其值 CXX // C++语言编译器,默认值为g++默认的变量,无需用户自定义,也可以改变其值 CFLAGS // C语言编译器的编译选项 LDFLAGS // C语言编译器的链接选项 CX...

yantao_wang的博客 6600

Makefile---将目录下所有的.c文件 编译成单独的可执行文件

将同一目录下的所有.c文件变成成单独的可执行文件

wcc15256945095的博客 3432

关键Makefile 解读

# include the system specific Makefile#0 shell uname 为变量#1 寻找 ../../目录下的 的相应文件,并释放到当前位置include ../../Makefile.$(shell uname)#依赖关系,default依赖于 alldefault: allall: cmm_setup.o cmm.oall: cmm_set

zhmili的专栏 916

Makefile 原理详解

C/C++Linux服务器开发/后台架构师知识体系资料整理 概述 make 是一个命令工具,它用来解释 Makefile 中的规则。Makefile 中可以使用系统 shell 所提供的任何命令。但注意有些像 set,setenv 等是不行的。 Makefile 最大的优点是简单,只需要一句话的解释就可以让一个之前不懂的人可以用起来并发挥作用。但只有掌握了它的内涵才能真正得心应手。 编译的知识 Makefile 开始其实是为了 C/C++的编译而诞生的,所以它里面的很多隐藏规则都是针对 C/C++的。在讲

C/C++Linux、音视频、DPDK 1397
上一篇: 国标GBT28181协议,注册功能服务端与客户端实现代码
下一篇: ONVIF 自定义soap结构体实现用户认证
Pray90
博客等级 码龄15年 34粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值