我要讓靜態XGBoost庫,但我在這個簡單的任務失敗。使靜態庫,而不是動態
首先,我只是試圖採取所有.o
文件,並通過ar rcs wrapper/libxgboostwrapper.a ./*
使靜態庫,但我失敗了。事實上,當我製作其他依賴於XGBoost的東西時,它會失敗並出現錯誤:undefined reference to XGBoosterFree
。
此函數在包裝部分中定義,並且沒有文件wrapper/libxgboostwrapper.o
。因此,爲了使靜態庫首先,我們要創建wrapper/libxgboostwrapper.o
;其次,運行在所有需要的文件.o
ar rcs
。
如何我修改Makefile文件。
首先,我稍微改變了一些變量的名字。
ifeq ($(OS), Windows_NT) LIBRABIT = subtree/rabit/lib/librabit_empty.a DLIB = wrapper/xgboost_wrapper.dll SLIB = wrapper/xgboost_wrapper.lib else LIBRABIT = subtree/rabit/lib/librabit.a DLIB = wrapper/libxgboostwrapper.so SLIB = wrapper/libxgboostwrapper.a endif
增加了新的變量。
WRAP = wrapper/libxgboostwrapper.o
修改後的目標。
TARGET = $(BIN) $(OBJ) $(DLIB) $(SLIB) $(WRAP)
添加依存關係
wrapper/libxgboostwrapper.o
完全一樣的wrapper/libxgboostwrapper.so
。wrapper/libxgboostwrapper.o: wrapper/xgboost_wrapper.cpp src/utils/*.h src/*.h src/learner/*.hpp src/learner/*.h updater.o gbm.o io.o $(LIBRABIT) $(LIBDMLC)
一切都爲
$(BIN)
,$(MOCKBIN)
,$(DLIB)
,我試圖編譯完成後(或做什麼呢?)我$(WRAP)
。$(WRAP) : $(CXX) $(CFLAGS) -fPIC -o [email protected] $(filter %.cpp %.o %.c %.a %.cc, $^) $(LDFLAGS) $(DLLFLAGS)
所有這些東西后,終於我在做
wrapper/libxgboostwrapper.a
。$(SLIB) : updater.o gbm.o io.o $(WRAP) $(LIBRABIT) $(LIBDMLC) ar rcs [email protected] $^
它無法在與像錯誤的步驟5:
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 10
我在做什麼錯?對我來說,似乎編譯.so
和.o
文件shuld是相同的,除非不使用標誌-shared
。
非常感謝!不幸的是,我解決了我的問題,但沒有答案:) 首先,我生成了目標文件wrapper.o,然後將所有需要的目標文件添加到一個庫中。 – Jihad