温馨提示×

Linux C++配置Makefile怎么写

小樊
39
2026-09-11 00:55:38
栏目: 编程语言

下面给你一个从最基础到较规范的 Linux C++ Makefile 写法示例,适合新手到中等复杂度项目。


一、最基础的 Makefile(单个文件)

假设只有一个文件 main.cpp

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

clean:
	rm -f main

使用:

make
./main
make clean

二、多文件 C++ 项目(推荐)

目录结构:

.
├── main.cpp
├── foo.cpp
├── foo.h
└── Makefile

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 / include)

.
├── 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)

六、常见注意点

  1. Makefile 缩进必须用 Tab,不是空格
  2. CXXFLAGS 常用:
    -Wall -Wextra
    -std=c++17
    -O2 / -g
    -I路径
    
  3. 调试版本:
    debug: CXXFLAGS += -g
    debug: $(TARGET)
    

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

  • 你的 项目结构
  • 是否用 第三方库(如 OpenCV / Boost / pthread)
  • 是否需要 CMake 对比

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

0