makefile简单入门

Posted 众生皆苦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了makefile简单入门相关的知识,希望对你有一定的参考价值。

继续前面的一篇文章

objects = main.o add.o sub.o
test:$(objects)
     gcc -o test $(objects)
main.o:main.c
     gcc -c main.c
add.o:add.c add.h
     gcc -c add.c
sub.o:sub.c sub.h
     gcc -c sub.c
.PHONY:clean
clean:
     rm test $(objects)

其中objects是makefile中的变量,如果我们这里不用变量,那么这个makefile文件会写成什么样?

test:main.o add.o sub.o
    gcc -o test main.o add.o sub.o
main.o:main.c
    gcc -c main.c
add.o:add.c add.h
    gcc -c add.c
sub.o:sub.h sub.c
    gcc -c sub.c
.PHONY:clean
clean:
    rm test $(objects)

不使用变量的时候,main.o add.o sub.o会被写多次,如果添加或者删除一个目标文件的时候,就需要在两个地方修改了。

在makefile中我们可以使用变量。makefile的变量也就是一个字符串,理解成C语言中的宏可能会更好。

比如,我们声明一个变量,叫objects, OBJECTS, objs, OBJS, obj, 或是 OBJ,反正不管什么啦,只要能够表示obj文件就行了。我们在makefile一开始就这样定义:

    objects = main.o add.o sub.o

于是,我们就可以很方便地在我们的makefile中以“$(objects)”的方式来使用这个变量了。如果一行写不下,可以像C语言那样,添加一个换行连字符。

比如 objects = main.o kbd.o command.o display.o \

             insert.o search.o files.o utils.o

让make自动推导

 

GNU的make很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个[.o]文件后都写上类似的命令,因为,我们的make会自动识别,并自己推导命令。

 

只要make看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中,如果make找到一个whatever.o,那么whatever.c,就会是whatever.o的依赖文件。

并且 cc -c whatever.c 也会被推导出来,于是,我们的makefile再也不用写得这么复杂。我们的是新的makefile写成如下:

objects = main.o add.o sub.o
test:$(objects)
    gcc -o test $(objects)

add.o:add.h
sub.o:sub.h
.PHONY:clean
clean:
    rm test $(objects)

现在问题又来了,如果工程中有很多的.h文件,每一个目标文件需要对应多个.h文件,这样的话,就会有多行的.h文件的依赖关系,能不能把它们收拢起来,统一写在一个地方呢?

 

 

 

以上是关于makefile简单入门的主要内容,如果未能解决你的问题,请参考以下文章

CMake入门——简单CMakeLists的编写

Makefile入门

Golang Gin实践 番外 请入门 Makefile

Make和Makefile快速入门

Makefile入门

Makefile入门