怎么编写makefile

来源:互联网 发布:中国大学生失业率数据 编辑:程序博客网 时间:2024/05/21 20:25

写的makefile的总结,可惜电脑中途死机一半的内容都丢失了,还是决定放出来希望能对大家有点借鉴意义

c文件经过编译之后生成 .0文件
1,如果所有的c文件都没有被编译过那么将会编译所有源文件
2,在上一次make之后源文件被改动过的将会重新编译
3,头文件在上次make之后被修改过的话,会重新编译所有包含他的源文件

makefile中每一个命令必须以tab开始,这样是告诉makefile这是一条命令

下面一个简单的例子
(一个头文件,两个源文件,和一个makefile文件)
文件内容如下:
file.h

#ifndef FILE_H_#define    FILE_H_#ifdef __cplusplusextern "C" {#endifvoid File2Print();#ifdef __cplusplus}#endif#endif

file.c

#include <stdio.h>#include "file.h"int main() {    printf("print file1$$$$$$$$$$$$$$$$$$$$$$$$\n");    File2Print();    return 0;}

file2.c

#include <stdio.h>#include "file.h"void File2Print() {    printf("Print file2**********************\n");}

makefile

start:file1.o file2.o    gcc file1.o file2.o -o filefile1.o:file1.c file.h    gcc -c file1.cfile2.o:file2.c file.h    gcc -c file2.cclean:

在这个makefile文件中,我们的target就是可执行文件file和file1.o ,file2.o两个编译文件

而file1.o 又依赖于file1.c ,file.h
file2.o 依赖于file2.c ,file.h

target后面的命令就是用于生成target目标文件的命令

clean是伪目标:makefile文件中将没有任何依赖只有执行动作的目标成为伪目标

makefile文件中使用变量

obj = file1.o file2.ostart:$(obj)    gcc $(obj) -o filefile1.o:file1.c file.h    gcc -c file1.cfile2.o:file2.c file.h    gcc -c file2.cclean:    rm -f *.o file

源代码和头文件已上面的例子相同,这里我们将 .o文件赋值给obj这个变量,这样我们在需要这些.o文件的时候直接引用obj这个变量就行了

这样的好处是,当源代码文件增加或删除了我们只需要修改一下obj变量就行,而不需要多次修改避免了由于粗心而可能产生的错误

自动推导规则
同样的例子makefile文件还可以这么写,这个makefile文件中我们去掉了file1.o file2.o 两个目标的命令,但是依然能够生成file1.o 和file2.o两个目标文件 ,之所以这样是以为makefile的自动推导规则(即:file1.o和file2.o会分别对应file1.c 和file2.c两个源文件,这是makefile的隐含规则)

obj = file1.o file2.ostart:$(obj)    gcc $(obj) -o filefile1.o:file1.c file.hfile2.o:file2.c file.hclean:    rm -f *.o file

makefile文件可以使用include包含其他makefile文件
使用include的时候如果出错会马上退出make
如果使用 <-include)>的话则会忽略错误

这里写图片描述

VPATH
makefile可以识别特殊变量VPATH通过VPATH可以指定依赖或目标的搜索路径,如果当前目录不存在需要的目标文件或依赖文件时,会自动到VPATH指定的目录寻找

这里写图片描述

以上面的图片为例,加入存在 foo:foo.c 如果当前目录不存在foo.c那么会到src和headers目录中查找,如果文件在src中,则上面的代码等同于 foo:src:/foo.c

关键字vpath

这里写图片描述

上面例子中 PATTERN表示具有相同特征的一类文件,而DERECTORIES则指定了搜索文件的目录。当依赖文件列表中的文件不能在当前目录中找到时,makefile会依次在DIRECTORY目录中查找依赖文件。

例:
vpath %.h ../header
表示makefile中出现的“.h”文件如果不能在当前目录下找到则到../header中查找


makefile中有一个内嵌隐含变量 RM它被定义为 RM=rm -f

所以可以使用 $(RM)


在命令的前面加一个减号,可以确保及时命令失败也不会退出程序

这里写图片描述


export
如果一个变量使用export那么这个变量会传递给子makefile,例:
export VARIABLE=value
变量VARIABLE在子makefile中也可以使用

新版本中使用.EXPORT_ALL_VARIABLE代替exprot


MEKELEVEL表示调用目录的深度


3.9.1

0 0
原创粉丝点击