make

make是所有想在Linux系统上编程的用户必须掌握的工具,对于任何稍具规模的程序,我们都会使用到make,几乎可以说不使用make的程序不具 备任何实用价值。 
在此,我们有必要解释编译和连接的区别。编译器使用源码文件来产生某种形式的目标文件(object files),在编译过程中,外部的符号参考 
并没有被解释或替换(即外部全局变量和函数并没有被找到)。因此,在编译阶段所报的错误一般都是语法错误。而连接器则用于连接目标文 

件和程序包,生成一个可执行程序。在连接阶段,一个目标文件中对别的文件中的符号的参考被解释,如果有符号不能找到,会报告连接错误

编译和连接的一般步骤是:第一阶段把源文件一个一个的编译成目标文件,第二阶段把所有的目标文件加上需要的程序包连接成一个可执行文 件。这样的过程很痛苦,我们需要使用大量的gcc命令。 
而make则使我们从大量源文件的编译和连接工作中解放出来,综合为一步完成。GNU Make的主要工作是读进一个文本文件,称为makefile。这 
个文件记录了哪些文件(目的文件,目的文件不一定是最后的可执行程序,它可以是任何一种文件)由哪些文件(依靠文件)产生,用什么命 
令来产生。Make依靠此makefile中的信息检查磁盘上的文件,如果目的文件的创建或修改时间比它的一个依靠文件旧的话,make就执行相应的 命令,以便更新目的文件。 
假设我们写下如下的三个文件,add.h用于声明add函数,add.c提供两个整数相加的函数体,而main.c中调用add函数: /* filename:add.h */ extern int add(int i, int j);    
/* filename:add.c */ int add(int i, int j) { 
  return i + j; };    
/* filename:main.c */ 

#include "add.h" main()


  int a, b;   a = 2;   b = 3; 
  printf("the sum of a+b is %d", add(a + b)); 


 
怎样为上述三个文件产生makefile呢?如下: ------------------------- test : main.o add.o 
gcc main.o add.o -o test   
main.o : main.c add.h gcc -c main.c -o main.o   
add.o : add.c add.h gcc -c add.c -o add.o  ----------------------- (注意分割符为TAB键) 
上述makefile利用add.c和add.h文件执行gcc -c add.c -o add.o命令产生add.o目标代码,利用main.c和add.h文件执行gcc -c main.c -o  
main.o命令产生main.o目标代码,最后利用main.o和add.o文件(两个模块的目标代码)执行gcc main.o add.o -o test命令产生可执行文件 test。 
我们可在makefile中加入变量,另外。环境变量在make过程中也被解释成make的变量。这些变量是大小写敏感的,一般使用大写字母。Make变 量可以做很多事情,例如: 

i) 存储一个文件名列表; 

ii) 存储可执行文件名;  

iii) 存储编译器选项。

 
 
要定义一个变量,只需要在一行的开始写下这个变量的名字,后面跟一个=号,再跟变量的值。引用变量的方法是写一个$符号,后面跟(变量 
名)。我们把前面的 makefile 利用变量重写一遍(并假设使用-Wall -O –g编译选项):       
OBJS = main.o add.o  CC = gcc  
CFLAGS = -Wall -O -g       
test : $(OBJS) $(CC) $(OBJS) -o test       
main.o : main.c add.h 
$(CC) $(CFLAGS) -c main.c -o main.o        
add.o : add.c add.h  
$(CC) $(CFLAGS) -c add.c -o add.o  
makefile 中还可定义清除(clean)目标,可用来清除编译过程中产生的中间文件,例如在上述makefile文件中添加下列代码:  clean:  rm -f *.o 
运行make clean时,将执行rm -f *.o命令,删除所有编译过程中产生的中间文件。 不管怎么说,自己动手编写makefile仍然是很复杂和烦琐的,而且很容易出错。因此,GNU也为我们提供了Automake和Autoconf来辅助快速自动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Swxctx

您的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值