在 Ubuntu 上用 C++ 写 Makefile,核心思路是:定义目标(target)、依赖(prerequisites)和命令(recipe)。下面从最基础到稍规范一点给你讲。
假设有:
main.cpp
foo.cpp
foo.h
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 路径
❌ 修改头文件后没写依赖关系
如果你愿意,可以告诉我:
我可以直接帮你写一个 可用的 Makefile。