Makefile四个版本

参考链接:
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)

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

后续:在第四个版本基础上修改

# VERSION 5
# 通过运行make run,如果先前已经编译,能直接运行,如果之前没有编译,可以自动先编译再运行
CXX = g++
TARGET = hello
# 所有当前目录的.cpp文件都放在SRC里面
SRC = $(wildcard *.cpp)
# 把SRC里面的.cpp文件替换为.o文件
OBJ = $(patsubst %.cpp, %.o,$(SRC))
CXXFLAGS = -c -Wall
$(TARGET): $(OBJ)
$(CXX) -o $@ $^
%.o: %.cpp
$(CXX) $(CXXFLAGS) $< -o $@
.PHONY: clean
clean:
rm -f *.o $(TARGET)
.PHONY: run
run: $(TARGET)
./$(TARGET)
# ----------------------------------------------------------------------------- #
# VERSION 6
# 满足以下文件架构:
# hello/
# |-- src/
# | |-- hello.c
# | |-- glad.c
# |-- build/
# | |-- hello.o
# | |-- glad.o
# |-- Makefile
# |-- out
# 最好,运行make自动创建build文件和out文件.运行make clean能自动删除build文件和out文件, make run能自动编译运行(不会重复编译)
CXX = g++
TARGET = out
SRC_DIR = src
BUILD_DIR = build
SRC = $(wildcard $(SRC_DIR)/*.c)
OBJ = $(patsubst $(SRC_DIR)/%.c, $(BUILD_DIR)/%.o, $(SRC))
CXXFLAGS = -c -Wall
MKDIR_P = mkdir -p
$(TARGET): $(OBJ)
$(CXX) -o $@ $^
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c
$(MKDIR_P) $(dir $@)
$(CXX) $(CXXFLAGS) $< -o $@
.PHONY: clean
clean:
rm -rf $(BUILD_DIR) $(TARGET)
.PHONY: run
run: $(TARGET)
./$(TARGET)

注意:linux的中tab键有时候是四个空格,可以在命令模式(先esc)下进行如下设置:
:set expandtab
:set tabstop=4
:set shiftwidth=4

posted @   小阮向阳  阅读(52)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示