下面用一个由浅入深的方式,给你讲 Linux 下 C++ 项目的 Makefile 怎么写,从最简单到稍微规范一点的工程写法。
假设有:
// main.cpp
#include <iostream>
int main() {
std::cout << "Hello Makefile" << std::endl;
}
main: main.cpp
g++ -std=c++11 -o main main.cpp
clean:
rm -f main
make
./main
make clean
CXX = g++
CXXFLAGS = -std=c++11 -Wall -O2
main: main.cpp
$(CXX) $(CXXFLAGS) -o main main.cpp
clean:
rm -f main
.
├── main.cpp
├── foo.cpp
├── foo.h
└── Makefile
CXX = g++
CXXFLAGS = -std=c++11 -Wall
TARGET = app
OBJS = main.o foo.o
$(TARGET): $(OBJS)
$(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS)
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
clean:
rm -f $(TARGET) $(OBJS)
$<:第一个依赖(源文件)$@:目标文件%.o: %.cpp:通用规则,自动编译所有 cppCXX = g++
CXXFLAGS = -std=c++17 -Wall -g
TARGET = app
SRCS = main.cpp foo.cpp
OBJS = $(SRCS:.cpp=.o)
$(TARGET): $(OBJS)
$(CXX) $(CXXFLAGS) -o $@ $^
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
clean:
rm -f $(TARGET) $(OBJS)
CXX = g++
CXXFLAGS = -std=c++17 -Wall -Iinclude
LDFLAGS = -lpthread
TARGET = app
SRCS = main.cpp foo.cpp
OBJS = $(SRCS:.cpp=.o)
$(TARGET): $(OBJS)
$(CXX) -o $@ $^ $(LDFLAGS)
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
clean:
rm -f $(TARGET) $(OBJS)
CXX = g++
CXXFLAGS = -std=c++17 -Wall
TARGET = app
SRCS = $(wildcard *.cpp)
OBJS = $(SRCS:.cpp=.o)
$(TARGET): $(OBJS)
$(CXX) -o $@ $^
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
clean:
rm -f $(TARGET) $(OBJS)
❌ Makefile 命令前用空格 ✅ 必须用 Tab
❌ 忘记加 -c
✅ 编译 .o 时必须 -c
| 场景 | 推荐 |
|---|---|
| 小型练习 | Makefile |
| 多平台 / 大型项目 | CMake |
| 需要自动依赖管理 | CMake |
如果你愿意,我可以:
直接把你的项目结构贴出来就行。