pyenv: компилирование модуля - PullRequest
0 голосов
/ 09 января 2019

Я новичок в pyenv, использую его сейчас, поэтому у меня может быть и Python 3.7 (system / default), и Python 3.6.5 (для совместимости с TensorFlow, который еще не поддерживает 3.7).

Я установил 3.6.5, используя

pyenv install -v 3.6.5

Репозиторий TensorFlow, который я хотел использовать, прекрасно работает на этом.

Это репо будет частью более крупного проекта. Этот проект включает в себя еще один репозиторий https://github.com/argman/EAST,, который требует компиляции некоторого кода C ++ в папке lanms.

Когда я запускаю make в фонарях, я получаю:

clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [adaptor.so] Error 1

Я пробовал такие вещи, как

PYTHON_CONFIGURE_OPTS="--enable-shared CC=clang" pyenv install -v 3.6.5

который я нашел в Google, но пока ничего не получалось.

Примечание: lanms / make отлично работает под Python 3.7.

Это кажется довольно простой вещью для тех, кто знает. Если у кого есть идея, пожалуйста, помогите. Спасибо

Полный вывод make ниже:

Chandrachuds-MacBook-Pro:lanms Chandrachud$ make
find: -xtype: unknown primary or operator
c++ -o adaptor.so -I include  -std=c++11 -O3 -I/Users/Chandrachud/.pyenv/versions/3.6.5/include/python3.6m -I/Users/Chandrachud/.pyenv/versions/3.6.5/include/python3.6m -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -L/Users/Chandrachud/.pyenv/versions/3.6.5/lib/python3.6/config-3.6m-darwin -lpython3.6m -lintl -ldl -framework CoreFoundation -Wl,-stack_size,1000000 -framework CoreFoundation adaptor.cpp include/clipper/clipper.cpp --shared -fPIC
adaptor.cpp:53:1: warning: 'pybind11_init' is deprecated: PYBIND11_PLUGIN is deprecated, use PYBIND11_MODULE [-Wdeprecated-declarations]
PYBIND11_PLUGIN(adaptor) {
^
include/pybind11/common.h:232:20: note: expanded from macro 'PYBIND11_PLUGIN'
            return pybind11_init();                                            \
                   ^
adaptor.cpp:53:1: note: 'pybind11_init' has been explicitly marked deprecated here
include/pybind11/common.h:216:5: note: expanded from macro 'PYBIND11_PLUGIN'
    PYBIND11_DEPRECATED("PYBIND11_PLUGIN is deprecated, use PYBIND11_MODULE")  \
    ^
include/pybind11/common.h:80:54: note: expanded from macro 'PYBIND11_DEPRECATED'
#  define PYBIND11_DEPRECATED(reason) __attribute__((deprecated(reason)))
                                                     ^
1 warning generated.
include/clipper/clipper.cpp:3665:13: warning: unused variable 'firstLeft' [-Wunused-variable]
    OutRec* firstLeft = ParseFirstLeft(outRec->FirstLeft);
            ^
1 warning generated.
ld: warning: text-based stub file /System/Library/Frameworks//CoreFoundation.framework/CoreFoundation.tbd and library file /System/Library/Frameworks//CoreFoundation.framework/CoreFoundation are out of sync. Falling back to library file for linking.
ld: warning: text-based stub file /System/Library/Frameworks//CoreFoundation.framework/CoreFoundation.tbd and library file /System/Library/Frameworks//CoreFoundation.framework/CoreFoundation are out of sync. Falling back to library file for linking.
ld: -stack_size option can only be used when linking a main executable
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [adaptor.so] Error 1

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Если кто-то читает это с похожей проблемой, вот соответствующий раздел Makefile:

LDFLAGS0 = $(shell python3-config --ldflags) 

UNAME = $(shell uname)

ifeq ($(UNAME), Darwin)
    LDSTACK = -Wl,-stack_size,1000000
    LDFLAGS = $(filter-out $(LDSTACK), $(LDFLAGS0))
    DEPS = lanms.h $(shell find include -type f)
else
    LDFLAGS = $(LDFLAGS0)
    DEPS = lanms.h $(shell find include -xtype f)
endif 
0 голосов
/ 09 января 2019

Здесь я вижу две основные проблемы:

  1. find использует xtype, а не type, что не поддерживается на Mac. Вы должны быть в состоянии изменить xtype для ввода в Makefile. например:

    DEPS = lanms.h $(shell find include -type f)
    
  2. Эта ошибка:

    ld: -stack_size option can only be used when linking a main executable
    

    Вы передаете -Wl,-stack_size,1000000 в Clang, который говорит ему сделать исполняемый файл с большим стеком. Однако clang создает только файл .so, который не может контролировать размер стека.

    Причина -Wl,-stack_size,1000000 в том, что есть из-за этой строки:

    LDFLAGS = $(shell python3-config --ldflags)
    

    Причина, по которой python3-config --ldflags делает это, заключается в недавней ошибке в Python: https://bugs.python.org/issue34960

    Итак, вы можете подождать, пока Python исправит это, или вы можете обойти это: Запустите python3-config --ldflags. Вставьте вывод в строку LDFLAGS, минус часть -Wl,-stack_size,1000000. Тогда вы сможете его построить.

...