温馨提示×

linux c++配置如何写makefile

小樊
38
2026-10-13 22:05:18
栏目: 编程语言

下面用一个由浅入深的方式,给你讲 Linux 下 C++ 项目的 Makefile 怎么写,从最简单到稍微规范一点的工程写法。


一、最简单的 Makefile(单文件)

假设有:

// main.cpp
#include <iostream>
int main() {
    std::cout << "Hello Makefile" << std::endl;
}

Makefile(注意:命令前是 Tab,不是空格)

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

三、多文件 C++ 项目(最常见)

目录结构

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

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:通用规则,自动编译所有 cpp

四、使用变量(更规范)

CXX = 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)

五、带头文件目录 / 第三方库(如 pthread)

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

场景 推荐
小型练习 Makefile
多平台 / 大型项目 CMake
需要自动依赖管理 CMake

如果你愿意,我可以:

  • 给你写一个 完整示例工程
  • 帮你把现有代码改成 Makefile
  • 教你 CMake 对比 Makefile

直接把你的项目结构贴出来就行。

0 踩