最终目标
编译如下工程:cala.c add.c sub.c multi.c,其中,add生成为动态库,sub生成为静态库,multi正常编译
//calc.c
#include <stdio.h>
#include "add.h"
#include "sub.h"
#include "multi.h"
int main(){
printf("3+5=%d\r\n",add(3,5));
printf("3-5=%d\r\n",sub(3,5));
printf("3*5=%d\r\n",multi(3,5));
}
Makefile基本规则
目标:依赖
<TAB>命令
...
目标是最终要执行的语句块,没有指定目标时,默认第一个。makefile执行每一个目标语句块时,当依赖文件(同时依次检查依赖的依赖)修改时间晚于目标文件时,执行该语句块;当依赖文件不存在时,寻找与依赖相符合的目标,执行相对应的语句。例如,最基本的编译方法:
calc:calc.o add.o sub.o multi.o
gcc calc.o add.o sub.o mult.o -o calc
calc.o :calc.c
gcc -c calc.c -o calc.o
add.o :add.c
gcc -c add.c -o add.o
sub.o :sub.c
gcc -c sub.c -o sub.o
multi.o :multi.c
gcc -c multi.c -o multi.o
执行Makefile时,如果为指定目标,则将calc视为最终目标,如果calc.o不存在,或者calc.c修改时间晚于calc,依次执行gcc -c calc.c -o calc.o和gcc calc.o add.o sub.o mult.o -o calc 。
Makefile文件名
make:一般指的是GNU Make,是一个软件,时一种用于自动化编译的工具,make工具编译的时候需要一个文件提供编译规则。默认情况下,make命令会在当前目录下依次寻找名为“GNUmakefile”、“makefile”、“Makefile”的文件,也可以通过命令行 -f 或者 --file 指定文件名。
目标与伪目标
一般情况下,我们会指定一个clean目标,来清理工程中的文件
clean:
rm calc calc.o add.o sub.o multi.o
当目录下面没有clean文件时,makefile中的clean做为一个标签,可以正常执行;但是,如果当前目录下有clean文件时
clean被认定为目标,该目标没有依赖,所以永远是最新的,该目标下的指令永远不会被执行。伪目标的作用是将目标转变为一个标签。伪目标的声明那个按习惯放在Makefile开头。
.PHONY:clean