Я уже разместил этот вопрос на страницах авторов , но я думал, что могу спросить и здесь.
Я пытаюсь установить pylzma с этой настройкой:
С простым 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/С++.
Итак, в основном мои вопросы:
ИЗМЕНИТЬ Не получили большого ответа, поэтому я думаю, что добавлю несколько вопросов:
Как вы относитесь к ошибке компоновщика?
Есть ли какая-либо логика, которую я могу выполнить, чтобы помочь мне найти ответы через Интернет (в сочетании с этим Ошибка компоновщика MSDN)?
Так как я видел, как многие люди скомпилировали его для 32-битной системы, возможно ли, что он компилируется отлично на 64-битной основе, но не удается, когда дело доходит до ссылки из-за типа архитектуры?
Я ищу больше советов, которые могут помочь, чем полностью рабочий ответ.
Большое спасибо за вашу помощь (:
Я установил 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
По общему подходу к любым ошибкам - это, вероятно, требует некоторых знаний и опыта, чтобы понять, что за ними.
extern "C" { ... }
, чтобы они не искали имя?