Makefile学习

MakeFile中给变量赋值:

A = $(B)

B = debug

此时A的值是debug

如果使用:

A := $(B)

B = debug

此时A的值为空,即使用 ":=" 来对变量赋值,则只能使用已经定义好的变量,如果变量前面没有定义,则使用空值来代替.

同时使用 "?="  来对变量赋值会先判断这个变量有没有在前面被定义过,如果没有定义,则给这个变量赋值,否则使用已经定义的值

"+="为当前变量追加内容

 

MakeFile中使用文件搜索路径:

vpath %.c $(APP_PATH)

上命令表示在APP_PATH变量所指路径下搜索所有的.c文件

 

MakeFile中的字符串替换函数原型:$(subst <from>,<to>,<text>)

例:$(subst , / , \ , $(APP_PATH) )

 

MakeFile中的 ".PHONY"符号使用

.PHONY:all

all:.....

.PHONY用于显示的指明一个目标为伪目标,目的说明不管是否有这个文件,这个目标都是伪目标.

 

MakeFile中的 "@echo"

.PHONY:complete

complete:

        @echo ------------------------------------------------

        echo ------------------------------------------------

输出为:

       -----------------------------------------------------

       echo ------------------------------------------------------

即在命令前加@符号不会输出命令信息

 

MakeFile中的$@表示当前依赖关系的目标文件集

@echo $@可以将其输出

 

MakeFile中的$(@F:.o=.c)

将$(@F)中的.o替换成.c,$(@F)表示$@中的文件名部分

 

MakeFile中的.SUFFIXES用于通知make新的扩展名

.SUFFIXES:清空所有的文件拓展名识别

.SUFFIXES:.o .c .s .mix .dep 声明五个文件拓展名

 

MakeFile中$*表示目标模式中"%"及其之前的部分.如果目标是"dir/a.foo.b",并且目标的模式是"a.%.b",那么"$*"的值就是"dir/a.foo".

如果目标中没有模式的定义,那么"$*"也就不能被推导出,但是,如果目标文件的后缀是make所识别的,那么"$*"就是除了后缀的那一部分.

例如目标是"foo.c",因为".c"是make所能识别的后缀名,所以,"$*"的值就是"foo".

                    $<表示依赖目标的第一个目标名字,如果依赖目标是以模式(即"%")定义的,那么"$<"表示依赖目标文件集

 

MakeFile中条件判断语句

ifneq , ifeq , ifdef , ifndef , else endif

ifeq的意思表示条件语句的开始,并指定一个条件表达式,表达式包含两个参数,以逗号分隔,表达式以圆括号括起。

else表示条件表达式为假的情况。endif表示一个条件语句的结束,任何一个条件表达式都应该以endif结束。

其中ifeq判断条件相等,ifneq判断条件不相等

        ifdef/ifndef判断变量是/否被定义

 

MakeFile中的$(filter <pattern>,<text>):从text中过滤出pattern所指的字符串

                        $(filter-out <pattern>,<text>);从text中过滤掉pattern后的字符串

例:$(filter all , $(MAKECMDGOALS) ):从变量MAKECMDGOALS中过滤出all字符串

 

MakeFile中的小短线"-",放在命令前面忽略命令错误

 

MakeFile中的$^:所有的依赖目标的集合.以空格分隔.如果在依赖目标中有多个重复的,那么会去除重复的依赖目标,只保留一份.

 

MakeFile中的$%:仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是"foo.a(bar.o)",那么,"$%"就是"bar.o" , "$@"就是"foo.a"

如果目标不是函数库文件,则其值为空.

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
############################################################################# # Makefile for building: sample 2011-09-26 # # Project: # Template: # Command: # ------基本上简单用法的makefile------- #1. 第一个目标为最终目标 #2. 命令以 Tab开头,可以有多个命令 #3. 分行号\ 后面不可以跟空格 #4、加@可以去掉命令显示 #5. 变量为 abc = efd 访问为 $(abc) echo $abc # # # #缺点,单文件夹 #每次都会重新生成 # #foo.o : foo.c defs.h # foo模块 #cc -c -g foo.c # #多目录 一种方法,在主目录里面include "",然后其里面OBJS += .o,这样其实就是 或用foreach ############################################################################# #target EXECUTABLE := test CC := gcc CXX := g++ STRIP := strip AR := ar cqs LINK := g++ RM := rm -f CFLAGS := -g -Wall CXXFLAGS := $(CFLAGS) CXXFLAGS += -MD LIBS := -lm LIBPATH := -L/usr/local/lib INCPATH := ####### Output directory OBJSPATH := ../Obj/ EXECUTABLEPATH := ../Execute/ #######source Files SOURCE := $(wildcard *.c) $(wildcard *.cpp) OBJS := $(patsubst %.c, %.o, $(patsubst %.cpp, %.o, $(SOURCE))) DEPS := $(patsubst %.o,%.d,$(OBJS)) #######rule .SUFFIXES: .cpp .c .o .so .a .d $(OBJSPATH)%.o:%.c $(CC) $(CFLAGS) -c $< -o $@ $(OBJSPATH)%.o:%.cpp $(CXX) $(CXXFLAGS) -c $< -o $@ $(OBJSPATH)%.d:%.cpp $(CXX) -MM $ $@ ######main .PHONY : all deps objs clean rebuild all: $(EXECUTABLE) $(CXX) $(CXXFLAGS) $(INCLUDEPATH) $(LIBS) $(LIBPATH) $(addprefix $(OBJSPATH),$(OBJS)) \ -o $(EXECUTABLEPATH)$(EXECUTABLE) deps: $(addprefix $(OBJSPATH),$(DEPS)) objs: $(addprefix $(OBJSPATH),$(OBJS)) clean: @$(RM) $(OBJSPATH)*.o @$(RM) $(OBJSPATH)*.d @$(RM) $(EXECUTABLEPATH)$(EXECUTABLE) rebuild: clean all -include $(addprefix $(OBJSPATH),$(DEPS)) ##.d里面是详细的.o rule 自己会括展开的,然后没有文件就自己去重建 $(EXECUTABLE) : objs

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值