下面给你一个实用、由浅入深的 Linux C++ Makefile 写法说明,从最简单到稍复杂的工程配置,适合日常开发。
假设只有 main.cpp:
CXX = g++
CXXFLAGS = -Wall -std=c++17
main: main.cpp
$(CXX) $(CXXFLAGS) main.cpp -o main
clean:
rm -f main
使用:
make
./main
make clean
假设:
main.cpp
foo.cpp
foo.h
CXX = g++
CXXFLAGS = -Wall -std=c++17
TARGET = app
OBJS = main.o foo.o
$(TARGET): $(OBJS)
$(CXX) $(OBJS) -o $(TARGET)
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
clean:
rm -f $(OBJS) $(TARGET)
例如使用 pthread、opencv 或自定义 include/ 目录:
CXX = g++
CXXFLAGS = -Wall -std=c++17 -Iinclude
LDFLAGS = -lpthread -lopencv_core -lopencv_highgui
TARGET = app
SRCS = main.cpp foo.cpp
OBJS = $(SRCS:.cpp=.o)
$(TARGET): $(OBJS)
$(CXX) $(OBJS) -o $(TARGET) $(LDFLAGS)
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
clean:
rm -f $(OBJS) $(TARGET)
CXX = g++
CXXFLAGS = -Wall -std=c++17
TARGET = app
SRCS = $(wildcard src/*.cpp)
OBJS = $(SRCS:.cpp=.o)
$(TARGET): $(OBJS)
$(CXX) $(OBJS) -o $@
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
clean:
rm -f $(OBJS) $(TARGET)
CXX = g++
TARGET = app
ifeq ($(mode), debug)
CXXFLAGS = -g -Wall -std=c++17
else
CXXFLAGS = -O2 -Wall -std=c++17
endif
OBJS = main.o foo.o
$(TARGET): $(OBJS)
$(CXX) $(OBJS) -o $@
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
clean:
rm -f $(OBJS) $(TARGET)
使用:
make mode=debug
make mode=release
| 变量 | 含义 |
|---|---|
CXX |
C++ 编译器 |
CXXFLAGS |
编译参数 |
LDFLAGS |
链接参数 |
$@ |
目标文件 |
$< |
第一个依赖 |
$^ |
所有依赖 |
如果你愿意,可以告诉我:
我可以直接帮你写一个可用的完整 Makefile。