makefile 完整实例
时间: 2024-12-10 15:46:29 浏览: 16
Makefile是一个强大的自动化构建工具,在软件开发中用于管理编译、链接、打包等步骤。这里给出一个相对完整的Makefile实例,假设我们有一个C++项目,包含头文件(`.h`)、源文件(`.cpp`),以及一个主程序`main.cpp`:
```makefile
# 定义全局变量
CC := g++
CFLAGS := -std=c++17 # 编译标准
LDFLAGS := # 连接器标志
OBJECTS := main.o utils.o # 源文件生成的目标文件名
EXECUTABLE := my_project # 输出可执行文件名
# 设置Debug模式的编译选项
DEBUG_CFLAGS := -g -DDEBUG -Wall
DEBUG_LDFLAGS :=
# 设置Release模式的编译选项
RELEASE_CFLAGS := -O3 -DNDEBUG -Wall
RELEASE_LDFLAGS :=
# Debug模式下目标的依赖关系和生成规则
debug: $(EXECUTABLE)_debug
$(CC) $(DEBUG_CFLAGS) $(DEBUG_LDFLAGS) $(OBJECTS) -o $(EXECUTABLE)_debug
# Release模式下目标的依赖关系和生成规则
release: $(EXECUTABLE)_release
$(CC) $(RELEASE_CFLAGS) $(RELEASE_LDFLAGS) $(OBJECTS) -o $(EXECUTABLE)_release
# 普通编译规则(默认为Release模式)
default: release
# 单个源文件的编译规则
%.o: %.cpp %.h
$(CC) $(CFLAGS) -c $< -o $@
# 清理所有编译后的文件
.PHONY: clean
clean:
rm -f $(OBJECTS) $(EXECUTABLE)*
# 打包规则
.PHONY: package
package: release
zip -r my_project.zip $(EXECUTABLE)_release
# 当前目录作为Makefile的根目录
MAKEFILE_DIR := $(shell pwd)
ifeq ($(wildcard $(MAKEFILE_DIR)/Makefile),)
@echo "No Makefile found in the current directory."
endif
```
在这个Makefile中,你可以通过`make debug`编译出调试版的可执行文件,`make release`编译出优化版。`clean`命令用于清除所有编译产生的中间文件。`package`命令可以将生成的release版本打包成zip文件。
阅读全文