Linux基础教程:makefile和make规则(2)

make程序使用makefile中的规则决定程序中需要重新编译的文件,并再次链接生成可执行代码。如果源文件上修改的时间戳比目标文件上的时间戳更新,那么make重新编译build中包含的源文件。例如,如果修改了一个.h头文件,make程序就会重新编译所有包含该头文件的源文件,前提是头文件在这些源文件的目标文件的关联性列表中;再如某.c源文件被修改,那么该源文件被重新编译,生成对应的新的目标文件。

myprog : foo.o bar.o

gcc –o myprog foo.o bar.o

foo.o : foo.c foo.h bar.h

gcc –o foo.o –c foo.c

bar.o : bar.c bar.h

gcc –o bar.o –c bar.c

上述规则中,只要目标文件比冒号后面的文件任何一个旧,将会执行下一行的命令;但是在检查foo.o和bar.o的时间之前,会往下查找那些把foo.o和bar.o作为目标文件的规则;以此类推,并最终回到myprog规则。

如何得到每个C文件的输出规则呢?可使用-M和-MM编译选项。注意:使用-M和-MM编译选项时,仅在shell中输出规则信息,不能用于产生可执行文件,即不能写成gcc -o hello -M hello.c这样的形式。

gcc –M hello.c //输出hello.c和该文件中所有《》和””包含的头文件

gcc –MM hello.c //仅输出hello.c和该文件中所有””包含的头文件

后缀(隐含)规则

make -p命令显示了所有后缀规则列表。为了建立一个目标,make使用程序会遍历一连串的依赖关系,从而决定从何处开始建立。如果没有找到目标文件,make程序按照优先顺序查找源文件,首先查找.c、.f或.s后缀的文件,然后再查找SCCS(带.c~后缀)文件,如果没有找到任何一个源文件,make程序就会报告一个异常。

make程序知道调用gcc -c xxx.c -o xxx.o的预定义命令,而且还知道目标文件通常和源文件是相同的,这种功能称作标准依赖性,所以foo.o : foo.c foo.h bar.h这样的语句可以简写成foo.o : foo.h bar.h。同时,如果把生成foo.o和bar.o的命令从规则中删除,make将自动查找它的隐含规则(gcc -M/MM输出的代码),然后找到一个适当的命令,命令中会使用一些变量,并且按照一定步骤设定。

因此,上述makefile的内容可以根据后缀规则简写成:

myprog : foo.o bar.o

gcc –o myprog foo.o bar.o

foo.o : foo.h bar.h

bar.o : bar.h

宏定义(变量)

makefile中的变量定义可以存储文件名列表、可执行文件名以及编译器标识等,主要是使用如下方法:

VAR=name 变量定义

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/25221.html