在编写小程序的时候,许多人都会在编译完源文件后重新编译所有文件来重建应用程序。但对大型程序来说,会带来一些很明显的问题,编辑–编译–测试这一循环的周期将变长,如果仅仅是改变了一个源文件,即使是再有耐心的程序员也不想编译所有的源文件。
而make工具可以解决上述问题,它会再必要时重新编译所有受改动影响的源文件。
make命令与makefile文件的结合提供了一个在项目管理领域十分强大的工具,不仅常用于控制源代码的编译,而且还用于手册页的编写以及将应用程序安装到目标目录。
make命令
make程序本身有许多选项,以下只介绍常用的三种:
-k:让make命令再发现错误时仍继续执行,而不是在检测到第一个错误时就停下来。
-n:让make命令输出将要执行的操作步骤,而不是真正执行这些操作。
-f 《filename》:告诉make命令将哪个文件作为makefile文件。
简单的makefile文件的创建与使用
makefile规则写法:先写目标的名称,然后紧跟着一个冒号,(然后是空格或制表符tab),最后使用空格或制表符tab隔开的文件列表
解释为
目标:依赖文件
如下所示:
all: main
#GDB -g
main: main.o //目标文件main的依赖文件为main.o
gcc -o main main.o
main.o: main.c //main.o依赖文件为main.c
gcc -c main.c //将源文件main.c编译成main.o
clean: //清理中间文件
rm *.o main
下面是一个具体的例子:
add.h
#include<stdio.h>
#include<math.h>
int Add(int a, int b);
add.c
int Add(int a,int b)
{
return a+b;
}
main.c
#include<stdio.h>
#include"add.h"
int main()
{
int a = 2, b=8;
int sum = Add(a, b);
printf("add = %d\n",sum);
return 0;
}
makefile
all:main
#GDB = -g
main:main.o add.o
gcc -o main main.o add.o
main.o:main.c
gcc -c main.c
add.o:add.c
gcc -c add.c
clean:
rm *.o main
运行结果:
执行make命令之前:
执行make命令之后:
运行程序:
注释:再makefile文件中进行注释的时候用“#”,而非“//”。
makefile文件中的宏
makefile中允许使用简单的宏指代源文件及其相关编译信息,在Linux中也称宏为变量。在引用宏时只需在变量前加$符号,但值得注意的是,如果变量名的长度超过一个字符,在引用时就必须加圆括号()。
下面是对上面makefile文件的一个改进:
all:main
CC = gcc
INCLUDE = .
CFLAGS = -g -Wall -ansi
main:main.o add.o
$(CC) -o main main.o add.o
main.o: main.c
$(CC) -I$(INCLUDE) $(CFLAGS) -c main.c
add.o: add.c
$(CC) -I$(INCLUDE) $(CFLAGS) -c add.c
clean:
rm *.o main
这里使用到了变量,用CC代替了gcc, CFLAGS是makefile中预定义的变量,我们为将它初始化为-g -Wall -ansi(用于开启警告信息、编译链接过程中执行优化处理、增加调试信息),这三个参数都是gcc参数的常用的值,关于gcc参数常用值,这里不做具体介绍。
以下是运行结果:
通过使用宏定义,可以方便的更改某一行,而不需要更改好多行,提高了效率。
目前水平有限,只能了解这么深了。。。。。。