下面给你一个从最基础到较规范的 Linux C++ Makefile 写法示例,适合新手到中等复杂度项目。
假设只有一个文件 main.cpp:
main: main.cpp
g++ -o main main.cpp
clean:
rm -f main
使用:
make
./main
make clean
目录结构:
.
├── main.cpp
├── foo.cpp
├── foo.h
└── Makefile
CXX = g++
CXXFLAGS = -Wall -Wextra -std=c++17 -O2
TARGET = app
OBJS = main.o foo.o
$(TARGET): $(OBJS)
$(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS)
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
clean:
rm -f $(OBJS) $(TARGET)
使用:
make
./app
make clean
如果 .h 改了也要重新编译:
CXX = g++
CXXFLAGS = -Wall -std=c++17
TARGET = app
SRCS = main.cpp foo.cpp
OBJS = $(SRCS:.cpp=.o)
$(TARGET): $(OBJS)
$(CXX) $(CXXFLAGS) -o $@ $^
%.o: %.cpp foo.h
$(CXX) $(CXXFLAGS) -c $<
clean:
rm -f $(OBJS) $(TARGET)
CXX = g++
CXXFLAGS = -Wall -std=c++17
TARGET = app
SRCS = $(wildcard *.cpp)
OBJS = $(SRCS:.cpp=.o)
all: $(TARGET)
$(TARGET): $(OBJS)
$(CXX) $(CXXFLAGS) -o $@ $^
%.o: %.cpp
$(CXX) $(CXXFLAGS) -MMD -MP -c $< -o $@
-include $(OBJS:.o=.d)
clean:
rm -f $(OBJS) $(OBJS:.o=.d) $(TARGET)
✅ 改 .h 会自动重新编译对应 .cpp
.
├── src
│ ├── main.cpp
│ └── foo.cpp
├── include
│ └── foo.h
└── Makefile
CXX = g++
CXXFLAGS = -Wall -std=c++17 -Iinclude
TARGET = app
SRCS = $(wildcard src/*.cpp)
OBJS = $(SRCS:.cpp=.o)
$(TARGET): $(OBJS)
$(CXX) $(CXXFLAGS) -o $@ $^
src/%.o: src/%.cpp
$(CXX) $(CXXFLAGS) -MMD -MP -c $< -o $@
-include $(OBJS:.o=.d)
clean:
rm -f $(OBJS) $(OBJS:.o=.d) $(TARGET)
CXXFLAGS 常用:-Wall -Wextra
-std=c++17
-O2 / -g
-I路径
debug: CXXFLAGS += -g
debug: $(TARGET)
如果你愿意,可以告诉我:
我可以直接帮你写一份可直接用的 Makefile。