简单实用的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/*