学习视频来自:https://www.bilibili.com/video/BV188411L7d2/?spm_id_from=333.999.top_right_bar_window_custom_collection.content.click&vd_source=af08abb64be235e64e47d4aeab5a6bed
VERSION 1
hello: main.cpp printhello.cpp factorial.cpp
g++ -o hello main.cpp printhello.cpp factorial.cpp
# hello:生成的目标。
# main.cpp printhello.cpp factorial.cpp:生成目标hello所依赖的文件。
# g++ -o hello main.cpp printhello.cpp factorial.cpp:通过何种命令生成目标文件。
VERSION 2
CXX = g++ # CXX是一个变量名,指定编译器为g++
TARGET = hello # TARGET和下面的OBJ都是变量
OBJ = main.o printhello.o factorial.o
$(TARGET): $(OBJ) # TARGET这些目标是依赖OBJ的
$(CXX) -o $(TARGET) $(OBJ) # 编译器会自动将括号中的内容替换成变量的内容
main.o: main.cpp
$(CXX) -c main.g++ -o hello main.cpp printhello.cpp factorial.cpp
printhello.o: printhello.cpp
$(CXX) -c printhello.cpp
factorial.o: factorial.cpp
$(CXX) -c factorial.cpp
VERSION 3
CXX = g++
TARGET = hello
OBJ = main.o printhello.o factorial.o
CXXFLAGS = -c -Wall # -Wall:编译时将所有的warning都显示出来
$(TARGET): $(OBJ)
$(CXX) -o $@ $^ # $@:标识目标文件(冒号前的东西)
# $^:表示所依赖的所有文件(冒号后的东西)
%.o: %.cpp #所有的.cpp文件通过下一行的命令生成.o文件
$(CXX) $(CXXFLAGS) $< -o $@ # $^:表示所依赖的第一个文件(冒号后的第一个文件名)
.PHONY: clean # 设置一个伪目标,否则当前文件目录有clean文件了编译会不通过
clean:
rm -f *.o $(TARGET) # -f:强制删除
# 强制删除所有的.o文件和TARGET代表的文件
VERSION 4
CXX = g++
TARGET = hello
SRC = $(wildcard *.cpp) # 当前所有后缀名为.cpp的文件都给SRC
OBJ = $(patsubst %.cpp, %.o, $(SRC)) # 将SRC中所有的.cpp替换成.o,OBJ最终存储的是所有的.o文件
CXXFLAGS = -c -Wall
$(TARGET): $(OBJ)
$(CXX) -o $@ $^
%.o: %.cpp
$(CXX) $(CXXFLAGS) $< -o $@
.PHONY: clean
clean:
rm -f *.o $(TARGET)
建議加一個編譯版本,不然有時候默認的版本無法編譯一些比較新的表達式