xingzifei

makefile的格式是这样的:

目标:依赖关系
[TAB]system command

因此,最简单的makefle是这样的:

all[可以是其他名称]:
[TAB]g++ a.cpp -o a.exe

 

注1:

$@指这个规则里所有目标的集合

注2:

$^指这个规则里所有依赖的集合。

注3:

使用函数wildcard得到指定目录下所有的C语言源程序文件名的方法,不用手工一个一个指定需要编译的.c文件了,方法如下:

sources:=$(wildcard *.c) 

如果还有子目录,比如子目录为inc,则再增加一个wildcard函数,象这样:

SRC = $(wildcard *.c) $(wildcard inc/*.c)

也可以指定汇编源程序: 
ASRC = $(wildcard *.S)

 

注4:

makefile里的替换引用规则,它的标准格式是

$(var:a=b) 或 ${var:a=b}
它的含义是把变量var中的每一个值结尾,用b替换掉a

比如: dependence=$(sources:.c=.d) #这里,dependence是所有.d文件的列表.即把串sources串里的.c换成.d。  

 

注5:

1、wildcard : 扩展通配符
2、notdir : 去除路径
3、patsubst :替换通配符

例子:
建立一个测试目录,在测试目录下建立一个名为sub的子目录
$ mkdir test
$ cd test
$ mkdir sub

在test下,建立a.c和b.c2个文件,在sub目录下,建立sa.c和sb.c2 个文件

建立一个简单的Makefile
src=$(wildcard *.c ./sub/*.c)
dir=$(notdir $(src))
obj=$(patsubst %.c,%.o,$(dir) )

all:
 @echo $(src)
 @echo $(dir)
 @echo $(obj)
 @echo "end"
 
执行结果分析:
第一行输出:
a.c b.c ./sub/sa.c ./sub/sb.c                   因为wildcard把 指定目录 ./ 和 ./sub/ 下的所有后缀是c的文件全部展开。

第二行输出:

a.c b.c sa.c sb.c             因为notdir把展开的文件去除掉路径信息

第三行输出:
a.o b.o sa.o sb.o             因为在$(patsubst %.c,%.o,$(dir) )中,patsubst把$(dir)中的变量符合后缀是.c的全部替换成.o,

 

 一个例子如下:

 

#------------------------------------------------------------------------------------------------------------
#-----------------------------first part---------------------------------------------------------------------
#------------------------------------------------------------------------------------------------------------
#一个实用的makefile,能自动编译当前目录下所有.c/.cpp源文件,支持二者混合编译  
#并且当某个.c/.cpp、.h或依赖的源文件被修改后,仅重编涉及到的源文件,未涉及的不编译  
#详解文档:http://blog.csdn.net/huyansoft/article/details/8924624  
#author:胡彦 2013-5-21  
  
#----------------------------------------------------------  
#编译工具用g++,以同时支持C和C++程序,以及二者的混合编译  
CC=g++  
  
#使用$(winldcard *.c)来获取工作目录下的所有.c文件的列表  
#sources:=main.cpp command.c  
  
#变量sources得到当前目录下待编译的.c/.cpp文件的列表,两次调用winldcard、结果连在一起即可  
sources:=$(wildcard *.c) $(wildcard *.cpp)  
  
#变量objects得到待生成的.o文件的列表,把sources中每个文件的扩展名换成.o即可。
#这里两次调用patsubst函数,第1次把sources中所有.cpp换成.o,第2次把第1次结果里所有.c换成.o objects:
=$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(sources))) #变量dependence得到待生成的.d文件的列表,把objects中每个扩展名.o换成.d即可。也可写成$(patsubst %.o,%.d,$(objects)) dependence:=$(objects:.o=.d)
#
-------------------------------------------------------------------------------------------------------------
#-----------------------------second part---------------------------------------------------------------------
#-------------------------------------------------------------------------------------------------------------

#当$(objects)列表里所有文件都生成后,便可调用这里的 $(CC) $
^ -o $@ 命令生成最终目标all了 #把all定义成第1个规则,使得可以把make all命令简写成make all: $(objects) $(CC) $(CPPFLAGS) $^ -o $@ @./$@ #编译后立即执行
#这段使用make的模式规则,指示如何由.c文件生成.o,即对每个.c文件,调用gcc
-c XX.c -o XX.o命令生成对应的.o文件 #如果不写这段也可以,因为make的隐含规则可以起到同样的效果 %.o: %.c $(CC) $(CPPFLAGS) -c $< -o $@
#同上,指示如何由.cpp生成.o,可省略
%.o: %.cpp $(CC) $(CPPFLAGS) -c $< -o $@
#
---------------------------------------------------------- include $(dependence) #注意该句要放在终极目标all的规则之后,否则.d文件里的规则会被误当作终极规则了 #因为这4行命令要多次凋用,定义成命令包以简化书写 define gen_dep set -e; rm -f $@; \ $(CC) -MM $(CPPFLAGS) $< > $@.[Math Processing Error]; \ sed \'s,[Math Processing Error]\.o[ :]*,\1.o $@ : ,g\' < $@.[Math Processing Error] > $@; \ rm -f $@.[Math Processing Error] endef
#指示如何由.c生成其依赖规则文件.d #使用make的模式规则,指示对每个.c文件,如何生成其依赖规则文件.d,调用上面的命令包即可
%.d: %.c $(gen_dep) #同上,指示对每个.cpp,如何生成其依赖规则文件.d %.d: %
.cpp $(gen_dep)

#
---------------------------------------------------------- #----------------------------------------------------------
#清除所有临时文件(所有.o和.d)。之所以把clean定义成伪目标,是因为这个目标并不对应实际的文件 .PHONY: clean clean: #.$$已在每次使用后立即删除。
-f参数表示被删文件不存在时不报错 rm -f all $(objects) $(dependence) echo: #调试时显示一些变量的值 @echo sources=$(sources) @echo objects=$(objects) @echo dependence=$(dependence) @echo CPPFLAGS=$(CPPFLAGS) #提醒:当混合编译.c/.cpp时,为了能够在C++程序里调用C函数,必须把每一个要调用的C函数
#其声明都包括在extern "C"{}块里面,这样C++链接时才能成功链接它们。

 

 

紫色部分不理解!!!!

 

理解makefile几个关键点:

1-多目标 【明白】
2-隐含规则  【明白】
3-定义模式规则  【明白】
4-自动生成依赖性 【这个就是紫色部分,没有弄明白】

 

http://blog.csdn.net/huyansoft/article/details/8924624

回头可以看看这个博客

 

分类:

技术点:

相关文章:

  • 2021-10-01
  • 2022-12-23
  • 2021-08-31
  • 2022-12-23
  • 2021-12-19
  • 2022-12-23
  • 2021-11-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-11-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-23
相关资源
相似解决方案