简单实用的Makefile

第一种:

# 目录树结构如:
# .
# ├── exec
# ├── exec.c
# ├── fork
# ├── fork.c
# ├── Makefile
# 对于自己做的一些小练习,用这样的Makefile非常方便

SRC = $(wildcard *.c)
TARGETS = $(patsubst %.c, %, $(SRC))    # get targets name without .c
CC = cc

all: $(TARGETS)

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

.PHONY: clean
clean: 
rm -rf $(TARGETS)

 

第二种:

# 目录树如下:
# .
# ├── h
# │   ├── main.h
# │   └── print.h
# ├── makefile
# ├── output
# │   └── a.out.1.0.0
# └── src
#     ├── main.c
#     ├── main.o
#     ├── print.c
#     └── print.o

# makefile - enterprise version

VERSION = 1.0.0                                         #版本号
TARGET = a.out                                          #生成的可执行文件名
SOURCE = $(wildcard src/*.c)                            #各个源文件
OBJ = $(patsubst %.c, %.o, $(SOURCE))                   #对应的各中间文件.o

INCLUDES = -I ./h                                       #头文件的包含路径
CFLAGS = -Wall -c                                       #gcc编译选项
DEBUG = -D HELLO                                        #debug选项:-D后加程序中的#ifdef SYMBOL,相当于定义了该符号
#LIBS =                                                 #库文件路径
CC = cc                                                 #定义CC

$(TARGET): $(OBJ)                                       #目标文件依赖
    @mkdir -p ./output                                  #创建目录但不回显
    $(CC) $(OBJ) -o ./output/$(TARGET).$(VERSION)       #可执行文件名后跟版本号,便于区分版本

%.o: %.c                                                #中间文件依赖,这里%符的使用:对于所有的n个xx.c,有相应的xx.o,相当于展开为n个依赖关系,这种写法很简洁
    $(CC) $(INCLUDES) $(DEBUG) $(CFLAGS) $< -o $@       #$<代表依赖列表的第一个文件,$@代表目标文件

.PHONY: clean
clean:
    -rm -rf $(TARGET) $(OBJ) ./output/*

 

posted @ 2020-07-19 09:52  凉风SK  阅读(207)  评论(0编辑  收藏  举报