简单工程的通用makefile

文章目的:使用make命令编译一个目录下有多个C文件的简单工程

Makefile基本规则

要更新target,必须首先更新它的所有prerequisitesrecipe是执行的命令。

target ... : prerequisites ...
	recipe

注意recipe,前面是tab键。是空格会报错

函数

  • wildcard:通配符
  • patsubst:替换命令

目录内容如下:

├── Makefile
├── hello.c
├── hello.h
├── main.c
├── world.c
└── world.h

Makefile输入如下内容

#wildcard:为当前目录下的所有.c字符,赋值给变量src
#“%”可以匹配目标和条件的任何部分,比如hello.c可以写成%.c
src=$(wildcard  *.c)
#patsubst:在src中查找含.c的字符串,替换为.o字符串,赋值给变量obj
obj=$(patsubst %.c, %.o, $(src))
#约定俗成的名字all
all:
        @echo $(src)
        @echo $(obj)        

Makefile中#是注释

$ make
hello.c world.c main.c
hello.o world.o main.o

Automatic Variables

  • $^:规则中的所有条件,以空格分隔
  • $@:规则中的目标
  • $<:规则中的第一个条件
#wildcard:为目录下的所有.c字符,赋值给变量src
src=$(wildcard *.c)
#patsubst:在src中查找含.c的字符串,替换为.o字符串,赋值给变量obj
obj=$(patsubst %.c, %.o, $(src))

all:$(obj)
        @echo $^
        @echo $@
        @echo $<
$ make
hello.o world.o main.o
all
hello.o

实现

#wildcard:为目录下的所有.c字符,赋值给变量src
src=$(wildcard *.c)
#patsubst:在src中查找含.c的字符串,替换为.o字符串,赋值给变量obj
obj=$(patsubst %.c, %.o, $(src))

#定义使用的gcc编译
CC=gcc
#通常定义成编译选项
CFLAGS=-Wall -g

#约定俗成的名字:all, install, clean, distclean
all:main
main:$(obj)
 $(CC) $^ -o $@

%.o:%.c
 $(CC) $(CFLAGS) -c $<

#.PHONY:生成一个伪目标。把clean当成一个特殊的名字使用。无条件的运行recipe
.PHONY:clean
clean:
  $(RM) *.o
#加@:表示不显示命令本身。
 @echo "clean complete"

执行结果

$ make
gcc -Wall -g -c hello.c
gcc -Wall -g -c world.c
gcc -Wall -g -c main.c
gcc hello.o world.o main.o -o main

参考

  1. GUN make
  2. Linux C编程一站式学习
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值