编译protobuf静态库依赖顺序问题

在项目中要加入protobuf协议支持,在编译成功生成程序包动态库后,发现启动运行报错 未定义的protobuf符号xxx等等,用ldd查看so文件,发现确实提示了未找到。
大致的makefile文件如下:

CXX=g++
CFLAGS= -g -Wall -O3 -pipe
INCLUDE= -I. -I./pb/
LIB= -lpthread -pthread
LIB+=$(THIRD)/protobuf-2.6.1/lib/libprotobuf.a	//pb官方的静态库
LIB+=$(PROTO)/libindex_proto.a 		//自定义的pb消息结构静态库
TARGET=test.out
OBJ	= test.cpp 
$(TARGET): $(OBJ)
	$(CXX) $(CFLAGS) $(INCLUDE) -o $@ $^ $(LIB) -fPIC  
%.o: %.cpp
	$(CXX) $(CFLAGS) $(INCLUDE) -c -fPIC -o $@ $<
%.o: %.c
	$(CXX) $(CFLAGS) $(INCLUDE) -c -fPIC -o $@ $<
clean: 
	rm -rf *.o ./pb/*.o  *.out $(TARGET) 

这样编译的话,会出现protobuf中很多符号找不到,经查看别人例子,发现时引入lib库的顺序导致的问题,以上makefile中将,LIB库改为自定义的消息静态库在前,官方库在后就可以,即:

LIB+=$(PROTO)/libindex_proto.a 		//自定义的pb消息结构静态库
LIB+=$(THIRD)/protobuf-2.6.1/lib/libprotobuf.a	//pb自身的静态库

原因是:gcc要求被依赖的库需要放在后面。
除此之外,还有另一种方式可解决:-Wl,–start-group ${LIB} -Wl,–end-group
即将上面生成目标文件语句修改为:

$(TARGET): $(OBJ)
	$(CXX) $(CFLAGS) $(INCLUDE) -o $@ $^ -Wl,--start-group ${LIB} -Wl,--end-group -fPIC  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值