单目标Makefile
CXX=g++ #定义编译工具
TARGET=test #定义编译目标
INCLUDES= #定义依赖的头文件
#COMMSRCS=*.cpp
COMMSRCS=$(wildcard ./src/*.cpp)
SRCS=main.cpp \
COMMSRCS
OBJECTS=$(SRCS:.cpp=.o)
LDFLAGS= #定义链接选项
LIBS= #定义依赖的动态库
CXXFLAGS= -g #定义编译选项
OUTPUT= #定义目标输出目录
.PHONY : all
all:$(TARGET)
$(TARGET):$(OBJECTS)
$(CXX) $^ $(LIBS) $(CXXFLAGS) $(LDFLAGS) -o $(OUTPUT)/$@
.PHONY : clean
clean:
rm -rf $(OUTPUT)/$(TARGET) $(OBJECT)
动态链接库Makefile
CXX=g++ #定义编译工具
#TARGET=test #定义编译目标
TARGET=libtest.so #定义编译目标
INCLUDES=./include/ #定义依赖的头文件
COMMSRCS=$(wildcard ./src/*.cpp)
SRCS=$(COMMSRCS)
OBJECTS=$(SRCS:.cpp=.o)
LDFLAGS= #定义链接选项
#LIBS= -L/usr/local/lib/ -lpthread -lrt -ldl -lrdkafka -lrdkafka++ #定义依赖的动态库
LIBS= -lpthread -lrt -ldl -lrdkafka -lrdkafka++ #定义依赖的动态库
CXXFLAGS= -g -std=c++11 -fPIC -shared #定义编译选项
OUTPUT= #定义目标输出目录
.PHONY : all
all:$(TARGET)
$(TARGET):$(OBJECTS)
$(CXX) $(CXXFLAGS) $^ $(LDFLAGS) $(LIBS) -o $@
.PHONY : clean
clean:
rm -rf $(TARGET) $(OBJECTS)
递归Makefile
方法一:
subsystem:
cd subdir && $(MAKE)
方法二:
subsystem:
$(MAKE) -C subdir
eg:
#main
.PHONY : test
test:
@echo "main makelevel = $(MAKELEVEL)"
@$(MAKE) -C subdir1 test
@$(MAKE) -C subdir2 test
#subdir1
.PHONY : test
test:
@echo "subdir1 makedevel = $(MAKELEVEL)"
@$(MAKE) -C subdir11 test
#subdir11
.PHONY : test
test:
@echo "subdir11 makedevel = $(MAKELEVEL)"
#subdir2
.PHONY : test
test:
@echo "subdir2 makedevel = $(MAKELEVEL)"
关键变量
Name | Note |
---|---|
MAKE | Makefile文件中MAKE等价于make |
MAKELEVEL | 递归调用深度 |
CURDIR | 执行make命令的当前目录的绝对路径 |
$@ | 目标文件 |
$^ | 所有依赖的文件 |
Make命令
make命令指定路径:${DIRName}/configure && make -C ${DIRName} && make -C install
语法
日志打印
$(warning $(XXX)) 打印变量的值