简单理解Makefile

1. 从hello world开始,假设在hello.c中有如下代码:

#include <stdio.h>

int main(int argc, char* argv[])
{
    printf("hello world.\n");
    return 0;
}
把hello.c编译成可执行程序hello,可简单分成下面两步:
gcc -c hello.c        #把.c生成.o, -c表示只编译不链接
gcc -o hello hello.o  #把.o文件生成可执行程序。-o表示生成可执行程序,后面跟自定义的可执行程序的名字

上述过程在makefile中包含两层依赖关系和两条命令:

hello : hello.o  #hello由hello.o生成,所以hello依赖于hello.o,
                  #依赖关系用分号隔开,左边的叫做目标(target),右边称为依赖(prerequisites)
hello.o : hello.c
当依赖文件被修改时,则执行命令(command),命令跟在依赖关系的下面一行:

hello : hello.o
	gcc -o hello hello.o

hello.o : hello.c
	gcc -c hello.c      #片段1

执行make或make hello命令,就可以得到可行性程序hello了。

综上所述,makefile就是一个简单公式:

target ... : prerequisites ...
         command

2.makefile中的隐式规则,.o文件对.c文件的规则会自动执行,所以片段1可以写成:

hello : hello.o
    gcc -o hello hello.o   #片段2

3. makefile中的3个符号$@,$^,$<。

    $@表示目标,$^表示所有的依赖文件,$<表示第一个依赖文件,则片段2可以表示成:

hello : hello.o          #  片段3
	gcc -o $@ $^      #  $@即hello,$^即hello.o,此处只有一个依赖文件,也可以用$<替代$^,
                         #  即gcc -o $@ $<,多个依赖文件时只能用$^

4.makefile中变量的使用,比如hello.c同时用到了a.c,b.c或多个源文件,则片段3可写成:
objs = hello.o a.o b.o

hello : $(objs)            # objs即自定义的变量名,引用时$加小括号扩起来$(objs)
    gcc -o $@ $^           # 片段4
5.再定义两个变量,片段4可改写成:
CC     = gcc
TARGET = hello
objs   = hello.o a.o b.o

$(TARGET) : $(objs)
    $(CC) -o $@ $^
6.makefile中换行用Tab键!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值