数据库连接池DBPool分析(五):Makefile

本文介绍了如何在数据库连接池项目中运用Makefile进行编译,重点关注了静态库和动态库的生成,以及与gtest的集成。在编译过程中,需要注意gtest库的链接顺序。此外,文章还分享了一个‘安静模式’,通过修改Makefile实现简洁的编译输出信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Makefile的设计思想是编译MysqlObj和RedisObj,并将它们链接成静态库和动态库,供外部调用。这里是供gtest来调用。这里参考了leveldb的Makefile的设计思想。

这里有个需要小心的地方,因为用到了gtest,所以编译的时候需要链接-lgtest,-lgtest必须要放在-lpthread前面,否则编译会错误

安静模式

还有一个Makefile的magic,我把它称为安静模式,这是我公司的同事做的,我把它借鉴过来了,这个安静模式的作用就是让make打印出来的编译信息简化,
比如:

g++ -std=c++0x -O2 -g -fPIC -c -o util/mysql_connection_pool.o util/mysql_connection_pool.cpp
g++ -std=c++0x -O2 -g -fPIC -c -o util/mysql_obj.o util/mysql_obj.cpp
g++ -std=c++0x -O2 -g -fPIC -c -o util/redis_obj.o util/redis_obj.cpp

现在变成了:

CXX util/mysql_connection_pool.o
CXX util/mysql_obj.o
CXX util/redis_obj.o

这样就好看多了。

安静模式的核心代码是:

# 安静模式的核心代码
ifeq ("$(origin V)", "command line")
   BUILD_VERBOSE = $(V)
endif
ifndef BUILD_VERBOSE
   BUILD_VERBOSE = 0
endif

ifeq ($(BUILD_VERBOSE),0)
    QUIET_CC        = @echo '   ' CC $@;
    QUIET_CXX       = @echo '   ' CXX $@;
endif

然后在需要使用$(CXX)的地方用$(QUIET_CXX)$(CXX)替代。



# # Use 'make V=1' to see the full commands
#使用安静模式可以不看gcc,g++的参数
CC := gcc 
CXX := g++
AR := ar

LIBRARY := libdbpool.a
SHARED := libdbpool.so

INCLUDE := -I/usr/local/include
# -lgtest 一定要放在 -lpthread 前面
LIBS := -L/usr/local/lib -L/usr/lib64/mysql -lgtest -lpthread -lmysqlclient -lhiredis

CFLAGS := 
CPPFLAGS := -std=c++0x -O2 -g -fPIC
SHARED_LDFLAGS := -shared -fPIC -Wl,-soname,${SHARED}

LIBCFILES := $(wildcard ./util/*.c)
LIBCPPFILES := $(wildcard ./util/*.cc ./util/*.cpp)
LIBOBJECTS := $(addsuffix .o, $(basename $(LIBCFILES)) $(basename $(LIBCPPFILES)))

CFILES := $(wildcard ./gtest/*.c)
CPPFILES := $(wildcard ./gtest/*.cc ./gtest/*.cpp)
OBJECTS := $(addsuffix .o, $(basename $(CFILES)) $(basename $(CPPFILES)))
TARGETS := $(basename $(OBJECTS))

# 安静模式的核心代码
ifeq ("$(origin V)", "command line")
   BUILD_VERBOSE = $(V)
endif
ifndef BUILD_VERBOSE
   BUILD_VERBOSE = 0
endif

ifeq ($(BUILD_VERBOSE),0)
    QUIET_CC        = @echo '   ' CC $@;
    QUIET_CXX       = @echo '   ' CXX $@;
endif

all: $(LIBRARY) $(SHARED) 
    @echo "--------------------------make successful-----------------------"

check: all $(TARGETS)

$(LIBRARY): $(LIBOBJECTS)
    -rm -rf $@
    $(AR) crv $@ $(LIBOBJECTS)

$(SHARED):
    $(QUIET_CXX)$(CXX) $(SHARED_LDFLAGS) -o $@ $(LIBOBJECTS) $(LIBS)

$(TARGETS): $(OBJECTS)
    $(QUIET_CXX)$(CXX) -o $@ $(addsuffix .o, $@) $(LIBS) -L. -ldbpool

#下面的Makefile其实只是为了使用安静模式而已,如果将下面的代码去掉的话也能编译成功,因为默认的make规则将被执行
./util/%.o:./util/%.c
    $(QUIET_CC)$(CC) $(CFLAGS) -c -o $@ $<

./util/%.o:./util/%.cc
    $(QUIET_CXX)$(CXX) $(CPPFLAGS) -c -o $@ $<

./util/%.o:./util/%.cpp 
    $(QUIET_CXX)$(CXX) $(CPPFLAGS) -c -o $@ $<

./gtest/%.o:./gtest/%.c
    $(QUIET_CC)$(CC) $(CFLAGS) -c -o $@ $<

./gtest/%.o:./gtest/%.cc
    $(QUIET_CXX)$(CXX) $(CPPFLAGS) -c -o $@ $<

./gtest/%.o:./gtest/%.cpp 
    $(QUIET_CXX)$(CXX) $(CPPFLAGS) -c -o $@ $<

.PHONY:clean

clean:
    -rm -f ./util/*.o ./gtest/*.o $(LIBRARY) $(SHARED) $(TARGETS)
    @echo "--------------------------make clean-----------------------"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值