在工程中,一个工程有多个源文件,按类型、功能、模块分别放在不同的目录中,makefile定义了一系列的规则来指定,文件编译的一系列操作;
make是一条命令,makefile是一个文件,两者搭配使用,完成项目的自动化构建;
[目标文件]:[依赖文件1] [依赖文件2] ...
...
例:
test.i:test.c
gcc -E test.c -o test.i
将test.c 编译成test.i文件
完整示例:
main:main.o add.o sub.o
gcc main.o add.o sub.o -o main //链接main.o add.o sub.o生成可执行文件main
main.o:main.c add.h sub.h
gcc -c main.c add.h sub.h -o main.o //编译生成main.o
add.o:add.c
gcc add.c -o add.o //编译生成add.o
sub.o:sub.c
gcc -c sub.c -o sub.o //编译生成sub.o
.PHONY:clean //声明clean为伪目标
clean:
rm -f main.o add.o sub.o main add.h.gch sub.h.gch //使用make clean指令删除中间文件
例:
obj=main.o add.o sub.o
main:$(obj)
gcc $(obj) -o main
自动化变量:
在makefile中,存在系统默认的自动化变量
$@ :代表目标文件
$< :代表第一个依赖文件
$^ :代表所有依赖文件
例:
main:main.o add.o sub.o
gcc main.o add.o sub.o -o main
//可以写成
main:main.o add.o sub.o
gcc $^ -o $@
若一号写不下,可用换行符"/"
make看到一个[.o]文件,它就自动把同名的[.c]文件加在依赖关系中,例如maek找到一个main.o,那么main.c就是mian.o的依赖文件。并且gcc -c main.c -o main.o也会被推导出来,于是利用make的自动推导可以简化makefile的书写;
例:
main:main.o add.o sub.o
gcc main.o add.o sub.o -o main
main.o:main.c add.h sub.h
gcc -c main.c add.h sub.h -o main.o
add.o:add.c
gcc add.c -o add.o
sub.o:sub.c
gcc -c sub.c -o sub.o
.PHONY:clean
clean:
rm -f main.o add.o sub.o main add.h.gch sub.h.gch
可以写成:
main:main.o add.o sub.o
gcc $^ -o $@
main.o:add.h sub.h
.PHONY:clean
rm -f main.o add.o sub.o add.h.gch sub.h.gch
例:
编写一个名为test的工程
(1)创建一个名为test的文件夹并进入;
:mkdir test
:cd test
(2)用vim编写各个程序文件
main.c
#include
#include"add.h"
#include"sub.h"
int main()
{
int a = 10;
int b = 6;
printf("%d + %d = %d\n",a,b,add(a,b));//实现加法
printf("%d - %d = %d\n",a,b,sub(a,b));//实现减法
return 0;
}
add.c
#include
int add(int x, int y)
{
return x + y;
}
add.h
#ifndef __ADD_H__
#define __ADD_H__
int add(int x, int y);
#endif
sub.c
#include
int sub(int x, int y)
{
return x - y;
}
sub.h
#ifndef __SUB_H__
#define __SUB_H__
int sub(int x, int y);
#endif
(3)编写maekfile文件
makefile/Makefile
main:main.o add.o sub.o
gcc main.o add.o sub.o -o main
main.o:main.c add.h sub.h
gcc -c main.c add.h sub.h -o main.o
add.o:add.c
gcc add.c -o add.o
sub.o:sub.c
gcc -c sub.c -o sub.o
.PHONY:clean
clean:
rm -f main.o add.o sub.o main add.h.gch sub.h.gch
(4)编译工程
:make
(5)执行
:./main
(6)清除中间文件
:make clean