Linux下Makefile的简单应用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39521181/article/details/78237707

Linux下Makefile的简单应用

一、概述
什么是Makefile?或许很多人都不知道,但如果你想要成为一个专业人士,特别是在Linux下的软件编译就不能不自己写Makefile了。会不会写Makefile很大程度上可以从侧面表现出一个人是否有能力完成一个大工程。所以说写一个适合自己的Makefile还是很重要的。
make 是一个命令工具,它解释 Makefile 中的指令(应该说是规则)。在 Makefile
文件中描述了整个工程所有文件的编译顺序、编译规则。 Makefile 有自己的书写格式、
关键字、函数。像 C 语言有自己的格式、关键字和函数一样。而且在 Makefile 中可以
使用系统 shell 所提供的任何命令来完成想要的工作。 Makefile(在其它的系统上可能
是另外的文件名)在绝大多数的 IDE 开发环境中都在使用,已经成为一种工程的编译
方法。

二、make是如何工作的
在默认的方式下,也就是我们只输入make命令。那么,
(1) make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
(2) 如果找到,它会找文件中的第一个目标文件,在上面的例子中,他会找到 “edit” 这个文件,并把这个文件作为最终的目标文件。
(3) 如果edit文件不存在,或是edit所依赖的后面的 .o 文件的文件修改时间要比edit 这个文件新,那么,他就会执行后面所定义的命令来生成edit这个文件。
(4) 如果edit所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的 依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)
(5)你的C文件和H文件是存在的,于是make会生成 .o 文件,然后再用 .o 文件声 明make的终极任务,也就是执行文件edit了。

这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。

Make clean
清空目标文件的规则
每个Makefile中都应该写一个清空目标文件(.o和执行文件)的规则,这不仅便于重编译,也很利于保持文件的清洁。这是一个“修养”(呵呵,还记得我的《编程修养》吗)。一般的风格都是:
clean:
rm edit (objects).PHONY:cleanclean:rmedit (objects)
前面说过,.PHONY意思表示clean是一个“伪目标”,。而在rm命令前面加了一个小减号的意思就是,也许某些文件出现问题,但不要管,继续做后面的事。当然,clean的规则不要放在文件的开头,不然,这就会变成make的默认目标,相信谁也不愿意这样。不成文的规矩是——“clean从来都是放在文件的最后”。

简单的Makefile实例
首先建立三个文件,分别为main.c,test.h,test.c。代码如下:
Vim main.c

include “test.h”

int main(void)
{
test();

return 0;    

}

Vim test.h
void test();

Vim test.c

include

整个替换的过程是在执行“ echo $(foo)”时完成的。这种类型的变量是其它版本的 make 所支持的类型。我们可以把这种类型的变量称为“递归展开”式变量。此类型变量存有它的优点同时也存在其缺点。 其优点是:这种类型变量在定义时,可以引用其它的之前没有定义的变量(可能在后续部分定义,或者是通过 make 的命令行选项传递的变量)。

第二个例子:
OBJS = file1.o file2.o
CC = gcc
CFLAGS = -Wall -O -g

          helloworld : $(OBJS)
                 $(CC) $(OBJS) -o helloworld

          file1.o : file1.c file2.h
                 $(CC) $(CFLAGS) -c file1.c -o file1.o

          file2.o : file2.c file2.h
                 $(CC) $(CFLAGS) -c file2.c -o file2.o



          clean:

                 rm -rf *.o helloworld

   这里我们应用到了变量。要设定一个变量,你只要在一行的开始写下这个变量的名字,后 面跟一个 = 号,后面跟你要设定的这个变量的值。以后你要引用 这个变量,写一个 $ 符号,后面是围在括号里的变量名。

CFLAGS = -Wall -O –g,解释一下。这是配置编译器设置,并把它赋值给CFFLAGS变量。

-Wall: 输出所有的警告信息。

-O: 在编译时进行优化。

-g: 表示编译debug版本。

   这样写的Makefile文件比较简单,但很容易就会发现缺点,那就是要列出所有的c文件。如果你添加一个c文件,那就需要修改Makefile文件,这在项目开发中还是比较麻烦的。

猜你喜欢

转载自blog.csdn.net/qq_39521181/article/details/78237707