我个人的一个Makefile模版(C++、C)

本文介绍了一个Makefile模板,用于自动化构建过程。该模板定义了编译器、目标文件、依赖文件等关键元素,并通过预定义的规则实现了源代码到可执行文件的转换。此外,还提供了清理目标文件和依赖项的功能。
.PHONY: all clean
CC=g++
BIN=target
DEPF=main.dep
SRC_FILE_TYPE= .c .cpp
H_FILE_TYPE= .h .hpp
LOCAL_SRC_PATH= .
LOCAL_INCLUDE_PATH= .
LOCAL_LIBRARY_PATH= .
LIBS=
D_FINE_SIGN=
DEFINE_FLAGS=$(addprefix -D, $(D_FINE_SIGN))
CFLAGS= $(addprefix -I, $(LOCAL_INCLUDE_PATH)) -g -Wall
CXXFLAGS= $(addprefix -I, $(LOCAL_INCLUDE_PATH)) -g -Wall
LDFLAGS= $(addprefix -L, $(LOCAL_LIBRARY_PATH))
GENERALLY_ALL_SRC_FILE=$(foreach n, $(LOCAL_SRC_PATH), $(foreach m, $(SRC_FILE_TYPE), $(n)/*$(m)))
SUBST_ALL_SRC_FILE=$(subst //, /, $(GENERALLY_ALL_SRC_FILE))
ALL_SRC_FILE=$(filter-out $(subst ., %/*.,  $(SRC_FILE_TYPE)),  $(shell echo $(SUBST_ALL_SRC_FILE)))
GENERALLY_H_FILE=$(foreach n, $(LOCAL_INCLUDE_PATH), $(foreach m, $(H_FILE_TYPE), $(n)/*$(m)))
SUBST_H_FILE=$(subst //, /, $(GENERALLY_H_FILE))
H_FILE=$(filter-out $(subst ., %/*., $(H_FILE_TYPE)), $(shell echo $(SUBST_H_FILE)))

OBJ=$(foreach n, $(subst .,%., $(SRC_FILE_TYPE)), $(filter %.o, $(patsubst $(n),%.o, $(ALL_SRC_FILE))))

all:$(DEPF) $(BIN)
$(DEPF):$(ALL_SRC_FILE) $(H_FILE)
	@cat /dev/null > $@
	$(CC) $(CFLAGS) $(DEFINE_FLAGS) $(ALL_SRC_FILE) -MM >>  $@
-include $(DEPF)
$(BIN):$(OBJ)
	$(CC) $(LDFLAGS) $(LIBS) $^ -o $@
clean:
	rm -rf $(BIN) $(OBJ) $(DEPF)


其实上面的模板 根据实际情况更改一下 编译器、指定一下 -std=参数、添加一下必要的头文件路径、库路径,指定一下库链接名称即可。
当然还要根据世纪情况,添加库编译相关。可以根据实际情况调整一下即可。



 
<think>好的,用户想要一个C++的Makefile模板。我需要先回想一下Makefile的基本结构和常用变量。用户可能是一个刚开始学习C++开发的新手,或者希望简化项目构建流程的开发者。他们可能需要一个通用的模板,可以适用于大多数C++项目,同时具备可扩展性。 首先,我应该考虑Makefile的基本组成部分:编译器选择、编译选项、源文件和目标文件的定义、规则等。常见的变量如CC、CXX、CFLAGS、CXXFLAGS、LDFLAGS和LIBS。用户可能希望模板支持C和C++混合项目,所以需要同时包含CC和CXX。 接下来,源文件和目标文件的处理。通常,源文件会放在src目录,头文件在include,目标文件在build。使用wildcard函数来自动收集源文件,然后转换为目标文件的路径。这里需要注意模式规则,比如用%.o: %.c来编译C文件,而%.o: %.cpp对应C++文件。 然后是可执行文件的生成,链接阶段需要包含所有目标文件和可能的库。用户可能需要添加自定义的库,所以在模板里应该留有LIBS变量,方便他们自行修改。 clean规则是必须的,用来删除生成的文件。同时,all规则作为默认目标,确保执行make时自动构建所有内容。可能还需要考虑依赖关系,比如头文件变化后自动重新编译相关源文件,但基本的模板可能不需要太复杂,保持简洁。 另外,用户可能希望Makefile支持调试版本和发布版本。可以通过在CXXFLAGS中添加不同的选项,比如-g用于调试,-O2用于优化。可能需要添加注释说明如何修改这些选项。 还要考虑跨平台兼容性,比如在Linux下使用g++,在macOS下可能也是g++,但Windows的MinGW可能不同。不过模板中可以默认使用g++,用户根据需要自行调整。 最后,用户可能需要一些扩展功能,比如Phony目标、安装规则、测试规则等。但在基础模板中保持简洁,提供注释说明如何扩展会更好。 总结一下,我需要提供一个结构清晰、注释详细、支持C/C++混合编译、具有基本规则的Makefile模板,并在最后给出几个相关问题,帮助用户深入理解Makefile的各个部分。</think>以下是一个通用的 C++ Makefile 模板,适用于大多数中小型项目,支持 C++11/14/17/20 标准、调试/发布模式切换、依赖自动检测、多文件编译和链接: --- ### **Makefile 模板(支持 C++17/20)** ```makefile # 编译器选择 CXX := g++ CXXFLAGS := -Wall -Wextra -Werror -pedantic-errors -std=c++20 -g # 项目结构 SRC_DIR := src OBJ_DIR := build BIN_DIR := bin INCLUDE_DIR := include # 源文件列表(自动扫描) SRCS := $(wildcard $(SRC_DIR)/*.cpp) $(wildcard $(SRC_DIR)/*.c) OBJS := $(patsubst $(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.o,$(SRCS:.c=.o)) # 可执行文件名称 TARGET := $(BIN_DIR)/my_program # 第三方库(如需链接库,取消注释并修改) # LDFLAGS := -L/path/to/lib -lmylib # LIBS := -lm -lpthread # 默认目标 all: $(TARGET) # 编译规则 $(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp @mkdir -p $(dir $@) $(CXX) $(CXXFLAGS) -c $< -o $@ -I$(INCLUDE_DIR) $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c @mkdir -p $(dir $@) $(CC) $(CFLAGS) -c $< -o $@ -I$(INCLUDE_DIR) # 链接规则 $(TARGET): $(OBJS) @mkdir -p $(dir $@) $(CXX) $(CXXFLAGS) $^ -o $@ $(LDFLAGS) $(LIBS) # 清理规则 clean: rm -rf $(OBJ_DIR) $(BIN_DIR) # 重新构建 rebuild: clean all # 依赖检测(自动检测头文件变化) depend: $(SRCS) $(CXX) $(CXXFLAGS) -MM $^ -I$(INCLUDE_DIR) > .depend -include .depend ``` --- ### **目录结构要求** ``` project_root/ ├── Makefile ├── src/ │ └── main.cpp │ └── utils.cpp ├── include/ │ └── utils.h └── build/ (自动生成) └── bin/ (自动生成) ``` --- ### **使用说明** 1. **编译项目** ```bash make ``` 2. **清理构建** ```bash make clean ``` 3. **重新构建** ```bash make rebuild ``` 4. **启用发布模式**(优化性能) 修改 `CXXFLAGS`: ```makefile CXXFLAGS := -Wall -Wextra -O2 -std=c++20 -DNDEBUG ``` 5. **链接第三方库** 取消注释 `LDFLAGS` 和 `LIBS`,例如: ```makefile LDFLAGS := -L/usr/local/lib -lboost_system LIBS := -lpthread ``` --- ### **关键特性** | 功能 | 实现方式 | |------|----------| | 自动扫描源文件 | `wildcard` + `patsubst` | | 支持 C/C++ 混合编译 | 分别处理 `.cpp` 和 `.c` 文件 | | 调试/发布模式切换 | 修改 `CXXFLAGS` 中的 `-g` 和 `-O2` | | 依赖自动检测 | `$(CXX) -MM` 生成 `.depend` 文件 | | 多级目录支持 | `mkdir -p $(dir $@)` 自动创建子目录 | --- ### **扩展建议** 1. **单元测试** 添加 `test` 规则: ```makefile test: $(TARGET) ./$(TARGET) --run_tests ``` 2. **静态代码分析** 添加 `lint` 规则: ```makefile lint: $(SRCS) clang-tidy $^ -- $(CXXFLAGS) ``` 3. **代码格式化** 添加 `format` 规则: ```makefile format: $(SRCS) clang-format -i $^ ``` --- ### **注意事项** 1. **编译器兼容性** - Linux: `g++` - macOS: `clang++`(需修改 `CXX` 为 `clang++`) - Windows: 使用 `MinGW` 或 `MSYS2` 中的 `g++` 2. **依赖文件 `.depend`** - 首次运行 `make` 后会自动生成,后续编译会自动检测头文件变化。 3. **并行编译** 使用 `make -j` 启用多线程编译。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值