2

我已经在作者网站上发布了这个问题,但我想我也可以在这里问。

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

  • 视窗 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”的声明

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: 'function' : 不兼容的类型 - 从 '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:'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):错误 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: 'function' : 不兼容的类型 - 从 'int *' 到 'CSha256 *'

错误:安装脚本退出并出现错误:命令 '"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.obj build \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\Release \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.manifestwin-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\src\7zip\C\CpuArch.obj build\temp.win-amd64-2.6\Release\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.manifestwin-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\src\7zip\C\CpuArch.obj build\temp.win-amd64-2.6\Release\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.manifest6\Release\src\sdk\LzmaEnc.obj build\temp.win-amd64-2.6\Release\src\7zip\C\CpuArch.obj build\temp.win-amd64-2.6\Release\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\发布\src/pylzma\pylzma.pyd.manifest6\Release\src\sdk\LzmaEnc.obj build\temp.win-amd64-2.6\Release\src\7zip\C\CpuArch.obj build\temp.win-amd64-2.6\Release\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\发布\src/pylzma\pylzma.pyd.manifestobj 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.manifestobj 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 和对象 build\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:函数 AesGenTables 中引用的未解析外部符号“void __cdecl AesCtr_Code_Intel(unsigned int *,unsigned char *,unsigned __int64)”(?AesCtr_Code_Intel@@YAXPEAIPEAE_K@Z)

Aes.obj:错误 LNK2019:函数 AesGenTables 中引用的未解析外部符号“void __cdecl AesCbc_Decode_Intel(unsigned int *,unsigned char *,unsigned __int64)”(?AesCbc_Decode_Intel@@YAXPEAIPEAE_K@Z)

Aes.obj:错误 LNK2019:函数 AesGenTables 中引用的未解析外部符号“void __cdecl AesCbc_Encode_Intel(unsigned int *,unsigned char *,unsigned __int64)”(?AesCbc_Encode_Intel@@YAXPEAIPEAE_K@Z)

AesOpt.obj:错误 LNK2019:函数“void __cdecl AesCbc_Encode_Intel(union __m128i *,union __m128i *,unsigned __int64)”中引用的未解析外部符号 _mm_aesenclast_si128 (?AesCbc_Encode_Intel@@YAXPEAT__m128i@@0_K@Z)

AesOpt.obj:错误 LNK2019:函数“void __cdecl AesCbc_Encode_Intel(union __m128i *,union __m128i *,unsigned __int64)”中引用的未解析外部符号 _mm_aesenc_si128 (?AesCbc_Encode_Intel@@YAXPEAT__m128i@@0_K@Z)

AesOpt.obj:错误 LNK2019:函数“void __cdecl AesCbc_Decode_Intel(union __m128i *,union __m128i *,unsigned __int64)”中引用的未解析外部符号 _mm_aesdeclast_si128 (?AesCbc_Decode_Intel@@YAXPEAT__m128i@@0_K@Z)

AesOpt.obj:错误 LNK2019:未解析的外部符号 _mm_aesdec_si128 在函数“void __cdecl AesCbc_Decode_Intel(union __m128i *,union __m128i *,unsigned __int64)”(?AesCbc_Decode_Intel@@YAXPEAT__m128i@@0_K@Z) build\lib.win-amd6 中引用-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?

编辑 没有太多答案,所以我想我会添加一些问题:

  • 当涉及到链接器错误时,您的方法是什么?

  • 有什么逻辑可以帮助我自己在网上找到答案(结合这个MSDN 链接器错误)?

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

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

非常感谢你的帮助 (:

4

1 回答 1

2

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

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 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 和对象 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

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

于 2011-02-08T05:16:54.860 回答