在项目中要加入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