Установка / компиляция pylzma (привязка lzma python)

1

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

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

  • Windows 7 x64
  • Python 2.6.6 x64
  • компилятор amd64, поступающий с сервера Windows 2003 sdk
  • клонировал git repo git://github.com/fancycode/pylzma.git

С простым easy_install pylzma я получил следующее:

cl: Предупреждение командной строки 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: синтаксическая ошибка: отсутствует ';' перед идентификатором 'sha'

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: "round" : незаявленный идентификатор

src/pylzma/pylzma.c(108): ошибка C2065: "round" : незаявленный идентификатор

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

src/pylzma/pylzma.c(108): ошибка C2065: "round" : незаявленный идентификатор

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 *'

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

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

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

В настоящее время это штукатор компоновщика:

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN\amd64\link.exe/DLL/nologo/INCREMENTAL: NO /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)

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

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

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

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

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

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

AesOpt.obj: ошибка LNK2019: нерешенные внешний символ _mm_aesdeclast_si128 ссылка в функции "void __cdecl AesCbc_Decode_Intel (объединение __m128i *, union __m128i *, unsigned __int64)" (? AesCbc_Decode_Intel @@YAXPEAT__m128i @@0_K @Z)

AesOpt.obj: ошибка LNK2019: нерешенные внешний символ _mm_aesdec_si128 ссылка в функции "void __cdecl AesCbc_Decode_Intel (объединение __m128i *, union __m128i *, unsigned __int64)" (? AesCbc_Decode_Intel @@YAXPEAT__m128i @@0_K @Z) build\lib.win-amd64-2.6\pylzma.pyd: фатальная ошибка LNK1120: 10 нерешенных внешние

error: команда '' C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN\amd64\link.exe "" не удалось с статусом выхода 1120

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

Итак, в основном мои вопросы:

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

ИЗМЕНИТЬ Не получили большого ответа, поэтому я думаю, что добавлю несколько вопросов:

  • Как вы относитесь к ошибке компоновщика?

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

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

Я ищу больше советов, которые могут помочь, чем полностью рабочий ответ.

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

  • 0
    Вы пытались построить его с MinGW?
  • 0
    Если вы изменили расширение имени файла на .cpp, гарантировали ли вы, что прототипы функций имеют внешний блок extern "C" { ... } , чтобы они не искали имя?
Показать ещё 3 комментария
Теги:
visual-c++
compiler-construction
lzma

1 ответ

2
Лучший ответ

Я установил 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'

Код в вопросе:

} 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, вы избежали этой ошибки, так как С++ допускает это (и mingw поддерживает это для 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 компилируется отлично, но после ссылки не запускается инструмент манифеста:

Создание библиотеки построить \temp.win-amd64-2.6\Release\SRC/pylzma\pylzma.lib и o bject построить \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

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

Входящий в каталог build показывает, что там нет pylzma.pyd.manifest, хотя он видел на выходе, что link.exe имеет /MANIFEST:... switch. Быстрый поиск по ссылке "ссылка не создала манифест" находит 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')

Voila, pylzma теперь строит с MSVC. Я протестировал здание с помощью python 2.4-2.7 32-bit и 2.6-2.7 64-bit:

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

По общему подходу к любым ошибкам - это, вероятно, требует некоторых знаний и опыта, чтобы понять, что за ними.

  • 1
    Вы должны отправить свои изменения в pylzma на github , так как, вероятно, есть другие люди, имеющие такую же проблему.
  • 0
    Тем временем Zart разместил URL-адрес файла diff на сайте автора ( aura.zartsoft.ru/~zart/pypi/pylzma-fix-msvc-compiling.diff ).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню