編譯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  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章