记录一下自己编写makefile链接多个静态库遇到的坑makefile如下,编译得到libmrpc.a,mrpc库依赖-lmuduo_base -lmuduo_net -lpthread -lprotobuf
PREFIX=./output
LIB = libmrpc.a
# .cc文件
LIB_SRC=$(wildcard ./*.cc)
LIB_HEADER=$(patsubst %.cc,%.h,$(LIB_SRC))
LIB_OBJ=$(patsubst %.cc,%.o,$(LIB_SRC))
# proto文件
PROTO=$(wildcard ./*.proto)
# proto.cc
PROTO_SRC=$(patsubst %.proto,%.pb.cc,$(PROTO))
# pb.h
PROTO_HEADER=$(patsubst %.proto,%.pb.h,$(PROTO))
# .o文件
PROTO_OBJ=$(patsubst %.cc,%.o,$(PROTO_SRC))
# 头文件
PUB_INC =$(LIB_HEADER) $(PROTO) $(PROTO_HEADER)
CXX = g++
CXX_FLAGS = -g -pipe -W -Wall -fPIC -D_GUN_SOURCE
# INCLUDE_PATH = -I. -I$(MUDUO_DIR)/include/
LDFLGAS = -lmuduo_base -lmuduo_net -lpthread -lprotobuf
all: build
build: $(LIB)
@echo
@echo 'Build succeed, run "make install" to install mrpc to "'$(PREFIX)'".'
# 链接成动态库
$(LIB): $(LIB_OBJ) $(PROTO_OBJ)
# $(CXX) -shared $(LIB_OBJ) $(PROTO_OBJ) -o $@ $(INCLUDE_PATH) $(LDFLGAS)
ar crs $@ $(LIB_OBJ) $(PROTO_OBJ)
$(LIB_OBJ): $(PROTO_HEADER)
$(PROTO_OBJ): $(PROTO_HEADER)
%.pb.cc %.pb.h: %.proto
protoc --proto_path=. --cpp_out=. $<
%.o: %.cc
$(CXX) $(CXX_FLAGS) -c $< -o $@ $(LDFLGAS)
clean:
rm -f $(LIB) $(LIB_OBJ) $(PROTO_OBJ)
install: $(LIB)
mkdir -p $(PREFIX)/include
cp -r $(PUB_INC) $(PREFIX)/include/
mkdir -p $(PREFIX)/lib
cp -r $(LIB) $(PREFIX)/lib/
@echo
@echo 'Install succeed, target directory is "'$(PREFIX)'".'
编译成功后,编写测试程序测试mrpc库,测试程序的makefile如下
all: caller service
MRPC_DIR = ../output
INCLUDE_PATH = -I$(MRPC_DIR)/include/
# LIB = -L$(MRPC_DIR)/lib/ -lmuduo_base -lmuduo_net -lpthread -lprotobuf -lmrpc
# LIB = -L$(MRPC_DIR)/lib/ -lmuduo_base -lmuduo_net -lmrpc -lprotobuf -lmuduo_base -lmuduo_net -lpthread
LIB = -L$(MRPC_DIR)/lib/ -lpthread -lmuduo_base -lmuduo_net -lmrpc -lprotobuf -lmuduo_base -lmuduo_net -lpthread
CXX = g++
CXX_FLAGS = -g -pipe -W -Wall
caller: caller.cc user.pb.cc
$(CXX) $(CXX_FLAGS) $^ -o $@ $(INCLUDE_PATH) $(LIB)
service: service.cc user.pb.cc
$(CXX) $(CXX_FLAGS) $^ -o $@ $(INCLUDE_PATH) $(LIB)
user.pb.cc: user.proto
protoc --proto_path=. --cpp_out=. user.proto
一开始测试makefile链接的库是如下格式的,然后出现muduo库大量未定义的函数,刚开始是以为muduo库没安装在系统默认路径下然后找不到,然后重新将muduo库拷贝到/usr/local/lib/目录下,编译测试程序还是出现大量未定义的函数。去网上搜有的人说是muduo_base,muduo_net之间有依赖关系,需要调整链接的次序,我调整之后依然没用,中间尝试了很多办法,还以为是自己编译的mrpc库有问题。
# LIB = -L$(MRPC_DIR)/lib/ -lmuduo_base -lmuduo_net -lpthread -lprotobuf -lmrpc
然后看见有人说编译链接多个静态库的坑,然后我将muduo_base和muduo_net链接两次,写成如下格式,发现pthread链接又有问题
# LIB = -L$(MRPC_DIR)/lib/ -lmuduo_base -lmuduo_net -lmrpc -lprotobuf -lmuduo_base -lmuduo_net -lpthread
然后又将 pthread也链接两次,神奇的是居然编译通了,真的玄学
LIB = -L$(MRPC_DIR)/lib/ -lpthread -lmuduo_base -lmuduo_net -lmrpc -lprotobuf -lmuduo_base -lmuduo_net -lpthread