一步一步学写makefile (一)

转自:http://www.avrtool.com/avr/avrt/hjkf/200904/1542.html

makefile对于溺于IDE下的朋友们一定接触的不多,因为IDE把建立makefile的任务一手包办了,但常期以往沉浸于IDE的溺爱是对发展非常不利的,特别是在unix下和makefile打交道是更为普遍,所有学会写makefile是非常有必要的。

在IDE下,系统之所以能井然有序的对众多源代码进行编译和链接,是因为IDE很明确的告诉系统先做什么而后做什么。而makefile就是一个传播这些信息媒介,而我们现在的目标抛离IDE的怀怉,返璞归真。

这里是官方make参考文档中makefile一章,关于makefile的方方面面可谓是面面惧到,非常适合看到E文不头疼的朋友和即使头疼也要看的朋友http://www.gnu.org/software/make/manual/make.html#Makefiles 

准备工具和文件
hello.c

#include <stdio.h>
int main(int argc,char* argv[])
{
  printf("hello world\n");
  return 0;
}
当hello.c输入完成后,我们要对hello.c进行编译,需要执行
gcc hello.c

初任务:建立一个makefile,使用make代替以上的过程。

# 最简单的makefile
hello: hello.c
    gcc hello.c
#注意 hello前与gcc前的是[TAB]而不是空格
当makefile建立完成后放至hello.c所在的文件夹,执行make,看看发现了什么。
make执行了gcc hello.c成功的完成了编译
我们回首分析那个makefile发现执行单元由3个部分组成
<目标名称>:<需要的文件>
             <命令>
我们对makefile进行改写,以更能容易描述这三个单元
#次简单的makefile
hello: hello.o
    gcc hello.o -o hello
hello.o: hello.c
    gcc -c hello.c -o hello.o
删除目录下的hello.o后再执行make后发现了什么?
系统执行了
gcc -c hello.c -o hello.o
gcc hello.o -o hello

对比makefile我们很容易发现hello的建立过程为
hello <- hello.o <- hello.c


任务二:关联多个源文件的makefile

对单个文件大家可能没有体会到优势,那么我们新引入一个func.c 与 func.h 文件并修改hello.c
/*hello.c*/
#include "func.h"
int main(int argc,char* argv[])
{
    func();
    return 0;
}


/*func.c*/
#include "func.h"
void func(void)
{
printf("hello world\n");
}


/*func.h*/
#ifndef _FUNC_H
#define _FUNC_H

#include <stdio.h>

void func(void);
#endif
并修改相应的makefile为
#任务二的makefile
hello: hello.o func.o
    gcc hello.o func.o -o hello
hello.o: hello.c
    gcc -c hello.c -o hello.o
func.o: func.c func.h
    gcc -c func.c -o func.o
运行make后输出
gcc -c hello.c -o hello.o
gcc -c func.c -o func.o
gcc hello.o func.o -o hello
执行过程为
hello<-hello.o<-hello.c
    ^--func.o<-hello.c

通过任务一和任务二,我相信大家一对makefile最最基本的规则有了个明确的了解。不过这仅仅只是序幕。下一章我们将使用make的特性开始对makefile修改,以简化和自动化我们书写代码的过程。

makefile相比较c来讲还是相当的简单的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值