Makefile四个版本

发布时间 2024-01-05 10:11:52作者: 小阮向阳

参考链接:
https://www.bilibili.com/video/BV188411L7d2/?share_source=copy_web&vd_source=bd15a1a686c20b376f6b2d1744c665ee
https://blog.csdn.net/ssz__/article/details/129856186

# VERSION 1
# hello为生成的可执行文件,依赖于后面的三个.cpp文件
# g++前面加一个TAB的空格
# 特点:依赖关系清晰;文件多时,编译时间长;需要写出所有具体文件名
hello: main.cpp printhello.cpp factorial.cpp
	g++ -o hello main.cpp printhello.cpp factorial.cpp

# ----------------------------------------------------------------------------- #

# VERSION 2
# make时执行g++ 先找TARGET,TARGET不存在找OBJ,OBJ不存在,编译三个.cpp文件生成.o文件
# 然后再编译OBJ文件,生成可执行文件hello
# 特点:依赖关系清晰,第一次编译后只编译修改后的文件;需要写出所有文件名
CXX = g++
TARGET = hello
OBJ = main.o printhello.o factorial.o

$(TARGET): $(OBJ)
	$(CXX) -o $(TARGET) $(OBJ)
# main.o这样来的,编译main.cpp生成
main.o: main.cpp
	$(CXX) -c main.cpp
printhello.o: printhello.cpp
	$(CXX) -c printhello.cpp
factorial.o: factorial.cpp
	$(CXX) -c factorial.cpp

# ----------------------------------------------------------------------------- #

# VERSION 3
# 特点:比较专业,第一次编译后只编译修改后的文件;不需要写出所有文件名,但是需要写出每个目标.o文件
CXX = g++
TARGET = hello
OBJ = main.o printhello.o factorial.o
 
# 编译选项,显示所有的warning
CXXLAGS = -c -Wall
 
# $@表示的就是冒号前面的TARGET,$^表示的是冒号后OBJ的全部.o依赖文件
$(TARGET): $(OBJ)
	$(CXX) -o $@ $^
 
# $<表示指向%.cpp依赖的第一个,但是这里依赖只有一个
# $@表示指向%.o
%.o: %.cpp
	$(CXX) $(CXXLAGS) $< -o $@
 
# 为了防止文件夹中存在一个文件叫clean
.PHONY: clean
 
# -f表示强制删除,此处表示删除所有的.o文件和TARGET文件
clean:
	rm -f *.o $(TARGET)

# ----------------------------------------------------------------------------- #

# VERSION 4
# 特点:最专业,第一次编译后只编译修改后的文件;什么具体文件名都不用写,拿来即用
CXX = g++
TARGET = hello
# 所有当前目录的.cpp文件都放在SRC里面
SRC = $(wildcard *.cpp)
# 把SRC里面的.cpp文件替换为.o文件
OBJ = $(patsubst %.cpp, %.o,$(SRC))
 
CXXLAGS = -c -Wall
 
$(TARGET): $(OBJ)
	$(CXX) -o $@ $^
 
%.o: %.cpp
	$(CXX) $(CXXLAGS) $< -o $@
 
.PHONY: clean
clean:
	rm -f *.o $(TARGET)

以上四个版本选择一个其他删除或注释即可使用,推荐第四种,什么也不用修改,其他的需要根据实际使用情况对文件名进行相应替换