简单说明一下makefile的基本语法
target...: prerequisites...
command
...
冒号前的文件依赖于冒号后的文件,就是说如果prerequisites的最后修改时间晚于target,那么就会执行后面的命令command来生成新的target文件。command为普通的shell命令,注意命令前要缩进。
另外makefile语法中.o文件会被自动依赖于同名的.c文件,例如例子中的main.o会被自动依赖于文件mian.c 。所以如果只有main.c文件被修改时,重新执行make命令,只有依赖于main.o的文件会被重新构建。
还要说明的一点是:例子中main.c文件被设置依赖于头文件add.h和sub.h,虽然一般情况下头文件的修改一般会导致对应源代码文件的修改,使得依赖于这些源代码文件的文件被重新编译,貌似我们没有必要设置头文件的依赖性。但是如果头文件中有声明一些全局变量或含有宏定义时,情况就会不同。若是修改了头文件中的全局变量或宏定义,设定依赖性的文件能够被重新编译,未设置的文件则不能。所以说设置头文件的依赖性还是有必要的。
makefile文件
objects = main.o add.o sub.o
prac : $(objects)
gcc -o prac $(objects)
main.o: add.h sub.h
clean:
rm prac $(objects)
main.c
#include <stdio.h>
#include "add.h"
#include "sub.h"
int main()
{
int a = 5, b = 3;
printf("%d\n", add(a,b));
printf("%d\n", sub(a,b));
return 0;
}
add.h
#ifndef ADD_H_
#define ADD_H_
int add(int a, int b);
#endif
sub.h
#ifndef SUB_H_
#define SUB_h_
int sub(int a, int b);
#endif
add.c
#include "add.h"
int add(int a, int b)
{
return a + b;
}
sub.c
#include "sub.h"
int sub(int a, int b)
{
return a - b;
}