Linux make命令简介
Make是一种将源代码转换成可执行文件的自动化工具,通过Make语言,描述了源文件、中间文件、可执行文件之间的关系。与此同时,Make工具可以对编译过程进行优化,在重新编译时会根据时间戳来决定哪些文件需要重新生成,在编译大型工程时,这会省下不少时间。Make有多种变种,其中GNU Make使用相对广泛,在大多Linux/UNIX系统都对其提供支持。
Make这个词,英语的意思是“制作”。Make命令直接用了这个意思,就是要做出某个文件。比如,要做出文件main.out,就可以在linux下执行下面的命令。
[admin@localhost makefiletest]$ make main.out
但是,如果你真的输入这条命令它并不会起作用。因为Make命令本身并不知道,如何做出main.out,需要有人告诉它,如何调用其他命令与资源去完成这个目标。
make命令需要按给定的“规则(Rules)”来制作目标文件。这个“规则”由同一个Makefile文件来提供。
make例子:
我们现在有三个文件:
第一个:
自定义head.h头文件,其内容为:
#include <stdio.h>
#include <stdlib.h>
typedef struct _node{
int length;
char str[100];
}Node;
Node* createNode(char* str);
int visit(Node* p);
第二个:
自定义head.h头文件的.c文件:head.c文件。其内容为:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "./head.h"
Node* createNode(char* str){
Node* new_node = (Node*)malloc(sizeof(Node));
new_node->length = strlen(str);
memset(new_node->str,'\0',sizeof(new_node->str));
strcpy(new_node->str,str);
return new_node;
}
int visit(Node* p){
printf("strlen=%d\nstr=%s\n",p->length,p->str);
return 0;
}
第三个:
主文件main.c(利用自定义头文件搞事情)
#include <stdio.h>
#include "./head.h"
int main(int argc,char** argv){
Node* p = createNode("HelloMyFriends!");
visit(p);
return 0;
}
现在我们需要编译main.c使其可执行,则若不用make方案,我们应该如下输入如下三条编译语句:
[admin@localhost makefiletest]$ gcc head.c -c
[admin@localhost makefiletest]$ gcc main.c -c
[admin@localhost makefiletest]$ gcc main.o head.o -o main.out
分别生成了:
head.o 文件
main.o 文件
将head.o与main.o链接上,生成main.out可执行文件
十分繁琐
当然也可以偷懒用下面的代码编译:
[admin@localhost makefiletest]$ gcc -I ./ main.c ./head.c -o main.out
同样比较长,而且不够简洁,头文件太多的话,更复杂。
所以我们需要用到make命令,让make利用makefile里我们定义的rule来编译。
Makefile文件由一系列规则(rules)构成。每条规则的形式如下:
目标文件名: 前提条件(满足才会执行)
命令语句(相当于直接打在控制台上)
注意:第一条rule是最终的命令。
(可以以底至上的顺序写命令,保证最后一条命令应该率先执行,第一条命令最后执行)
所以我们的Makefile文件应该这么下:
main.out: main.o head.o
gcc main.o head.o -o main.out
mian.o: main.c head.c head.h
gcc main.c -c
head.o: head.c head.h
gcc head.c -c
第三条命令:
head.o: head.c head.h
gcc head.c -c
意思为:
在当前目录存在着head.c文件与head.h文件时,执行gcc head.c -c命令,输出结果head.o文件
第二条命令:
mian.o: main.c head.c head.h
gcc main.c -c
意思为:
在当前目录存在着 main.c文件与head.c文件与head.h文件时,执行gcc main.c -c命令,输出结果为main.o文件
第一条命令:
main.out: main.o head.o
gcc main.o head.o -o main.out
意思为:
在当前目录存在着 main.o文件与head.o文件时,执行gcc main.o head.o -o main.out命令,输出结果为main.out文件
这样在执行时:
我们只要在含有Makeflie的文件夹下make一下,gun便能按照Makefile里的规则执行命令,简化操作。
最终:
[admin@localhost makefiletest]$ make
[admin@localhost makefiletest]$ ./main.out