温馨提示×

ubuntu c++如何写 Makefile

小樊
47
2026-09-08 09:52:26
栏目: 编程语言

在 Ubuntu 上用 C++ 写 Makefile,核心思路是:定义目标(target)、依赖(prerequisites)和命令(recipe)。下面从最基础到稍规范一点给你讲。


一、最简单的 C++ Makefile 示例

假设有:

main.cpp
foo.cpp
foo.h

最简单的 Makefile

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

clean:
	rm -f app

使用:

make
./app
make clean

⚠️ 注意:命令行前必须是 Tab,不是空格


二、分离编译(推荐写法)

更标准、可维护:

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

TARGET = app
OBJS = main.o foo.o

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

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

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

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

三、自动推导(简化版)

Make 可以自动推导 .o 规则:

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

TARGET = app
OBJS = main.o foo.o

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

clean:
	rm -f $(TARGET) $(OBJS)
  • $@:目标名
  • $^:所有依赖

四、多文件项目示例(常见结构)

project/
├── src/
│   ├── main.cpp
│   └── foo.cpp
├── include/
│   └── foo.h
└── Makefile
CXX = g++
CXXFLAGS = -Wall -std=c++17 -Iinclude

TARGET = app
SRCS = src/main.cpp src/foo.cpp
OBJS = $(SRCS:.cpp=.o)

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

%.o: %.cpp
	$(CXX) $(CXXFLAGS) -c $< -o $@

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

五、调试与常用命令

make          # 编译
make clean    # 清理
make -j4      # 并行编译
make VERBOSE=1

六、常见错误

❌ 使用空格而不是 Tab
❌ 头文件没加 -I 路径
❌ 修改头文件后没写依赖关系


如果你愿意,可以告诉我:

  • 你的 项目结构
  • 是否用 CMake / 多目录 / 第三方库(如 OpenCV、Boost)

我可以直接帮你写一个 可用的 Makefile

0