下面给你一个从简单到常用的 Linux C++ Makefile 写法示例,适合新手到中等规模项目。
假设:
main.cppappapp: main.cpp
g++ -std=c++17 -O2 -o app main.cpp
clean:
rm -f app
使用:
make
./app
make clean
目录结构:
.
├── main.cpp
├── foo.cpp
├── foo.h
└── Makefile
CXX = g++
CXXFLAGS = -std=c++17 -Wall -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
make clean
如果 .h 改了也能重新编译:
CXX = g++
CXXFLAGS = -std=c++17 -Wall -O2
TARGET = app
SRCS = main.cpp foo.cpp
OBJS = $(SRCS:.cpp=.o)
$(TARGET): $(OBJS)
$(CXX) $(CXXFLAGS) -o $@ $^
%.o: %.cpp %.h
$(CXX) $(CXXFLAGS) -c $< -o $@
clean:
rm -f $(OBJS) $(TARGET)
CXX = g++
CXXFLAGS = -std=c++17 -Wall -Iinclude
LDFLAGS =
LIBS = -lpthread
SRC_DIR = src
OBJ_DIR = obj
SRCS = $(wildcard $(SRC_DIR)/*.cpp)
OBJS = $(patsubst $(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.o,$(SRCS))
TARGET = app
$(TARGET): $(OBJS)
$(CXX) $(CXXFLAGS) $^ -o $@ $(LDFLAGS) $(LIBS)
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
@mkdir -p $(OBJ_DIR)
$(CXX) $(CXXFLAGS) -c $< -o $@
clean:
rm -rf $(OBJ_DIR) $(TARGET)
目录结构:
.
├── include
│ └── foo.h
├── src
│ ├── main.cpp
│ └── foo.cpp
└── Makefile
| 选项 | 含义 |
|---|---|
-std=c++17 |
C++ 标准 |
-Wall |
显示警告 |
-O2 |
优化 |
-Iinclude |
头文件路径 |
-lpthread |
链接线程库 |
debug: CXXFLAGS += -g
debug: $(TARGET)
使用:
make debug
如果你愿意,可以告诉我:
我可以直接帮你写一份可用的 Makefile。