如何为c++项目编写一个简单的Makefile g++编译自动化【入门教程】

1次阅读
c++kquote>Makefile自动编译c++项目需定义目标、依赖和命令三部分,命令行以Tab开头;支持单文件编译、多文件分离编译链接、编译选项配置及clean清理规则,并可利用自动推导和变量简化维护。

如何为c++项目编写一个简单的Makefile g++编译自动化【入门教程】

用 Makefile 自动编译 C++ 项目,核心是告诉 make 哪些文件变了需要重编、怎么调用 g++ 编译和链接。一个最简可用的 Makefile 只需三部分:目标(target)、依赖(prerequisites)、命令(recipe),且命令行必须以 Tab 开头。

基础结构:从单个 .cpp 文件开始

假设你只有一个源文件 main.cpp,想生成可执行文件 app

app: main.cpp
 g++ -o app main.cpp

保存为 Makefile(注意大小写和无后缀),在终端运行 make 即可生成 app。再次运行 make 时,如果 main.cpp 没变,make 会提示 “up to date”,不会重复编译。

支持多文件:分离编译与链接

当项目有 main.cpputils.cpputils.h 时,应先分别编译为对象文件(.o),再统一链接,避免全量重编:

立即学习C++免费学习笔记(深入)”;

如何为c++项目编写一个简单的Makefile g++编译自动化【入门教程】

Playground AI

AI图片生成和修图

如何为c++项目编写一个简单的Makefile g++编译自动化【入门教程】 108

查看详情 如何为c++项目编写一个简单的Makefile g++编译自动化【入门教程】

  • main.o: main.cpp utils.h —— 表示 main.o 依赖这两个文件,任一修改就重新编译 main.cpp
  • utils.o: utils.cpp utils.h —— 同理
  • app: main.o utils.o —— 最终链接,只在 .o 文件变化时才执行 g++ -o app …

app: main.o utils.o
 g++ -o app main.o utils.o

main.o: main.cpp utils.h
 g++ -c main.cpp

utils.o: utils.cpp utils.h
 g++ -c utils.cpp

加入常用编译选项和清理规则

实际开发中建议启用警告和标准版本,例如:

  • CXX = g++ —— 定义编译器变量,方便后续替换
  • CXXFLAGS = -Wall -std=c++17 -g —— 统一控制编译参数
  • clean: —— 自定义伪目标,用于删除中间文件

CXX = g++
CXXFLAGS = -Wall -std=c++17 -g

app: main.o utils.o
 $(CXX) $(CXXFLAGS) -o app main.o utils.o

main.o: main.cpp utils.h
 $(CXX) $(CXXFLAGS) -c main.cpp

utils.o: utils.cpp utils.h
 $(CXX) $(CXXFLAGS) -c utils.cpp

clean:
 rm -f *.o app

执行 make clean 就能清掉所有 .o 和可执行文件。

小技巧:自动推导与通配符简化

gnu make 能自动推导 .cpp → .o 的规则,所以你可以省略显式的 .o 规则,只写最终目标和清理项:

CXX = g++
CXXFLAGS = -Wall -std=c++17 -g
SRCS = main.cpp utils.cpp
OBjs = $(SRCS:.cpp=.o)
TARGET = app

$(TARGET): $(OBJS)
 $(CXX) $(CXXFLAGS) -o $@ $^

clean:
 rm -f $(OBJS) $(TARGET)

其中 $@ 表示当前目标名,$^ 表示全部依赖文件,$(SRCS:.cpp=.o) 是后缀替换函数。这样增删源文件只需改 SRCS 一行。

text=ZqhQzanResources