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