链接多个静态库出现大量undefined reference to...

记录一下自己编写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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值