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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通