2015-10-25 68 views
0

我要讓靜態XGBoost庫,但我在這個簡單的任務失敗。使靜態庫,而不是動態

首先,我只是試圖採取所有.o文件,並通過ar rcs wrapper/libxgboostwrapper.a ./*使靜態庫,但我失敗了。事實上,當我製作其他依賴於XGBoost的東西時,它會失敗並出現錯誤:undefined reference to XGBoosterFree

此函數在包裝部分中定義,並且沒有文件wrapper/libxgboostwrapper.o。因此,爲了使靜態庫首先,我們要創建wrapper/libxgboostwrapper.o;其次,運行在所有需要的文件.oar rcs

如何我修改Makefile文件

  1. 首先,我稍微改變了一些變量的名字。

    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 
    
  2. 增加了新的變量。

    WRAP = wrapper/libxgboostwrapper.o 
    
  3. 修改後的目標。

    TARGET = $(BIN) $(OBJ) $(DLIB) $(SLIB) $(WRAP) 
    
  4. 添加依存關係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) 
    
  5. 一切都爲$(BIN)$(MOCKBIN)$(DLIB),我試圖編譯完成後(或做什麼呢?)我$(WRAP)

    $(WRAP) : 
        $(CXX) $(CFLAGS) -fPIC -o [email protected] $(filter %.cpp %.o %.c %.a %.cc, $^) $(LDFLAGS) $(DLLFLAGS) 
    
  6. 所有這些東西后,終於我在做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

回答

1

這可能需要幾個迭代,因爲你似乎對這些文件是如何工作的一些誤解。

第1步:首先,讓我們編譯源文件生成一個目標文件。

g++ -o wrapper/xgboostwrapper.o -c wrapper/xgboost_wrapper.cpp 

(不要調用對象文件「libxgboostwrapper.o」的「LIB」前綴是一個庫,「.o」後綴是一個目標文件,當你使用它們時,這只是令人困惑。)

不要繼續下去,直到它的作品。

第2步:寫規則在Makefile中做到這一點:

wrapper/xgboostwrapper.o: wrapper/xgboost_wrapper.cpp 
    $(CXX) $(CFLAGS) -o [email protected] $< 

不要繼續,直到工作。

步驟3:找出哪些頭文件它實際需要,並添加爲先決條件。 (這是一個壞主意,使用通配符來添加所有現有頭作爲先決條件。):

wrapper/xgboostwrapper.o: wrapper/xgboost_wrapper.cpp src/utils/foo.h src/xgboost.h 
    $(CXX) $(CFLAGS) -o [email protected] $< 

嘗試那麼多,告訴我們如何去,那麼我們就可以繼續進行。

+0

非常感謝!不幸的是,我解決了我的問題,但沒有答案:) 首先,我生成了目標文件wrapper.o,然後將所有需要的目標文件添加到一個庫中。 – Jihad

相關問題