python27.def "Таблица символов не найдена" при попытке переплетения - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь использовать переплетение с Python ANACONDA 64 бит.Поскольку для переплетения требуется Python 2.7, я создал новый env, чтобы иметь возможность его импортировать, во время выполнения кода оказалось, что libpython27.a отсутствует.Таким образом, я создал эту библиотеку, т.е. сначала создал файл def, а затем библиотеку с помощью инструмента dll

C:\ProgramData\Anaconda3\envs\Python27>gendef python27.dll

C:\ProgramData\Anaconda3\envs\Python27>C:\MinGW64\bin\dlltool -v --dllname python27.dll --def python27.def --output-lib libpython27.a

создание библиотеки прошло нормально, однако во время компиляции по переплетению я получаю таблицу символов не найдена.После небольшой отладки вот код, который отвергает, жалуется, что в новом python27.def нет файла символов

File "C:\ProgramData\Anaconda3\envs\Python27\lib\site-packages\numpy\distutils\mingw32ccompiler.py", line 302, in generate_def
    raise ValueError("Symbol table not found")

ValueError: Symbol table not found

def dump_table(dll):
    st = subprocess.Popen(["objdump.exe", "-p", dll], stdout=subprocess.PIPE)
    return st.stdout.readlines()

def generate_def(dll, dfile):
    """Given a dll file location,  get all its exported symbols and dump them
    into the given def file.

    The .def file will be overwritten"""
    dump = dump_table(dll)
    for i in range(len(dump)):
        if _START.match(dump[i].decode()):
            break
    else:
        raise ValueError("Symbol table not found")

Есть идеи, что это может быть ??

1 Ответ

0 голосов
/ 19 февраля 2019

После дополнительных исследований похоже, что дистрибутив Anaconda поставляет msvcr90.dll без таблицы символов.Поэтому, когда вызван метод generate_def (dll, dfile) для msvcr90.dll, он генерирует пустой файл def.

исправление для него было в строке 352 mingw32compiler.py для добавления возврата False

def build_msvcr_library(debug=False):
    return False
    if os.name != 'nt':
        return False
...