makefile

一、如何使用make命令

1、make

根据缺省文件Makefile或makefile执行make命令,生成makefile中第一个定义的目标。

2、make target

根据缺省文件Makefile或makefile执行make命令,生成makefile中目标名为target的目标。

3、make target1 target2 ...

根据缺省文件Makefile或makefile执行make命令,生成makefile中目标名为target1、target2 ...的目标。(要注意次序)

4、make -f Rule.make

根据文件Rule.make执行make命令,生成Rule.make中第一个定义的目标。

二、makefile语法

1、include,-include(sinclude)

include:包含头文件,如果头文件不存在将会有错误提示。

-include(sinclude:GNU支持sinclude代替-include):包含头文件,如果头文件不存在则不会错误提示。

2、.PHONY

.PHONY : clean

申明 clean是伪目标.

主要防止如果当前目录中,正好有一个文件叫做clean,以至于执行make clean不能得到想要的动作。

3、#

注释符号

4、echo

显示

5、@

不显示当前命令行,makefile执行时如果命令前不加@,则会显示这条命令。

6、通配符

(1)、* :rm -f *.o

(2)、?

(3)、~

(4)、[...]

7、%

%.o:%.c

表示的有一系列的规则,规则的个数等于当前目录下.c文件的个数,而每个规则的

目标都是以一个.c文件的文件名去掉c加上o构成,前提条件为该.c文件名

8、$@

规则中目标的名字

9、$<

规则中第一个前提条件的名字

10、$^

规则中所有的前提条件的名字

11、变量及赋值

(1)= 变量的值在执行时赋

VARIABLE = value

(2):= 变量的值在定义时赋

VARIABLE := value

(3)?= 只有在该变量为空时才赋值

VARIABLE ?= value

(4) += 将值追加到变量的尾端

VARIABLE += value

12、export

声明变量外部可使用

13、字符串替换函数

(1)patsubst

格式:$(patsubst<pattern>,<replacement>,<text>)

名称:模式字符串替换函数——patsubst。

功能:查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式<pattern>,如果匹配的话,

      则以<replacement>替换。这里,<pattern>可以包括通配符“%”,表示任意长度的字串。如果<replacement>中

      也包含“%”,那么,<replacement>中的这个“%”将是<pattern>中的那个“%”所代表的字串。

      (可以用“\”来转义,以“\%”来表示真实含义的“%”字符)

返回:函数返回被替换过后的字符串。

例子:

$(patsubst %.c,%.o, test.c bar.c)

把字串”test.c bar.c”符合模式[%.c]的单词替换成[%.o],返回结果是”test.o bar.o”

(2)tsubst

格式:$(subst <from>,<to>,<text>)

名称:字符串替换函数——subst。

功能:把字串<text>中的<from>字符串替换成<to>。

返回:函数返回被替换过后的字符串。

例子:

$(subst hello, hi, hello world !!!)

把字串“helloworld !!!”中的”hello”替换成”hi”,返回结果是”hi world !!!”

(14)、条件

ifeq(arg1,arg2)/ifneq(arg1, arg2)

else

endif

三、makefile规则

1、基本规则

target : prerequisites

[tab] recipe

target :   目标,通常是输出文件名(可以是多个),也可以是某个特定操作的名字(伪目标)。

prerequisites :前提条件,通常是文件名,是用于创建目标的输入文件,可以理解为依赖关系,也就是说这里列出的文件没有发生变化时要执行相应的动作, 不然要去找被改变的文件对应的依赖关系,然后再执行相应的动作。

recipe :动作,可以没有,可以是多条命令,前面必须加tab,另外每一行对应一个动作(一条shell命令)。

例子:

  test : test1.o test2.o

 [tab] gcc -o test test1.o test2.o

  test1.o: test1.c test.h

  [tab] gcc -c test1.c

  test2.o: test2.c

  [tab] gcc -c test2.c

  clean:

  [tab] rm -f test test1.o test2.o

2、静态模式规则

targets …: target-pattern: prereq-patterns …

[tab] recipe

[tab] …

targets :目标

target-pattern:目标的模式

prereq-patterns:前提条件的模式

recipe :命令

例子

objects = test1.o test2.o

all: $(objects)

$(objects): %.o: %.c

[tab] $(CC) -c$(CFLAGS) $< -o $@

3、隐含规则

例子:没有recipe

test.o: test.c

 

编译按照隐含规则来

C语言编译规则:

test.o:test.c

         $(CC)$(CPPFLAGS) $(CFLAGS) -c $< -o $@

C++编译规则:

test.o:test.cc

test.o:test.cpp

         $(CXX)$(CPPFLAGS) $(CXXFLAGS) -c $< -o $@

当然还有很多其他语言的隐含规则,这里就不细展开了,总之看到一个规则没有相应的动作也没有看到依赖关系,就要注意隐含规则了,另外,隐含规则是和make相关的,不同版本的make是有差异的。

4、进入子目录里make

subsystem:

[tab] cd subdir&& make

或者

subsystem:

[tab] make -C subdir

例子:

SUBDIRS = $(BASEDIR)/$(SUBPDIR1) $(BASEDIR)/$(SUBPDIR2)

all: $(SUBDIRS)

[tab] @for i in$(SUBDIRS); do make -C $$i || exit; done

要注意上面必须是一行, 使用;分开多个命令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值