Makefile——编译和链接C++项目

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++

CCLINK变量都设置为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文件)。这有助于保持工作目录的整洁,并允许从头开始重新构建项目。

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值