2

この質問は著者のウェブサイトにすでに投稿していますが、ここでも質問するかもしれないと思いました。

私はこのセットアップでpylzmaをインストールしようとしています:

  • Windows 7 x64
  • Python 2.6.6 x64
  • Windows Server2003SDKからのamd64コンパイラ
  • gitリポジトリのクローンを作成しました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 / 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:'関数':互換性のない型-'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で失敗しました

それからグーグルした後、私はそれがコンパイラー(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 / 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 \ 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 \ 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.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:未解決の外部シンボル "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.obj:エラーLNK2019:未解決の外部シンボル "void __cdecl AesCbc_Encode_Intel(unsigned int *、unsigned char *、unsigned __int64)"(?AesCbc_Encode_Intel @@ YAXPEAIPEAE_K @ Z)関数AesGenTablesで参照

AesOpt.obj:エラーLNK2019:関数 "void __cdecl AesCbc_Encode_Intel(union __m128i *、union __m128i *、unsigned __int64)"(?AesCbc_Encode_Intel @@ YAXPEAT__

AesOpt.obj:エラーLNK2019:関数 "void __cdecl AesCbc_Encode_Intel(union __m128i *、union __m128i *、unsigned __int64)"(?AesCbc_Encode_Intel @@ YAXPEAT__

AesOpt.obj:エラーLNK2019:関数 "void __cdecl AesCbc_Decode_Intel(union __m128i *、union __m128i *、unsigned __int64)"(?AesCbc_Decode_Intel @@ YAXPEAT__

AesOpt.obj:エラーLNK2019:関数 "void __cdecl AesCbc_Decode_Intel(union __m128i *、union __m128i *、unsigned __int64)"(?AesCbc_Decode_Intel @@ YAXPEAT__ -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としてコンパイルすることは可能ですか?

編集 あまり答えがないので、いくつか質問を追加すると思います。

  • リンカーエラーに関しては、どのようなアプローチをとっていますか?

  • Web上で答えを見つけるのに役立つロジックはありますか(このMSDNリンカーエラーと組み合わせて)?

  • 多くの人が32ビットシステムで正常にコンパイルするのを見てきましたが、64ビットで正常にコンパイルできますが、アーキテクチャタイプが原因でリンクに関して失敗する可能性はありますか?

私は完全に機能する答えよりも役立つかもしれないヒントをもっと探しています。

あなたの助けをどうもありがとう(:

4

1 に答える 1

2

これを自分で試すために、ピルズマをインストールしました。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 に変更すると、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 およびオブジェクト 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 に答える