在嵌入式的开发中,我们经常使用了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.o
gcc -o all main.o foo.o
main.o: main.c
gcc -o main.o -c main.c
foo.o: foo.c foo.h
gcc -o foo.o -c foo.c
clean:
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:clean
all: main.o foo.o
gcc -o all main.o foo.o
main.o: main.c
gcc -o main.o -c main.c
foo.o: foo.c foo.h
gcc -o foo.o -c foo.c
clean:
rm all foo.o main.o
此时你make clean 你会发现 make clean可以起作用了。
3. 适当的利用 “变量”提高可维护性。
.PHONY:clean
CC = gcc
RM = rm
EXE = all
OBJS = main.o foo.o
$(EXE): $(OBJS)
$(CC) -o $(EXE) $(OBJS)
main.o: main.c
$(CC) -o main.o -c main.c
foo.o: foo.c foo.h
$(CC) -o foo.o -c foo.c
clean:
$(RM) -rf $(EXE) $(OBJS)