Установка / компиляция pylzma (привязка lzma python) - PullRequest
2 голосов
/ 22 января 2011

Я уже разместил этот вопрос на сайте авторов , но я подумал, что могу спросить и здесь.

Я пытался установить pylzma с этой настройкой:

  • Windows 7 x64
  • Python 2.6.6 x64
  • компилятор amd64, приходящий с Windows Server 2003 SDK
  • клонировал git-репозиторий git: //github.com/fancycode/pylzma.git

С простым easy_install pylzma я получил это:

кл: предупреждение командной строки D9025: переопределение '/ MD' с помощью '/ MT' pylzma.c src / pylzma / pylzma.c (85): предупреждение C4244: '=': преобразование из 'Py_ssize_t' до 'int', возможная потеря данных

src / pylzma / pylzma.c (102): ошибка C2275: «CSha256»: незаконное использование этого введите как выражение C: \ Users \ xavier.lapointe \ AppData \ Local \ Temp \ easy_install-2mfkqu \ pylzma-0.4.3 \ SRC \ pylzma ../ 7zip / С / Sha256.h (18) : см. декларацию «CSha256»

src / pylzma / pylzma.c (102): ошибка C2146: синтаксическая ошибка: отсутствует ';' перед идентификатором 'ша'

src / pylzma / pylzma.c (102): ошибка C2065: 'sha': необъявленный идентификатор

src / pylzma / pylzma.c (103): ошибка C2065: 'sha': необъявленный идентификатор

src / pylzma / pylzma.c (103): предупреждение C4133: «функция»: несовместимые типы - от 'int *' до 'CSha256 *'

src / pylzma / pylzma.c (104): ошибка C2143: синтаксическая ошибка: отсутствует ';' перед «типом»

src / pylzma / pylzma.c (105): ошибка C2143: синтаксическая ошибка: отсутствует ';' перед «типом»

src / pylzma / pylzma.c (106): ошибка C2143: синтаксическая ошибка: отсутствует ';' перед «типом»

src / pylzma / pylzma.c (107): ошибка C2143: синтаксическая ошибка: отсутствует ';' перед «типом»

src / pylzma / pylzma.c (108): ошибка C2065: «раунд»: необъявленный идентификатор

src / pylzma / pylzma.c (108): ошибка C2065: «раунд»: необъявленный идентификатор

src / pylzma / pylzma.c (108): ошибка C2065: «раунды»: не объявлено Идентификатор

src / pylzma / pylzma.c (108): ошибка C2065: «раунд»: необъявленный идентификатор

src / pylzma / pylzma.c (109): ошибка C2065: 'sha': необъявленный идентификатор

src / pylzma / pylzma.c (109): предупреждение C4133: «функция»: несовместимые типы - от 'int *' до 'CSha256 *'

src / pylzma / pylzma.c (110): ошибка C2065: 'sha': необъявленный идентификатор

src / pylzma / pylzma.c (110): предупреждение C4133: «функция»: несовместимые типы - от 'int *' до 'CSha256 *'

src / pylzma / pylzma.c (111): ошибка C2065: 'sha': необъявленный идентификатор

src / pylzma / pylzma.c (111): предупреждение C4133: «функция»: несовместимые типы - от 'int *' до 'CSha256 *'

src / pylzma / pylzma.c (111): ошибка C2065: 'temp': необъявленный идентификатор

src / pylzma / pylzma.c (112): ошибка C2065: 'i': необъявленный идентификатор

src / pylzma / pylzma.c (112): ошибка C2065: 'i': необъявленный идентификатор

src / pylzma / pylzma.c (112): ошибка C2065: 'i': необъявленный идентификатор

src / pylzma / pylzma.c (113): ошибка C2065: 'temp': необъявленный идентификатор

src / pylzma / pylzma.c (113): ошибка C2065: 'i': необъявленный идентификатор

src / pylzma / pylzma.c (113): ошибка C2109: индекс требует массив или тип указателя

src / pylzma / pylzma.c (116): ошибка C2065: 'sha': необъявленный идентификатор

src / pylzma / pylzma.c (116): предупреждение C4133: «функция»: несовместимые типы - от 'int *' до 'CSha256 *'

ошибка: скрипт установки завершился с ошибкой: команда '"C: \ Program Files (x86) \ Microsoft Visual Studio Ошибка 9.0 \ VC \ BIN \ amd64 \ cl.exe "'с состоянием выхода 2

Затем после поиска в Google я подумал, что речь идет о компиляторе (c90 против c99), некоторые люди предложили изменить расширение .c на .cpp. Поэтому я сделал это и соответственно изменил setup.py (в основном имя файла).

Тогда успех, он компилируется после нескольких настроек в CpuArch.c (pp) и другого файла с синтаксическими ошибками.

Теперь дело в дросселе компоновщика:

C: \ Program Files (x86) \ Microsoft Visual Studio 9.0 \ VC \ BIN \ amd64 \ link.exe / DLL / nologo / НЕПРАВИЛЬНО: НЕТ /LIBPATH:C:\dev\pylzma\build\temp.win-amd64-2.6\Release\src\pylzma / LibPath: C: \ Python26 \ ЛИЭС / LIBPATH: C: \ Python26 \ PCbuild \ amd64 user32.lib oleaut32.lib / ЭКСПОРТ: initpylzma построить \ temp.win-amd64-2.6 \ Release \ SRC / pylzma / pylzma.obj построить \ temp.win-amd64-2.6 \ Release \ SRC / pylzma / pylzma_decompressobj.obj построить \ temp.win-amd64-2.6 \ Release \ SRC / pylzma / pylzma_compressfile.obj построить \ temp.win-amd64-2.6 \ Release \ SRC / pylzma / pylzma_decompress.obj построить \ temp.win-amd64-2.6 \ Release \ SRC / pylzma / pylzma_compress.obj построить \ temp.win-amd64-2.6 \ Release \ SRC / pylzma / pylzma_streams.obj build \ temp.win-amd64-2.6 \ Release \ src / pylzma / pylzma_aes.obj build \ temp.win-amd64-2.6 \ Release \ src / pylzma / pylzma_decompress_compat.obj построить \ temp.win-amd64-2.6 \ Release \ SRC / pylzma / pylzma_decompressobj_compat.obj построить \ temp.win-amd64-2.6 \ Release \ SRC \ SDK \ LzFind.obj build \ temp.win-amd64-2.6 \ Release \ src \ sdk \ LzmaDec.obj build \ temp.win-amd64-2.6 \ Release \ src \ sdk \ LzmaEnc.obj build \ temp.win-amd64-2.6 \ Release \ ЦСИ \ 7zip \ C \ CpuArch.obj построить \ temp.win-amd64-2.6 \ Release \ SRC \ 7zip \ C \ Aes.obj построить \ temp.win-amd64-2.6 \ Release \ SRC \ 7zip \ C \ AesOpt.obj построить \ temp.win-amd64-2.6 \ Release \ SRC \ 7zip \ C \ Sha256.obj построить \ temp.win-amd64-2.6 \ Release \ SRC \ Compat \ LzmaCompatDecode.obj построить \ temp.win-amd64-2.6 \ Release \ SRC / SDK / LzFindMt.obj build \ temp.win-amd64-2.6 \ Release \ src / sdk / Threads.obj /OUT:build\lib.win-amd64-2.6\pylzma.pyd /IMPLIB:build\temp.win-amd64-2.6\Release\src/pylzma\pylzma.lib /MANIFESTFILE:build\temp.win-amd64-2.6\Release\src/pylzma\pylzma.pyd.manifest

pylzma.obj: предупреждение LNK4197: экспорт 'initpylzma' указан несколько раз; используя первую спецификацию библиотека построить \ temp.win-amd64-2.6 \ Release \ SRC / pylzma \ pylzma.lib и объект построить \ temp.win-amd64-2.6 \ Release \ SRC / pylzma \ pylzma.exp

pylzma.obj: ошибка LNK2001: не устранена внешний символ "char const * const doc_decompress» (? Doc_decompress @@ 3QBDB)

pylzma.obj: ошибка LNK2001: не устранена внешний символ "struct _object * __cdecl pylzma_decompress (struct _object *, struct _object *) "(? pylzma_decompress @@ YAPEAU_object @@ PEAU1 @ 0 @ Z) * ​​1095 *

pylzma.obj: ошибка LNK2001: не устранена внешний символ "char const * const doc_compress "(? doc_compress @@ 3QBDB)

Aes.obj: ошибка LNK2019: не устранена внешний символ "void __cdecl" AesCtr_Code_Intel (без знака int *, без знака char *, без знака __int64) "(? AesCtr_Code_Intel @@ YAXPEAIPEAE_K @ Z) ссылка в функции AesGenTables

Aes.obj: ошибка LNK2019: не устранена внешний символ "void __cdecl" AesCbc_Decode_Intel (без знака int *, без знака char *, без знака __int64) "(? AesCbc_Decode_Intel @@ YAXPEAIPEAE_K @ Z) ссылка в функции AesGenTables

Aes.obj: ошибка LNK2019: не устранена внешний символ "void __cdecl" AesCbc_Encode_Intel (без знака int *, без знака char *, без знака __int64) "(? AesCbc_Encode_Intel @@ YAXPEAIPEAE_K @ Z) ссылка в функции AesGenTables

AesOpt.obj: ошибка LNK2019: не устранена внешний символ _mm_aesenclast_si128 упоминается в функции "void __cdecl" AesCbc_Encode_Intel (union __m128i *, union __m128i *, unsigned __int64) "(? AesCbc_Encode_Intel @@ YAXPEAT__m128i @@ 0_K @ Z) * ​​1105 *

AesOpt.obj: ошибка LNK2019: не устранена внешний символ _mm_aesenc_si128 упоминается в функции "void __cdecl" AesCbc_Encode_Intel (union __m128i*, union __m128i *, unsigned __int64) "(? AesCbc_Encode_Intel @@ YAXPEAT__m128i @@ 0_K @ Z) * ​​1107 *

AesOpt.obj: ошибка LNK2019: неразрешенный внешний символ _mm_aesdeclast_ced_code_si128, union __m128i *, unsigned __int64) "(? AesCbc_Decode_Intel @@ YAXPEAT__m128i @@ 0_K @ Z) * ​​1109 *

AesOpt.obj: ошибка LNK2019: неразрешенный внешний символ _mm_aesdec_si128 oid ​​__ tel i tel refe refe refe refeunion __m128i *, unsigned __int64) "(? AesCbc_Decode_Intel @@ YAXPEAT__m128i @@ 0_K @ Z) build \ lib.win-amd64-2.6 \ pylzma.pyd: фатальная ошибка LNK1120: 10 неразрешенных внешних ошибок

* 1112Сбой "C: \ Program Files (x86) \ Microsoft Visual Studio 9.0 \ VC \ BIN \ amd64 \ link.exe" с состоянием выхода 1120

Теперь мне трудно пытатьсявыяснить, что это за проблемы с компоновщиком, даже с документом msdn (об ошибке компоновщика). Вероятно, из-за моего недостатка знаний о C / C ++.

Так что в основном мой вопрос(ы):

  • Есть ли способ исправить эти проблемы с компоновщиком?
  • Неправильно ли я переименовал эти файлы из .c в .cpp.Если да, возможно ли скомпилировать его как .c с помощью компилятора msvc amd64?

EDIT У меня нет большого ответа, поэтому я думаю, что добавлю несколько вопросов:

  • Какой у вас подход к ошибке компоновщика?

  • Есть ли какая-то логика, которой я могу следовать, чтобы помочь себе найти ответы в Интернете (в сочетании с этим MSDN ошибки компоновщика )?

  • Так как я видел, как многие люди успешно компилировали его для 32-битной системы, возможно ли, что он хорошо компилируется в 64-битной системе, но терпит неудачу, когда речь идет о компоновке из-за типа архитектуры?

Мне нужны подсказки, которые могут помочь, а не полностью рабочий ответ.

Большое спасибо за вашу помощь (:

1 Ответ

2 голосов
/ 08 февраля 2011

Я установил pylzma, чтобы попробовать это сам.Для python 2.6 он прекрасно работает с mingw, но дроссель msvc для python2.4-2.7.Давайте сначала посмотрим на ошибки:

src / pylzma / pylzma.c (102): ошибка C2275: «CSha256»: недопустимое использование этого типа в качестве выражения c: \ users \ xavier.lapointe \ appdata\ local \ temp \ easy_install-2mfkqu \ pylzma-0.4.3 \ src \ pylzma ../ 7zip / C / Sha256.h (18): см. объявление о 'CSha256'

Код вопросаis:

} else {
    Py_BEGIN_ALLOW_THREADS
    Sha256_Init(&sha);
    CSha256 sha;
    long round;
    int i;
    long rounds = (long) 1 << cycles;
    unsigned char temp[8] = { 0,0,0,0,0,0,0,0 };
    for (round = 0; round < rounds; round++) {

, что явно недопустимо в C, поскольку не разрешается объявлять переменные после кода.Когда вы переименовали .c в .cpp, вы избежали этой ошибки, поскольку C ++ допускает это (и, очевидно, mingw поддерживает это для C).Но переход на C ++ привел к искажению имен и ошибкам компоновки.Чтобы исправить это, вы можете поместить extern "C" { ... } вокруг всего кода.

Лучше исправить src / pylzma / pylzma.c htough и исправить это тривиально - переместите Py_BEGIN_ALLOW_THREADS и Sha256_Init (& sha);после объявления переменных:

} else {
    CSha256 sha;
    long round;
    int i;
    long rounds = (long) 1 << cycles;
    unsigned char temp[8] = { 0,0,0,0,0,0,0,0 };
    Py_BEGIN_ALLOW_THREADS
    Sha256_Init(&sha);
    for (round = 0; round < rounds; round++) {

Теперь pylzma прекрасно компилируется, но не запускает инструмент манифеста после компоновки:

Создание библиотеки build \ temp.win-amd64-2.6 \ Release \ src/pylzma\pylzma.lib и o bject build \ temp.win-amd64-2.6 \ Release \ src / pylzma \ pylzma.exp C: \ Program Files \ Microsoft SDKs \ Windows \ v7.0 \ bin \ x64 \ mt.exe-nologo -manifest bu ild \ temp.win-amd64-2.6 \ Release \ src / pylzma \ pylzma.pyd.manifest -outputresource: bu ild \ lib.win-amd64-2.6 \ pylzma.pyd; 2

build \ temp.win-amd64-2.6 \ Release \ src / pylzma \ pylzma.pyd.manifest: общая ошибка c1010070: не удалось загрузить и проанализировать манифест.Система не может найти указанный файл.ошибка: команда 'mt.exe' завершилась неудачно с состоянием выхода 31

Поиск в каталоге сборки показывает, что там нет файла pylzma.pyd.manifest, хотя из выходных данных видно, что link.exe имеет / MANIFEST:... переключатель.Быстрое прибегание к поиску «ссылка не создала манифест» находит http://bugs.python.org/issue4431, где объясняется, что при использовании переключателя / MT манифест не создается, и решение заключается в добавлении / MANIFEST к флагам компоновщика.Хорошо, давайте отредактируем файл pylzma setup.py, чтобы добавить флаг компоновщика для компилятора MSVC:

    if isinstance(self.compiler, MSVCCompiler):
        # set flags only available when using MSVC
        ext.extra_link_args.append('/MANIFEST') # force linker to create manifest
        if COMPILE_DEBUG:
            ext.extra_compile_args.append('/Zi')
            ext.extra_compile_args.append('/MTd')
            ext.extra_link_args.append('/DEBUG')
        else:
            ext.extra_compile_args.append('/MT')

Вуаля, pylzma теперь прекрасно работает с MSVC.Я протестировал сборку с Python 2.4-2.7 32-битной и 2.6-2.7 64-битной:

08.02.2011  10:08            71 844 pylzma-0.4.3dev-py2.4-win32.egg
08.02.2011  10:09            71 480 pylzma-0.4.3dev-py2.5-win32.egg
08.02.2011  10:07            79 358 pylzma-0.4.3dev-py2.6-win-amd64.egg
08.02.2011  10:09            75 637 pylzma-0.4.3dev-py2.6-win32.egg
08.02.2011  10:08            79 259 pylzma-0.4.3dev-py2.7-win-amd64.egg
08.02.2011  10:09            75 540 pylzma-0.4.3dev-py2.7-win32.egg
               6 File(s)        453 118 bytes

Что касается общего подхода к любым ошибкам - вероятно, для понимания того, что за ними стоит, требуются некоторые знания и опыт.

...