Я хочу создать статическую библиотеку XGBoost, но я не справляюсь с этой простой задачей.Сделать статическую библиотеку вместо динамической
Во-первых, я просто пытался взять все файлы .o
и через ar rcs wrapper/libxgboostwrapper.a ./*
сделать статическую библиотеку, но я потерпел неудачу. Фактически, когда я делаю другие вещи, которые зависят от XGBoost, он терпит неудачу с ошибками: undefined reference to XGBoosterFree
.
Эта функция определена в части обертки и нет файла wrapper/libxgboostwrapper.o
. Поэтому, чтобы сначала создать статическую библиотеку, нам нужно создать wrapper/libxgboostwrapper.o
, во-вторых, запустите ar rcs
по всем необходимым файлам .o
.
Как я модифицировал 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