标签:
目的:
GNU make来构建和管理自己的软件工程。
GNU的make能够使整个软件工程的编译、链接只需要一个命令就可完成。
说明:
make在执行时,需要一个名为Makefile的文件。Makefile文件描述了整个
工程的编译、链接等规则。
包括:哪些源文件需要编译及如何编译;需要创建哪些库文件及怎样创建、
如何得到最后我们想要的可执行文件。
Makefile术语:
规则:用于说明如何生成一个或多个目标文件,规则如下:
targets : prerequisites
command
目标 依赖 命令
main.o : main.c
gcc -c main.c
******命令需要以【TAB】键开始*******
目标:
在Makefile中,只应该有一个最终目标,其它的目标都是被这个目标所连带
出来的,Makefile中第一条规则中的目标将被确立为最终的目标。
文件名:
make命令默认在当前目录下寻找名为makefile或Makefile的工程文件,
当名字不是这两个之一时,用:make -f 文件名。
伪目标:
Makefile中把那些没有任何依赖只有执行动作的目标成为“伪目标”。
(phony targets)。
.PHONY : clean
clean :
rm -f hello main.o
“.PHONY”将“clean”目标声明为伪目标。
变量:
一般依赖写法:
obj=main.o func1.o func2.o func3.o
hello : $(obj)
gcc $(obj) -o hello
在makefile中,存在系统默认的自动化变量:
*** $^ 代表所有的依赖文件
*** $@ 代表目标
*** $< 代表第一个依赖文件
如:
hello : main.o func1.o func2.o
gcc main.o func1.o func2.o -o hello
写为:
hello : main.o func1.o func2.o
gcc $^ -o $@
其它:
makefile中“#”后的内容为注释;
示例:
有两个.c文件和一个.h文件:
fun.c文件如下:
#include "fun.h"
int max_fun(int x, int y)
{
if(x >= y)
return x;
else
return y;
}
main.c文件如下:
#include "fun.h"
int main(void)
{
int a, b;
printf("Please enter the number a and b\n");
scanf("%d%d", &a, &b);
int max = 0;
max = max_fun(a, b);
printf("The max number is %d\n", max);
return 0;
}
fun.h文件如下:
#include <stdio.h>
extern int max_fun(int x, int y);
第一版makefile,即简单直观,但当文件很多时,修改困难:
main : main.o fun.o
gcc main.o fun.o -o main
main.o : main.c fun.h
gcc -c main.c -o main.o
fun.o : fun.c fun.h
gcc -c fun.c -o fun.o
clean:
rm -f main *.o
第二版makefile,使用变量替换:
OBJS=main.o fun.o
CC=gcc
CFLAGS=-c
main : $(OBJS)
$(CC) $(OBJS) -o main
main.o : main.c fun.h
$(CC) $(CFLAGS) main.c -o main.o
fun.o : fun.c fun.h
$(CC) $(CFLAGS) fun.c -o fun.o
clean:
rm -f main *.o
第三版makefile,使用自动变量替换:
OBJS=main.o fun.o
CC=gcc
CFLAGS=-c
main : $(OBJS)
$(CC) $^ -o $@
main.o : main.c fun.h
$(CC) $(CFLAGS) $< -o $@
fun.o : fun.c fun.h
$(CC) $(CFLAGS) $< -o $@
clean:
rm -f main *.o
第四版makefile,使用隐式规则写法:
OBJS=main.o fun.o
CC=gcc
CFLAGS=-c
main : $(OBJS)
$(CC) $^ -o $@
clean:
rm -f main *.o
第五版makefile,使用模式规则写法:
OBJS=main.o fun.o
CC=gcc
CFLAGS=-c
main : $(OBJS)
$(CC) $^ -o $@
%.o : %.c
$(CC) $(CFLAGS) $< -o $@
clean:
rm -f main *.o
标签:
原文地址:http://www.cnblogs.com/paladinzxl/p/4828991.html