Make工程管理器的概念: 工程管理器指管理较多的文件,它是自动管理器能根据文件时间自动发现更新过的文件而减少编译的工作量,同时通过读入Makefile文件来执行大量的编译工作。 |
Makefile格式: target: dependency_files //目标项:依赖项
<TAB> command //必须以tab开头,command编译命令
注意:在写command命令行的时候,必须要在前面按TAB键
|
|
例如,有Makefile文件,内容如下:
|
make程序首先读到第1行的目标文件main.exe和它的两个依赖文件main.o和func.o;然后比较文件main.exe和main.o/func.o的产生时间,如果main.exe比main.o/func.o旧的话,则执行第2条命令,以产生目标文件main.exe。在执行第2行的命令前,它首先会查看makefile中的其他定义,看有没有以第1行main.o和func.o为目标文件的依赖文件,如果有的话,继续按照(1)、(2)的方式匹配下去。根据(2)的匹配过程,make程序发现第3行有目标文件main.o依赖于main.cpp,则比较目标文件main.o与它的依赖文件main.cpp的文件新旧,如果main.o比main.cpp旧,则执行第4行的命令以产生目标文件main.o.在执行第4条命令时,main.cpp在文件makefile不再有依赖文件的定义,make程序不再继续往下匹配,而是执行第4条命令,产生目标文件main.o目标文件func.o按照上面的同样方式判断产生.执行(3)、(4)产生完main.o和func.o以后,则第2行的命令可以顺利地执行了,最终产生了第1行的目标文件main.exe。
|
|
特殊处理与伪目标: .PHONY 是Makefile文件的关键字,表示它后面列表中的目标均为伪目标。
.PHONY:clean
clean:
rm [filename] //通常用@echo “hello”
伪目标通常用在清理文件、强制重新编译等情况下。
|
.PHONY:rebuild clean //表示后面的是伪目标,通常用在清理文件、强制重新编译等情况下
rebuild:
make clean main.exe //先执行清理,在执行main.exe
clean:
rm –rf main.o func.o main.exe //最后删除.o和.exe的文件
|
|
执行下面的命令:
#make //直接make,即从默认文件名(Makefile)的第一行开始执行
#make clean //表示执行clean: 开始的命令段
#make func.o //表示执行func.o: 开始的命令段
#make rebuild //则先执行清除,再重新编译连接
|
如果不用系统默认的文件名Makefile,而是用户随便起的一个名字;
如:
#vim Makefile1
则 make 后面必须要加上 -f Makefile11 ,如:
#make –f Makefile1 clean //表示执行clean: 开始的命令段
#make –f Makefile1 main.exe //表示执行main.exe: 开始的命令段
|
|
//main.c #include<stdio.h>
int main(int argc,int **argv)
{
int sum;
int i=atoi(argv[1]);
int j=atoi(argv[2]);
sum=add(i,j);
printf("sum=%d\n",sum);
return 1;
}
|
//Makefile main:main.c
gcc main.c -w -o main -ladd
.PHONY: rebuiilmclean
rebuild:
make clean main
clean:
rm -rf main
|
|
|
Makefile 文件名一定是这个(公司招聘会有要求)
:后面跟的是依赖项,下一行就是匹配到第一行后所要执行的代码; (换行到第二行gcc要先tab键,在进行输入gcc命令,保存退出后,make进行编译),每次修改过.c文件只需make编译一下
.PHONY 是Makefile文件的关键字,表示它后面列表中的目标均为伪目标
clean为目标,所以后面不用跟任何项
变量:用来代替一个文本字符串
定义变量的2种方法:
变量名=变量值 递规变量展开(几个变量共享一个值) //不常用
变量名:=变量值 简单变量展开(类似于C++的赋值) //通常采用
(前面的叫变量)
变量分为:用户自定义变量,预定义变量(CFLAGS),自动变量,环境变量境变量
自动变量:指在使用的时候,自动用特定的值替换(@)
$@ 当前规则的目标文件(重点)
$< 当前规则的第一个依赖文件
$^ 当前规则的所有依赖文件,以空格分隔(重点)
$? 规则中日期新于目标文件的所有相关文件列表,逗号分隔
$(@D) 目标文件的目录名部分
$(@F) 目标文件的文件名部分
Examp:用自动变量:
CFLAGS:= -Wall -O2 –fPIC
规则分为:普通规则,隐含规则,模式规则
隐含规则:*.o文件自动依赖*.c或*.cc文件,所以可以省略main.o:main.cpp等
(CFLAGS:=-g)隐士规则默认编译会加上-g命令,就可以省去$(CFLAGS)
模式规则:通过匹配模式找字符串, %匹配1或多个任意字符串
%.o: %.cpp任何目标文件的依赖文件是与目标文件同名的并且扩展名为.cpp的文件
%.o: %.cpp //模式通配
gcc -o $@
-c $^
函数:
1. wildcard搜索当前目录下的文件名,展开成一列所有符合由其参数描述的文件名,文件间以空格间隔。SOURCES := $(wildcard *.cpp)把当前目录下所有'.cpp'文件存入变量 SOURCES 里
SOURCES:=$(wildcard *.c) 等价于main.c fun.c
2. 字符串替换函数:$(patsubst 要查找的子串 , 替换后的目标子串,源字符串)。将源字符串(以空格分隔)中的所有要查找的子串替换成目标子串。
如OBJS: = $(patsubst %.cpp, %.o, $(SOURCES)) 把SOURCES中'.cpp' 替换为'.o' 。