Ошибка установки xgboost на Mac — ar: члены архива не указаны

Я пытаюсь установить xgboost на Mac. Я следовал инструкциям на github, но когда я запускаю make -j4, я получаю сообщение об ошибке:

c++ -std=c++0x -Wall -O3 -msse2  -Wno-unknown-pragmas -funroll-loops -Iinclude   -Idmlc-core/include -Irabit/include -fPIC -DDISABLE_OPENMP -o xgboost  build/cli_main.o build/learner.o build/logging.o build/c_api/c_api.o build/c_api/c_api_error.o build/common/common.o build/data/data.o build/data/simple_csr_source.o build/data/simple_dmatrix.o build/data/sparse_page_dmatrix.o build/data/sparse_page_raw_format.o build/data/sparse_page_source.o build/data/sparse_page_writer.o build/gbm/gblinear.o build/gbm/gbm.o build/gbm/gbtree.o build/metric/elementwise_metric.o build/metric/metric.o build/metric/multiclass_metric.o build/metric/rank_metric.o build/objective/multiclass_obj.o build/objective/objective.o build/objective/rank_obj.o build/objective/regression_obj.o build/tree/tree_model.o build/tree/tree_updater.o build/tree/updater_colmaker.o build/tree/updater_histmaker.o build/tree/updater_prune.o build/tree/updater_refresh.o build/tree/updater_skmaker.o build/tree/updater_sync.o dmlc-core/libdmlc.a rabit/lib/librabit_empty.a  -pthread -lm   
ar crv lib/libxgboost.a 
c++ -std=c++0x -Wall -O3 -msse2  -Wno-unknown-pragmas -funroll-loops -Iinclude   -Idmlc-core/include -Irabit/include -fPIC -DDISABLE_OPENMP -shared -o lib/libxgboost.so build/learner.o build/logging.o build/c_api/c_api.o build/c_api/c_api_error.o build/common/common.o build/data/data.o build/data/simple_csr_source.o build/data/simple_dmatrix.o build/data/sparse_page_dmatrix.o build/data/sparse_page_raw_format.o build/data/sparse_page_source.o build/data/sparse_page_writer.o build/gbm/gblinear.o build/gbm/gbm.o build/gbm/gbtree.o build/metric/elementwise_metric.o build/metric/metric.o build/metric/multiclass_metric.o build/metric/rank_metric.o build/objective/multiclass_obj.o build/objective/objective.o build/objective/rank_obj.o build/objective/regression_obj.o build/tree/tree_model.o build/tree/tree_updater.o build/tree/updater_colmaker.o build/tree/updater_histmaker.o build/tree/updater_prune.o build/tree/updater_refresh.o build/tree/updater_skmaker.o build/tree/updater_sync.o dmlc-core/libdmlc.a rabit/lib/librabit_empty.a -pthread -lm   
ar: no archive members specified
usage:  ar -d [-TLsv] archive file ...
    ar -m [-TLsv] archive file ...
    ar -m [-abiTLsv] position archive file ...
    ar -p [-TLsv] archive [file ...]
    ar -q [-cTLsv] archive file ...
    ar -r [-cuTLsv] archive file ...
    ar -r [-abciuTLsv] position archive file ...
    ar -t [-TLsv] archive [file ...]
    ar -x [-ouTLsv] archive [file ...]
make: *** [lib/libxgboost.a] Error 1
make: *** Waiting for unfinished jobs....
clang: warning: argument unused during compilation: '-pthread'
clang: warning: argument unused during compilation: '-pthread'

Если я запускаю только make (без -j4), я получаю:

$ make
ar crv lib/libxgboost.a 
ar: no archive members specified
usage:  ar -d [-TLsv] archive file ...
    ar -m [-TLsv] archive file ...
    ar -m [-abiTLsv] position archive file ...
    ar -p [-TLsv] archive [file ...]
    ar -q [-cTLsv] archive file ...
    ar -r [-cuTLsv] archive file ...
    ar -r [-abciuTLsv] position archive file ...
    ar -t [-TLsv] archive [file ...]
    ar -x [-ouTLsv] archive [file ...]
make: *** [lib/libxgboost.a] Error 1

Любая идея, что вызывает это и как я могу это исправить?

Хотя я могу ошибаться, я думаю, потому что утилита архивации ar на Mac слишком старая (с 2005 года):

$ man ar

AR(1)                     BSD General Commands Manual                    AR(1)

NAME
     ar -- create and maintain library archives

SYNOPSIS

...
...

Darwin                           July 27, 2005                          Darwin

Любые идеи, как обновить ar до новейшей версии на OS X?

Вот makefile для справки:

ifndef config
ifneq ("$(wildcard ./config.mk)","")
        config = config.mk
else
        config = make/config.mk
endif
endif

ifndef DMLC_CORE
        DMLC_CORE = dmlc-core
endif

ifndef RABIT
        RABIT = rabit
endif

ROOTDIR = $(CURDIR)

ifeq ($(OS), Windows_NT)
        UNAME="Windows"
else
        UNAME=$(shell uname)
endif

include $(config)
ifeq ($(USE_OPENMP), 0)
        export NO_OPENMP = 1
endif
include $(DMLC_CORE)/make/dmlc.mk

# include the plugins
include $(XGB_PLUGINS)

# use customized config file
ifndef CC
export CC  = $(if $(shell which gcc-5),gcc-5,gcc)
endif
ifndef CXX
export CXX = $(if $(shell which g++-5),g++-5,g++)
endif

export LDFLAGS= -pthread -lm $(ADD_LDFLAGS) $(DMLC_LDFLAGS) $(PLUGIN_LDFLAGS)
export CFLAGS=  -std=c++0x -Wall -O3 -msse2  -Wno-unknown-pragmas -funroll-loops -Iinclude $(ADD_CFLAGS) $(PLUGIN_CFLAGS)
CFLAGS += -I$(DMLC_CORE)/include -I$(RABIT)/include
#java include path
export JAVAINCFLAGS = -I${JAVA_HOME}/include -I./java

ifndef LINT_LANG
        LINT_LANG= "all"
endif

ifneq ($(UNAME), Windows)
        CFLAGS += -fPIC
        XGBOOST_DYLIB = lib/libxgboost.so
else
        XGBOOST_DYLIB = lib/libxgboost.dll
endif

ifeq ($(UNAME), Linux)
        LDFLAGS += -lrt
        JAVAINCFLAGS += -I${JAVA_HOME}/include/linux
endif

ifeq ($(UNAME), Darwin)
        JAVAINCFLAGS += -I${JAVA_HOME}/include/darwin
endif

ifeq ($(USE_OPENMP), 1)
        CFLAGS += -fopenmp
else
        CFLAGS += -DDISABLE_OPENMP
endif


# specify tensor path
.PHONY: clean all lint clean_all doxygen rcpplint pypack Rpack Rbuild Rcheck java


all: lib/libxgboost.a $(XGBOOST_DYLIB) xgboost

$(DMLC_CORE)/libdmlc.a: $(wildcard $(DMLC_CORE)/src/*.cc $(DMLC_CORE)/src/*/*.cc)
        + cd $(DMLC_CORE); make libdmlc.a config=$(ROOTDIR)/$(config); cd $(ROOTDIR)

$(RABIT)/lib/$(LIB_RABIT): $(wildcard $(RABIT)/src/*.cc)
        + cd $(RABIT); make lib/$(LIB_RABIT); cd $(ROOTDIR)

jvm: jvm-packages/lib/libxgboost4j.so

SRC = $(wildcard src/*.cc src/*/*.cc)
ALL_OBJ = $(patsubst src/%.cc, build/%.o, $(SRC)) $(PLUGIN_OBJS)
AMALGA_OBJ = amalgamation/xgboost-all0.o
LIB_DEP = $(DMLC_CORE)/libdmlc.a $(RABIT)/lib/$(LIB_RABIT)
ALL_DEP = $(filter-out build/cli_main.o, $(ALL_OBJ)) $(LIB_DEP)
CLI_OBJ = build/cli_main.o

build/%.o: src/%.cc
        @mkdir -p $(@D)
        $(CXX) $(CFLAGS) -MM -MT build/$*.o $< >build/$*.d
        $(CXX) -c $(CFLAGS) -c $< -o $@

build_plugin/%.o: plugin/%.cc
        @mkdir -p $(@D)
        $(CXX) $(CFLAGS) -MM -MT build_plugin/$*.o $< >build_plugin/$*.d
        $(CXX) -c $(CFLAGS) -c $< -o $@

# The should be equivalent to $(ALL_OBJ)  except for build/cli_main.o
amalgamation/xgboost-all0.o: amalgamation/xgboost-all0.cc
        $(CXX) -c $(CFLAGS) -c $< -o $@

# Equivalent to lib/libxgboost_all.so
lib/libxgboost_all.so: $(AMALGA_OBJ) $(LIB_DEP)
        @mkdir -p $(@D)
        $(CXX) $(CFLAGS) -shared -o $@ $(filter %.o %.a, $^) $(LDFLAGS)

lib/libxgboost.a: $(ALL_DEP)
        @mkdir -p $(@D)
        ar crv $@ $(filter %.o, $?)

lib/libxgboost.dll lib/libxgboost.so: $(ALL_DEP)
        @mkdir -p $(@D)
        $(CXX) $(CFLAGS) -shared -o $@ $(filter %.o %a,  $^) $(LDFLAGS)

jvm-packages/lib/libxgboost4j.so: jvm-packages/xgboost4j/src/native/xgboost4j.cpp $(ALL_DEP)
        @mkdir -p $(@D)
        $(CXX) $(CFLAGS) $(JAVAINCFLAGS) -shared -o $@ $(filter %.cpp %.o %.a, $^) $(LDFLAGS)

xgboost: $(CLI_OBJ) $(ALL_DEP)
        $(CXX) $(CFLAGS) -o $@  $(filter %.o %.a, $^)  $(LDFLAGS)

rcpplint:
        python2 dmlc-core/scripts/lint.py xgboost ${LINT_LANG} R-package/src

lint: rcpplint
        python2 dmlc-core/scripts/lint.py xgboost ${LINT_LANG} include src plugin

clean:
        $(RM) -rf build build_plugin lib bin *~ */*~ */*/*~ */*/*/*~ */*.o */*/*.o */*/*/*.o xgboost

clean_all: clean
        cd $(DMLC_CORE); make clean; cd $(ROODIR)
        cd $(RABIT); make clean; cd $(ROODIR)

doxygen:
        doxygen doc/Doxyfile

# create standalone python tar file.
pypack: ${XGBOOST_DYLIB}
pypack: ${XGBOOST_DYLIB}
        cp ${XGBOOST_DYLIB} python-package/xgboost
        cd python-package; tar cf xgboost.tar xgboost; cd ..

# Script to make a clean installable R package.
Rpack:
        make clean_all
        rm -rf xgboost xgboost*.tar.gz
        cp -r R-package xgboost
        rm -rf xgboost/src/*.o xgboost/src/*.so xgboost/src/*.dll
        rm -rf xgboost/src/*/*.o
        rm -rf xgboost/demo/*.model xgboost/demo/*.buffer xgboost/demo/*.txt
        rm -rf xgboost/demo/runall.R
        cp -r src xgboost/src/src
        cp -r include xgboost/src/include
        cp -r amalgamation xgboost/src/amalgamation
        mkdir -p xgboost/src/rabit
        cp -r rabit/include xgboost/src/rabit/include
        cp -r rabit/src xgboost/src/rabit/src
        rm -rf xgboost/src/rabit/src/*.o
        mkdir -p xgboost/src/dmlc-core
        cp -r dmlc-core/include xgboost/src/dmlc-core/include
        cp -r dmlc-core/src xgboost/src/dmlc-core/src
        cp ./LICENSE xgboost
        cat R-package/src/Makevars|sed '2s/.*/PKGROOT=./' | sed '3s/.*/ENABLE_STD_THREAD=0/' > xgboost/src/Makevars
        cp xgboost/src/Makevars xgboost/src/Makevars.win

Rbuild:
        make Rpack
        R CMD build --no-build-vignettes xgboost
        rm -rf xgboost

Rcheck:
        make Rbuild
        R CMD check  xgboost*.tar.gz

-include build/*.d
-include build/*/*.d
-include build_plugin/*/*.d

Большое спасибо.


person user2725109    schedule 16.03.2016    source источник
comment
Makefile выглядит сломанным. Как видите, ar crv lib/libxgboost.a не указывает какие-либо объектные файлы для добавления в библиотеку.   -  person trojanfoe    schedule 16.03.2016
comment
Спасибо за комментарий. Можете ли вы дать мне несколько советов о том, как действовать дальше? Я не продвинутый пользователь линукса...   -  person user2725109    schedule 16.03.2016
comment
Запустите без -j4 и посмотрите, работает ли это? Многие плохо написанные make-файлы небезопасны для параллельной сборки. И что же случилось с этой ссылкой на github? Вы вставили не то?   -  person Etan Reisner    schedule 16.03.2016
comment
Без -j4 тоже не работает. Я написал сообщение об ошибке выше. Также исправил ссылку на гитхаб, я думаю, что гиперссылка не работает, если я поставлю https.   -  person user2725109    schedule 16.03.2016
comment
Можете ли вы показать полный вывод команды make (после запуска make clean, если запуск make на данный момент мало что дает, кроме отображения этой ошибки)?   -  person Etan Reisner    schedule 22.03.2016
comment
Ответ здесь: stackoverflow.com/questions/36038836/   -  person user2725109    schedule 08.04.2016


Ответы (1)


Я успешно установил его на свой Linux-компьютер, с make-файлом все в порядке, моя версия AR — 2.24, так что вы все правильно поняли, ваш binutils очень старый, чтобы обновить его, перейдите по адресу https://www.gnu.org/software/binutils/ загрузите версию 2.24.
распакуйте и измените каталог:

./configure 
make
sudo make install
person Baroudi Safwen    schedule 25.03.2016
comment
Привет, я пытаюсь установить на OS X, а не на Linux. Я установил binutils, используя присланную вами ссылку, но все еще получаю сообщение об ошибке при попытке запустить make. Также, хотя я установил binutils, я думаю, что версия ar не изменилась (показывает ту же версию/дату, что и выше) - person user2725109; 08.04.2016