怎么编写makefile

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

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

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

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

#ifndef FILE_H_
#define    FILE_H_
#ifdef __cplusplus
extern "C" {
#endif
void 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 file
file1.o:file1.c file.h
    gcc -c file1.c
file2.o:file2.c file.h
    gcc -c file2.c
clean:

在这个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.o
start:$(obj)
    gcc $(obj) -o file
file1.o:file1.c file.h
    gcc -c file1.c
file2.o:file2.c file.h
    gcc -c file2.c
clean:
    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.o
start:$(obj)
    gcc $(obj) -o file
file1.o:file1.c file.h
file2.o:file2.c file.h
clean:
    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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值