在Linux上开发的人,应该都知道Makefile,但如果要自己写Makefile,问题可能就暴露出来了,至少刚开始我是这样的。
先创建一个简单的工程,工程中包含如下几个文件:
- print.c
#include "print.h"
void PrintTest()
{
printf("Test Makefile\n");
}
- print.h
#include <stdio.h>
void PrintTest();
- main.c
#include "print.h"
void main()
{
PrintTest();
}
Makefile的编写:
- 第一种方法
main:
gcc -o main main.c print.c
clean:
rm -rf main
这种方法看着很直观,但不会有中间文件(.o)生成。不够智能。
- 第二种方法
main : main.o print.o
gcc -o main main.o print.o
#下面四句也可以放在前面
main.o : main.c main.h
gcc -c main.c -o main.o
print.o : print.c print.h
gcc -c print.c print.o
clean:
rm *.o main
感觉比第一种方法复杂了一些,但至少更像Makefile了吧。
- 第三种方法
main : main.o print.o
gcc -o main main.o print.o
%o : %.c
#$(warning $<)
#$(warning $@)
gcc -c $< -o $@
clean:
rm *.o main
如果不知道 <与 <script type="math/tex" id="MathJax-Element-52"> <与< script>@表示什么,可以把注释掉的代码开启来,看看它会打印什么,感觉越来越智能了,有木有?< p>
- 第四种方法
PROG = test
SOURCES := $(wildcard *.c)
OBJECTS := $(SOURCES:.c=.o)
%.o : %.c
gcc -c $< -o $@
main:$(OBJECTS)
gcc -o $(PROG) $(OBJECTS)
clean:
rm -rf *.o $(PROG)
这个跟之前的几种比,是不是也加高大上了呢?而且不管你添加了多少源代码文件,都可以使用。
纯手写,可能存在一些拼写错误,还请见谅!