PROJ = ../../bin/tracker
OBJS = $(patsubst %.cpp, %.o, $(wildcard ../01_common/*.cpp *.cpp))
CC = g++
LINK = g++
RM = rm -rf
CFLAGS = -c -Wall \
-I/usr/include/acl-lib/acl_cpp \
`mysql_config --cflags` \
-I../01_common
LIBS = -pthread -lacl_all `mysql_config --libs`
all: $(PROJ)
$(PROJ): $(OBJS)
$(LINK) $^ $(LIBS) -o $@
.cpp.o:
$(CC) $(CFLAGS) $^ -o $@
clean:
$(RM) $(PROJ) $(OBJS)
这个Makefile是一个用于编译和链接C++项目的脚本,它定义了一系列规则来自动化编译和构建过程。下面是对每一行或每一部分的逐行解释:
变量定义
PROJ = ../../bin/tracker
PROJ
变量定义了最终生成的可执行文件的路径和名称,这里是../../bin/tracker
。
OBJS = $(patsubst %.cpp, %.o, $(wildcard ../01_common/*.cpp *.cpp))
OBJS
变量通过patsubst
函数和wildcard
函数动态生成。wildcard
函数查找所有匹配../01_common/*.cpp
和当前目录下*.cpp
的源文件,然后patsubst
函数将这些源文件的扩展名从.cpp
更改为.o
,以表示编译后的目标文件。
CC = g++
LINK = g++
CC
和LINK
变量都设置为g++
,表明编译器和链接器都是GNU C++编译器。
RM = rm -rf
RM
变量定义了用于删除文件和目录的命令,这里是rm -rf
,表示强制删除文件或目录,不会有任何提示。
CFLAGS = -c -Wall \
-I/usr/include/acl-lib/acl_cpp \
`mysql_config --cflags` \
-I../01_common
CFLAGS
变量定义了编译时使用的标志。包括-c
(表示编译但不链接),-Wall
(显示所有警告),-I
(指定额外的头文件搜索路径),以及通过mysql_config --cflags
自动获取的MySQL C API的编译标志。
LIBS = -pthread -lacl_all `mysql_config --libs`
LIBS
变量定义了链接时需要的库和标志。包括-pthread
(启用POSIX线程支持),-lacl_all
(链接ACL库),以及通过mysql_config --libs
自动获取的MySQL C API的链接标志。
规则定义
all: $(PROJ)
这是Makefile的默认目标,即当直接运行make
命令时,会尝试构建$(PROJ)
变量指定的目标(即../../bin/tracker
)。
$(PROJ): $(OBJS)
$(LINK) $^ $(LIBS) -o $@
这是一个规则,它指定了如何构建$(PROJ)
。$(OBJS)
是依赖项,表示所有.o
文件。$^
代表所有的依赖项(即.o
文件),$@
代表目标(即$(PROJ)
),$(LINK)
是链接器(这里是g++
),$(LIBS)
是链接时需要的库和标志。
.cpp.o:
$(CC) $(CFLAGS) $^ -o $@
这是一个隐式规则,它告诉make如何将.cpp
文件编译成.o
文件。$^
代表所有的依赖项(在这里,由于这是一个隐式规则,它实际上指的是.cpp
文件),$@
代表目标(即.o
文件)。注意,这里的$^
在隐式规则中并不完全必要,因为make知道如何根据目标文件名推断出源文件名。
清理规则
clean:
$(RM) $(PROJ) $(OBJS)
clean
是一个自定义目标,用于删除构建过程中生成的所有文件(包括可执行文件和.o
文件)。这有助于保持工作目录的整洁,并允许从头开始重新构建项目。