下面从最基础到较规范给你讲一下 Linux 下 C++ 的 Makefile 写法,适合入门到日常使用。
假设有文件:
main.cpp
main: main.cpp
g++ -o main main.cpp
clean:
rm -f main
make
./main
make clean
⚠️ 注意:命令行前面必须是 Tab,不是空格
假设结构:
main.cpp
foo.cpp
foo.h
CXX = g++
CXXFLAGS = -Wall -std=c++11
main: main.o foo.o
$(CXX) $(CXXFLAGS) -o main main.o foo.o
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 main *.o
Make 可以自动推导 .o 文件:
CXX = g++
CXXFLAGS = -Wall -std=c++11
main: main.o foo.o
$(CXX) $(CXXFLAGS) -o main main.o foo.o
clean:
rm -f main *.o
CXX = g++
CXXFLAGS = -Wall -std=c++17 -O2
TARGET = app
OBJS = main.o foo.o
$(TARGET): $(OBJS)
$(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS)
clean:
rm -f $(TARGET) $(OBJS)
CXX = g++
CXXFLAGS = -Wall -std=c++17
TARGET = app
SRCS = $(wildcard *.cpp)
OBJS = $(SRCS:.cpp=.o)
$(TARGET): $(OBJS)
$(CXX) $(CXXFLAGS) -o $@ $^
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $<
clean:
rm -f $(TARGET) $(OBJS)
CXX = g++
CXXFLAGS = -Wall -std=c++17
TARGET = app
OBJS = main.o foo.o
$(TARGET): $(OBJS)
$(CXX) -o $@ $^
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $< -MMD
-include $(OBJS:.o=.d)
clean:
rm -f $(TARGET) $(OBJS) *.d
✅ Tab 缩进
✅ 修改头文件要重新编译
✅ 多文件一定要链接 .o
✅ 推荐加 -Wall -Wextra
我可以:
你可以直接把你的文件结构发我。