Makefile 入门与假目标

来源:互联网 发布:centos ubuntu 区别 编辑:程序博客网 时间:2024/05/16 05:57

在嵌入式的开发中,我们经常使用了Makefile文件来编译与管理软件,本文主要介绍Makefile的入门。

1. 简单的Makefile使用。

   假设我们有两个文件foo.c 和main.c ,分别如下:

 

/*************************************************************************> File Name: main.c> Created Time: 2013年09月17日 星期二 10时08分42秒 ************************************************************************/#include<stdio.h>#include "foo.h"int main(){foo();return 0;}


/*************************************************************************> File Name: foo.c> Created Time: 2013年09月17日 星期二 10时07分51秒 ************************************************************************/#include<stdio.h>void foo(){printf("This is foo()!\n");}


/*************************************************************************> File Name: foo.h> Created Time: 2013年09月17日 星期二 10时09分43秒 ************************************************************************/#include<stdio.h>void foo();



那么如何利用Makefile编译该文件呢,首先我们编写Makefile,详细如下:

all: main.o foo.ogcc -o all main.o foo.omain.o: main.cgcc -o main.o -c main.cfoo.o: foo.c foo.hgcc -o foo.o -c foo.cclean: rm all foo.o main.o


此时你只要在文件的同一目录下执行 make 就可以生存目标文件 all,make clean时会删除目标文件和中间文件。即 rm all foo.o main.o

2. 假如此时与Makefile同目录下有一个clean的文件或者是目录,如果你执行make clean ,此时你会发现每一次执行都会提示说 

 make: “clean”是最新的。

 是不是没有办法解决这个问题呢?

  答案是否定的。

在Makefile,你会发现它是多么的聪明,它提供了一个假目标的方式,让我们解决了上述的问题。

此时Makefile 文件修改如下:

.PHONY:cleanall: main.o foo.ogcc -o all main.o foo.omain.o: main.cgcc -o main.o -c main.cfoo.o: foo.c foo.hgcc -o foo.o -c foo.cclean: rm all foo.o main.o


此时你make clean 你会发现 make clean可以起作用了。


3. 适当的利用 “变量”提高可维护性。

.PHONY:cleanCC = gccRM = rmEXE = allOBJS = main.o foo.o$(EXE): $(OBJS)$(CC) -o $(EXE) $(OBJS)main.o: main.c$(CC) -o main.o -c main.cfoo.o: foo.c foo.h$(CC) -o foo.o -c foo.cclean: $(RM)  -rf $(EXE) $(OBJS)