首页 文章

安装/编译pylzma(lzma python绑定)

提问于
浏览
1

我已经在作者website上发布了这个问题,但我想我也可以在这里问一下 .

我一直在尝试使用此设置安装pylzma:

  • Windows 7 x64

  • Python 2.6.6 x64

  • 来自windows server 2003 sdk的amd64编译器

  • 克隆了git repo git://github.com/fancycode/pylzma.git

用一个简单的 easy_install pylzma 我得到了这个:

cl:命令行警告D9025:用'/ MT'覆盖'/ MD'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 / C / Sha256.h(18):参见'CSha256'scrc / 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:'function':不兼容的类型 - 从'int *'到'CSha256 *'src / pylzma / pylzma.c(104):错误C2143:语法错误:缺少';'在'type'src / pylzma / pylzma.c(105)之前:错误C2143:语法错误:缺少';'在'type'src / pylzma / pylzma.c(106)之前:错误C2143:语法错误:缺少';'在'type'src / pylzma / pylzma.c(107)之前:错误C2143:语法错误:缺少';'在'type'srcrc / pylzma / pylzma.c之前(108):错误C2065:'round':未声明的标识符src / pylzma / pylzma.c(108):错误C2065:'round':未声明的标识符src / pylzma / pylzma . c(108):错误C2065:'rounds':未声明的标识符src / pylzma / pylzma.c(108):错误C2065:'round':未声明的标识符src / pylzma / pylzma.c(109):错误C2065:'sha ':未声明的标识符src / pylzma / pylzma.c(109):警告C4133:'function':不兼容的类型 - 从'int *'到'CSha256 *'src / pylzma / pylzma.c(110):错误C2065:' sha':未声明的标识符src / pylzma / pylzma.c(110):警告C4133:'function':不兼容的类型 - 从'int *'到'CSha256 *'src / pylzma / pylzma.c(111):错误C2065: 'sha':未声明的标识符src / pylzma / pylzma.c(111):警告C4133:'function':不兼容的类型 - 从'int *'到'CSha256 *'src / pylzma / pylzma.c(111):错误C2065 :'temp':未声明的标识符src / pylzma / pylzma.c(112):错误C2065:'i':未声明的标识符src / pylzma / pylzma.c(112):错误C20 65:'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):error C2065:'sha':未声明的标识符src / pylzma / pylzma.c(116):警告C4133:'function':不兼容的类型 - 从'int *'到'CSha256 *'错误:安装脚本退出并显示错误:command'“ C:\ Program Files(x86)\ Microsoft Visual Studio 9.0 \ VC \ BIN \ amd64 \ cl.exe“'以退出状态2失败

然后经过谷歌搜索我认为这是关于编译器(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 \ libs / LIBPATH:C:\ Python26 \ PCbuild \ amd64 user32.lib oleaut32.lib / EXPORT:initpylzma build \ temp.win-amd64-2.6 \ Release \ src /pylzma/pylzma.obj build \ temp.win-amd64-2.6 \ Release \ src / pylzma / pylzma_decompressobj.obj build \ temp.win-amd64-2.6 \ Release \ src / pylzma / pylzma_compressfile.obj build \ temp.win- amd64-2.6 \ Release \ src / pylzma / pylzma_decompress.obj build \ temp.win-amd64-2.6 \ Release \ src / pylzma / pylzma_compress.obj build \ 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 build \ temp.win-amd64-2.6 \ Release \ src / pylzma / pylzma_decompressobj_compat.obj build \ temp.win-amd64-2.6 \ Release \ src \ sdk \ LzFind.obj build \ temp.win-amd64-2.6 \ Release \ src \ sdk \ LzmaDec.objbuild \ temp.win-amd64-2.6 \ Release \ src \ sdk \ LzmaEnc.obj build \ temp.win-amd64-2.6 \ Release \ src \ 7zip \ C \ CpuArch.obj build \ temp.win-amd64-2.6 \发布\ src \ 7zip \ C \ Aes.obj build \ temp.win-amd64-2.6 \ Release \ src \ 7zip \ C \ AesOpt.obj build \ temp.win-amd64-2.6 \ Release \ src \ 7zip \ C \ Sha256.obj build \ temp.win-amd64-2.6 \ Release \ src \ compat \ LzmaCompatDecode.obj build \ 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';使用第一个规范创建库build \ temp.win-amd64-2.6 \ Release \ src / pylzma \ pylzma.lib和object build \ temp.win-amd64-2.6 \ Release \ src / pylzma \ pylzma.exp pylzma.obj:error 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(unsigned int *,unsigned char *,unsigned __int64)“(?AesCtr_Code_Intel @@ YAXPEAIPEAE_K @ Z)在函数AesGenTables Aes.obj中引用:错误LNK2019:未解析的外部符号”void __cdecl AesCbc_Decode_Intel(unsigned int *,unsigned char *,unsigned __int64)“ (?AesCbc_Decode_Intel @@ YAXPEAIPEAE_K @ Z)在函数AesGenTables Aes.ob中引用j:错误LNK2019:未解析的外部符号“void __cdecl AesCbc_Encode_Intel(unsigned int *,unsigned char *,unsigned __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)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)AesOpt.obj:错误LNK2019:函数中引用的未解析的外部符号_mm_aesdeclast_si128”void __cdecl AesCbc_Decode_Intel(union __m128i *,union __m128i * ,unsigned __int64)“(?AesCbc_Decode_Intel @@ YAXPEAT__m128i @@ 0_K @ Z)AesOpt.obj:错误LNK2019:函数”void __cdecl中引用的未解析的外部符号_mm_aesdec_si128 AesCbc_Decode_Intel(union __m128i *,union __m128i *,unsigned __int64)“(?AesCbc_Decode_Intel @@ YAXPEAT__m128i @@ 0_K @ Z)build \ lib.win-amd64-2.6 \ pylzma.pyd:致命错误LNK1120:10未解析的外部错误:命令'“C:\ Program Files(x86)\ Microsoft Visual Studio 9.0 \ VC \ BIN \ amd64 \ link.exe”'以退出状态1120失败

现在我很难弄清楚这些链接器问题是什么,即使使用msdn doc(关于链接器错误) . 可能是因为我对C / C缺乏了解 .

所以基本上我的问题是:

  • 有没有办法解决这些链接器问题?

  • 我错误地将这些文件从.c重命名为.cpp . 如果是,是否可以使用msvc amd64编译器将其编译为.c?

EDIT Haven 't got much answer, so I think I' ll添加一些问题:

  • 关于链接器错误,您的方法是什么?

  • 我是否有任何逻辑可以帮助自己在网上找到答案(结合MSDN linker errors)?

  • 由于我看到很多人为32位系统成功编译它,它是否有可能在64位编译好,但由于架构类型而导致链接失败?

我正在寻找更多可能有用的提示而不是完全正常的答案 .

非常感谢你的帮助 (:

1 回答

  • 2

    我已经安装了pylzma来自己尝试一下 . 对于python 2.6,使用mingw可以很好地构建它,但msvc编译器会为python2.4-2.7构建chokes . 我们先看看错误:

    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时,你就避免了这种情况因为C允许这个错误(并且mingw显然支持C) . 但是切换到C会导致名称错误和链接错误 . 要解决这些问题,您可以在所有代码周围放置 extern "C" { ... } .

    修复src / pylzma / pylzma.c更好,修复很简单 - 移动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 SDK \ 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

    在build目录中查看显示没有pylzma.pyd.manifest,虽然从输出中看到link.exe有/ MANIFEST:... switch . 快速谷歌搜索"link didn't create manifest"找到http://bugs.python.org/issue4431它创建's explained that when using /MT switch manifest doesn',解决方案是将/ MANIFEST添加到链接器标志 . 好吧,让's edit 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现在很好地 Build 了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
    

    对于任何错误的一般方法 - 可能需要一些知识和经验来理解它们背后的内容 .

相关问题