Linux中的make和makefile

Linux | make和Makefile命令详细篇 阅读详情

1.1      多源文件问题

我们平常编写一些小的程序一般都是修改源代码后,重新编译所有的源文件,但是对于大型的项目,这种方法就会有许多的问题。edit−compile−test周期耗费的时间比较长,所以当只修改一个文件时,要避免编译所有的源文件。

     假设有头文件a.h, b.h , c.h和C的源文件main.c, 2.c , 3.c。它们的关系如下:

/* main.c */

#include "a.h"

...

/* 2.c */

#include "a.h"

#include "b.h"

...

/* 3.c */

#include "b.h"

#include "c.h"

 

如果c.h修改了,源文件main.c和2.c应该不需要重新编译,因为它们不依赖c.h头文件。而源文件3.c依赖头文件c.h需要重新编译。如果b.h修改了,我们忘记重新编译2.c也会导致程序功能异常。 而make工具可以解决上面这两个问题。

1.2      make命令和makefiles

   make命令有一些内置的默认功能,但是光有这个它自己还是不知道怎么build程序。我们必须提供一个文件告诉make应用程序的构造,这个文件就是makefile.

Make和makefile提供了强大的功能来管理项目的编译以及发布install到指定文件夹。

1.2.1 makefiles语法

一个makefile文件包括一系列的依赖(dependency))关系和规则(rules)。一个依赖有一个目标文件和一系列目标文件依赖的源文件。规则描述了怎么用依赖文件创建目标文件。通常,一个目标文件是单个可执行文件。Make命令通过读取makefile来决定哪些源文件和目标文件需要重新编译,根据比较它们的日期和时间来决定使用来个规则来构建targets。

 

1.2.2 make的选项与参数

下面为make 命令经常用到的三个选项:

   -k:告诉make当发生错误时继续执行,而不是停在第一个错误的位置。

   -n:告诉make打印出它将要完成什么,实际上没做。

   −f <filename>,告诉make用哪个makefile,如果不使用这个选项,make将搜索当前目录下第一个名为makefile的文件,如果还不存在,搜索一个文件名为Makefile。

 

 依赖:指明了每个文件怎么样关联源文件。

在makefile文件中,写依赖的方法为:目标文件名,冒号,空格或tabs,然后接着是用空格或 tab分开的文件列表,用于创建目标文件。

 依赖的例子:

myapp: main.o 2.o 3.o

main.o: main.c a.h

2.o: 2.c a.h b.h

3.o: 3.c b.h c.h

解释:myapp依赖 main.o, 2.o 和 3.o, main.o依赖 main.c 和 a.h,以此类推。

从上面可以很清楚的看到,当b.h改变了,我们需要修改2.o和3.o,当2.o和3.o改变了,需要重新编译myapp.

 当需要编译多个文件,可以使用目标文件名all.假设应用程序包含一个二进制文件myapp和一个用户指导页面myapp.1,可以使用下面的方式指定。

all:  myapp  myapp.1

规则:是makefile的第二部分内容。告诉我们将如何创建目标文件。

当make命令决定2.o需要重新编译,使用什么命令进行编译呢?也许最简单的方式是使用gcc –c 2.c(make命令也有许多默认的规则),但是如果需要包含头文件的目录以及为调试设置符号信息怎么办呢?可以在makefile当中使用显示的规则。

 

 重要:所有的规则都必须要以制表符(tab)开头的行,空格不行。由于多个空格和tab看起来的效果很相同,但在Unix编程当中,tabs和spaces还是有区别的,会导致一些问题。在makefile文件末尾加入空格行会导致make命令不能执行,因为缺少tab。

例子:一个简单的 makefile,命名为Makefile1

myapp: main.o 2.o 3.o

gcc −o myapp main.o 2.o 3.o  //该行必须要有一个tab开头

main.o: main.c a.h

gcc −c main.c

2.o: 2.c a.h b.h

gcc −c 2.c

3.o: 3.c b.h c.h

gcc −c 3.c


 

使用$ make −f Makefile1

这是由于make命令分析到目标文件为myapp,然后查看依赖文件main.o,需要main.c来创建,但是开始没有创建该文件。

 使用下面的命令创建三个空头文件:

$touch a.h

$touch b.h

$touch c.h

 

/* main.c */

#include "a.h"

extern void function_two();

extern void function_three();

int main()

{

function_two();

function_three();

exit (EXIT_SUCCESS);

}

/* 2.c */

#include "a.h"

#include "b.h"

void function_two() {

}

/* 3.c */

#include "b.h"

#include "c.h"

void function_three() {

}


$ make −f Makefile1

Make按顺序显示出了它执行的命令

现在修改b.h头文件:

$ touch b.h

$ make −f Makefile1

Make只显示了创建依赖于b.h的目标 文件的命令

删除2.o

$ rm 2.o

$ make −f Makefile1

由上面可以看到make 可以正确的决定执行gcc命令的顺序。

在makefile中使用#进行注释。

1.2.3 makefiles宏

对于文件比较多的项目,可以在makefile中定义宏。

定义:MACRONAME=value

获取值:$(MACRONAME) or ${MACRONAME}.

宏经常在makefile中用来为编译器指定编译选项。对于发布版本和调试版本程序需要的信息不同,对于release 版本不需要加入调试信息。对于Makefile1,默认使用的是gcc编译器,在其他的Unix操作系统,可能使用cc或cc89,如果想让makefile在不同的操作系统上运行,需要修改makefile文件中的多行。可以使用宏来解决这问题。

Makefile2:

all: myapp

 

# 指定编译器

CC = gcc

 

# 头文件目录

INCLUDE = .

 

# 开发编译选项

CFLAGS = -g -Wall -ansi

 

# 发布版本编译选项

# CFLAGS = -O -Wall -ansi

 

 

myapp: main.o 2.o 3.o

         $(CC) -o myapp main.o 2.o 3.o

 

main.o: main.c a.h

         $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c

 

2.o: 2.c a.h b.h

         $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c

 

3.o: 3.c b.h c.h

         $(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c


 

执行下面命令:

$ rm *.o myapp

$ make −f Makefile2

 

实际上,make有许多特殊的内部宏,可以让makefile更简洁。下面列出一些经常用到的内部宏。

 

$?

List of prerequisites changed more recently than the current target.

$@

Name of the current target.

$<

Name of the current prerequisite.

$*

Name of the current prerequisite, without any suffix.

 

Makefile中另外两个非常重要的特殊字符:

“-“让make忽略任何错误。

“@”让make在命令执行前不要向标准输出打印命令。

1.2.4 多目标文件

  可以使用”clean”选项来清除不想要的目标文件,用”install”选项来将应用程序移动到不同的目录中。Makefile3

all: myapp

 

# Which compiler

CC = gcc

 

# Where to install

INSTDIR = /usr/local/bin

 

# Where are include files kept

INCLUDE = .

 

# Options for development

CFLAGS = -g -Wall -ansi

 

# Options for release

# CFLAGS = -O -Wall -ansi

 

 

myapp: main.o 2.o 3.o

       $(CC) -o myapp main.o 2.o 3.o

 

main.o: main.c a.h

       $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c

 

2.o: 2.c a.h b.h

       $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c

 

3.o: 3.c b.h c.h

       $(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c

 

 

clean:

       -rm main.o 2.o 3.o

 

install: myapp

       @if [ -d $(INSTDIR) ]; \

       then \

              cp myapp $(INSTDIR);\

              chmod a+x $(INSTDIR)/myapp;\

              chmod og-w $(INSTDIR)/myapp;\

              echo "Installed in $(INSTDIR)";\

       else \

              echo "Sorry, $(INSTDIR) does not exist";\

       fi


 

install依赖于myapp.,make需要先生成myapp。

If前面的“@”是让make不要输出这些命令。

$ make −f Makefile3 install

gcc −o myapp main.o 2.o 3.o

Installed in /usr/local/bin

$ make −f Makefile3 clean

rm main.o 2.o 3.o

1.2.5 内置规则

Makefile能准确判断每个命令的执行步骤,make中包括许多内置的规则,当有许多源文件时,可以简化makefiles。创建一个foo.c文件:

#include <stdlib.h>

#include <stdio.h>

int main()

{

printf("Hello World\n");

exit (EXIT_SUCCESS);

}


 

使用make进行编译,不指定makefile.

$ make foo

Make命令知道怎么调用编译器,尽管使用的是默认的编译器cc.

可以使用 make –p来打印内置的规则。

我们可以用自定义的值来改变内置宏,从而改变它的默认行为。

$ rm foo

$ make CC = gcc CFLAGS = "−Wall −g" foo

 

1.2.6 后缀规则

 有时源文件需要在不同的编译器上进行编译:如在MS-DOS或者是Linux的GCC下。在MS-DOS下的源文件后缀名大多为.cpp而不是C,而Linux下的make命令没有内置的规则来编译.cpp文件(有.cc的编译规则)。

我们需要让make产生一个新规则来生成 .cpp的目标文件,这时需要添加一个后缀规则。Makefile5:

all: myapp

 

.SUFFIXES:      .cpp

 

.cpp.o:

         $(CC) -xc++ $(CFLAGS) -I$(INCLUDE) -c $<

 

# Which compiler

CC = gcc

 

# Where to install

INSTDIR = /usr/local/bin

 

# Where are include files kept

INCLUDE = .

 

# Options for development

CFLAGS = -g -Wall -ansi

 

# Options for release

# CFLAGS = -O -Wall -ansi

 

 

myapp: main.o 2.o 3.o

         $(CC) -o myapp main.o 2.o 3.o

 

main.o: main.c a.h

         $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c

 

2.o: 2.c a.h b.h

         $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c

 

3.o: 3.c b.h c.h

         $(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c

 

clean:

         -rm main.o 2.o 3.o

 

install: myapp

         @if [ -d $(INSTDIR) ]; \

                   then \

                   cp myapp $(INSTDIR);\

                   chmod a+x $(INSTDIR)/myapp;\

                   chmod og-w $(INSTDIR)/myapp;\

                   echo "Installed in $(INSTDIR)";\

         else \

                   echo "Sorry, $(INSTDIR) does not exist";\

         fi


 

执行:

$ cp foo.c bar.cpp

$ make −f Makefile5 bar

gcc −xc++ −g −Wall −ansi −I. −c bar.cpp

 

−xc++:告诉gcc是一个C++源文件

1.2.7 make管理库文件lib

  当开发一个大的项目,利用一个库(library)来管理多个编译版本产品非常方便。库文件的后缀名为(.a),它包含许多的目标文件。

Make命令中内置的规则来管理库:

.c.a:

$(CC) −c $(CFLAGS) $<

$(AR) $(ARFLAGS) $@ $*.o

宏 $(AR) 和 $(ARFLAGS) 指的是命令 ar 和命令选项 rv。含义为:从一个 .c 文件到一个.a的库文件需要应用两条规则。第一条规则:必须编译源文件为目标文件;第二条规则:使用ar命令来添加该新的目标文件来生成库文件。如果目前有一个库文件fud包含目标文件bas.o,在第一条规则中,$<为bas.c。在第二条规则中,$@为fud.a,$*为bas.

 

下面让目标文件2.o 和3.o包含在库文件 mylib.a,如下Makefile6:

all: myapp

 

# Which compiler

CC = gcc

 

# Where to install

INSTDIR = /usr/local/bin

 

# Where are include files kept

INCLUDE = .

 

# Options for development

CFLAGS = -g -Wall -ansi

 

# Options for release

# CFLAGS = -O -Wall -ansi

 

# Local Libraries

MYLIB = mylib.a

 

myapp: main.o $(MYLIB)

         $(CC) -o myapp main.o $(MYLIB)

 

 

$(MYLIB): $(MYLIB)(2.o) $(MYLIB)(3.o)

main.o: main.c a.h

2.o: 2.c a.h b.h

3.o: 3.c b.h c.h

 

clean:

         -rm main.o 2.o 3.o $(MYLIB)

 

install: myapp

         @if [ -d $(INSTDIR) ]; \

         then \

                   cp myapp $(INSTDIR);\

                   chmod a+x $(INSTDIR)/myapp;\

                   chmod og-w $(INSTDIR)/myapp;\

                   echo "Installed in $(INSTDIR)";\

         else \

                   echo "Sorry, $(INSTDIR) does not exist";\

         fi


 

$ rm −f myapp *.o mylib.a

$ make −f Makefile6

gcc −g −Wall −ansi −c main.c −o main.o

gcc −g −Wall −ansi −c 2.c −o 2.o

ar rv mylib.a 2.o

ar: creating mylib.a

c − 2.o

gcc −g −Wall −ansi −c 3.c −o 3.o

ar rv mylib.a 3.o

c − 3.o

gcc −o myapp main.o mylib.a

 

1.2.8 GCC的两个选项-JN  –MM

-jN可以同时执行N条命令

-MM:gcc会输出目标文件所依赖的源文件。

 

$ gcc −MM main.c 2.c 3.c

main.o: main.c a.h

2.o: 2.c a.h b.h

3.o: 3.c b.h c.h

Make命令知道怎么调用编译器,尽管使用的是默认的编译器cc.

我们可以用自定义的值来改变内置宏,从而改变它的默认行为。

$ rm foo

$ make CC = gcc CFLAGS = "−Wall −g" foo

 

 

【Linux操作系统】自动化编译make和Makefile `make`是一个构建C++项目的**工具/命令**;`makefile`是一个包含编译命令的脚本**文件**。通过make工具解释makefile文件中的命令,进行我们的项目编译。 阅读详情

相关推荐

linux下make和makefile用法

linux下make 和makefile 关系区分与使用

【Linux】make和makefile详解

make和makefile详解

m0_61438674的博客 3308

三轴云台稳定控制算法优化实战:从PID到模糊自适应

本文深入探讨了三轴云台稳定控制算法的优化实践,从经典PID控制到模糊自适应算法的进阶应用。通过实战案例和代码示例,详细解析了PID调参技巧、模糊控制实现及多传感器数据融合方法,帮助工程师在复杂环境下提升云台抗干扰能力和响应速度,特别适用于无人机航拍等场景。

green的博客 908

Linux-make/Makefile

3、如果mytest文件不存在,或是mytest所依赖的后面的mytest.o文件的文件修改时间要比mytest这个文件新,那么,他就会执行后面所定义的命令来生成mytest这个文件。5、当然,你的C文件和H文件是存在的啦,于是make会生成 mytest.o 文件,然后再用mytest.o 文件声明make的终极任务,也就是执行文件mytest了。7、在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。

qq_54178958的博客 1124

电力电子技术文章:ACOT控制模式在Buck变换器中的频率稳定性分析

本文深入分析了ACOT控制模式在Buck变换器中实现频率稳定性的原理与优势。通过对比传统COT模式,阐述了ACOT如何通过自适应调整导通时间,将开关频率锁定在设定值,从而有效应对输入电压与负载变化。文章还探讨了其在轻载DCM模式下的高效与平滑切换特性,并提供了关键的设计考量与实战指南。

cc789的博客 1149

lvds接口_LVDS,接口,时序讲解,非常好的文章

欢迎FPGA工程师加入官方微信技术群点击蓝字关注我们FPGA之家-中国最好最大的FPGA纯工程师社群1.1.1 LVDS接口分类1.1.1.1 单路6bit LVDS这种接口电路中,采用单路方式传输,每个基色信号采用6位数据,共18位RGB数据,因此,也称18位或18bit LVDS接口。此,也称18位或18bit LVDS接口。1.1.1.2 双路6bit LVDS这种接口电...

weixin_39639286的博客 1902

<Linux> Linux项目自动化构建工具—make&makefile的使用

今天我们来学习Linux环境基础开发工具的最后一个Linux项目自动化构建工具make&makefile的使用

m0_64224788的博客 1020

机器人C++开源库The Robotics Library (RL)使用手册(三)

进入VS工程,我们先看看这些功能函数及其依赖库的分布关系:rl命名空间下,主要有八大模块。搞定VS后将逐个拆解。

qq_34839823的博客 1736

【Linux】自动化构建工具make和Makefile

Make和Makefile的使用

Lin5200000的博客 3802

gmsv源代码c语言,石器时代ABLua的原理、简介、过程、运用、收发

操作原理(一)服务端:服务器源文件客户端:客户所操作的程序(既是游戏客户端)接口:既是某项功能(例如:鼠标点击,文字发送,战斗,观战,人物动作等)返回的值ABlua:在源代码中添加的整套引擎作为回调接口--lua所实现的功能是基于服务端源码添加的接口由该接口与客户端发送封包实现功能源码里是否有ABlua回调接口?例如:源码里的gmsv/battle.c文件(既是战斗回调文件)以下为简单描述C给予l...

weixin_35223575的博客 2408

Cisco思科 电子科技大学计算机网络 SRWE 期末技能考试 (PTSA)

电子科技大学2024春_SRWE_计算机网络系统 SRWE 期末技能考试 (PTSA)

2301_76745065的博客 5094

Linux·make&makefile(详解)

从一只猫说起hello kitty linux系统中的make命令与makefile文件 make与makefile 在linux系统中make是一个非常重要的编译命令,不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或makeinstall。利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,一个工程中的源文件不计数,其按类型、功能、模块分别放在...

weixin_45596239的博客 612

稳定双共轭梯度法BiCGSTAB流程

稳定双共轭梯度法BiCGSTAB流程

abner361的博客 1154

初识——【Linux】make和makefile

make和makefile是linux系统里用于自动化编译和构建程序的工具。们通过定义一系列的规则来指定如何编译和链接程序,从而简化了编译过程,尤其是有多个源文件的时候。

xsc2004zyj的博客 1099

2026从0到1!C#工控机开发实战指南:新手一周就能跑通的完整项目

这篇文章摘要如下: 工业自动化领域工控机开发入门指南,针对零基础开发者提供从环境搭建到项目实战的全流程指导。文章首先解答工控机开发的3个核心问题,比较工控机与普通PC的区别,推荐使用C#作为开发语言。随后详细讲解开发环境配置、四大核心技术栈(通信协议、数据库、UI框架、多线程),并重点演示Modbus TCP通信的实现。最后通过一个完整的温度监控系统项目实战,展示如何用WPF构建实时数据采集界面,包括Modbus通信类编写、数据采集服务实现等关键代码片段。全文采用图解+代码的方式,帮助开发者快速掌握工控系统

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 702

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

走进Linux世界:make和makefile

自动化构建工具make,makefile​嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。准备好和我一起冲进代码的奇幻宇宙了吗?Let’s go!自动化构建工具make,makefile。

yuanManGan的博客 1412

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

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

【Linux】make和Makefile

本文主要讲述了make和Makefile的基本规则和使用及其功能。

weixin_60371270的博客 348

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

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

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Linux下make和makefile

system:centos 我们知道在vs中开发一个项目可以建立很多的文件包括各种头文件和.c 文件,编译的时候程序会自动编译链接。然而在linux下开发程序,当项目较大,文件又多时,我们需要将这些文件组织起来进行编译链接,这就需要用到make工具和makefile文件了; make: make是linux中的一个常用命令,在当前目录下,输入make,系统会自动在当前目录中寻找名为Makef

三哥的博客 2541

【Linux】Make和Makefile快速入门

不知道大家还记得我们写的进度条,里面就有们的makefile,在哪里面我们没有讲解,拿到这里我们深度解剖,也可以再次回顾我们的进度条,那我们话不多说,进入我们今天的主题----【Linux】Make和Makefile快速入门🤗🤗。⭐浅谈Make和Makefile什么是makelinux中make是一个构建工具,用于自动化编译和构建软件项目。它的作用是允许开发人员管理和维护复杂的软件项目,自动化编译过程并生成可执行文件。软件项目通常由多个源代码文件和依赖项组成。

AAlykk的博客 1348

【Linux我做主】make和makefile自动化构建

带你初识make和makefile自动化构建的奥妙!!!

有梦想的电信狗 1672

Linux下make和makefile作用和实现

1.什么是make和makefile? make: make是linux中的一个常用命令,在当前目录下,输入make,系统会自动在当前目录中寻找名为Makefile或makefile的文件,并对之进行解释处理,根据makefile文件内容,针对目标(可执行文件)进行依赖性检测(要生成该可执行文件之前要有哪些中间文件)并执行相关动作(编译等)。 Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件

weixin_59179454的博客 2772

Linux 系统中make和makefile以及CMake如何使用

Linux 系统中make和makefile如何使用make命令Makefile文件目标target前置条件prerequisites命令commandsCMakeCMakelist.txt编写样例 make命令 在linux系统中,make时一个用来编译的命令,项目开发和软件安装过程中我们经常会用到make或makeinstall。利用make工具我们就可以将大型开发项目分解成许多更易于管理的模块。 make的工作原理 当make命令被执行时,它会扫描当前目录下Makefile或者makefile文件找

cccchensir的博客 1109

【Linux基础七】Linux开发工具—下(make和makefile)

当我们编译代码时,会输入 当我们删除可执行程序时,会输入 2.make和makefile的使用 创建makefile文件,vim开始编辑,如下是比较标准且基础的格式(test.c编译为mybin 和 清理mybin两个过程) 底行模式下wq退出后,makefile已经创建结束,准备一个任意代码的test.c文件放在同一目录下 使用指令: 成功得到mybin程序后,清理掉mybin,使用指令: 将编译指令和清理指令交换位置 执行make,再执行make mybin,可以看到结果 是否是伪目标有什么区

2201_75570391的博客 933

Linux下的make和makefile

Linux下的make和makefile

weixin_45836700的博客 959

Linux/Unix环境下的make和makefile详解

        无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令。不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install。利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系。而且如此多的源文件,

1759
上一篇: C++编程规范和标准总结
下一篇: 有关动态创建释放二维数组,以及指向数组的指针问题集合 .
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值