make与Makefile学习01

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值