お役立ち

Windows10+python3.6.6でpycryptoは動かない…

  • このエントリーをはてなブックマークに追加

C++をコンパイルできない…

下記のエラーは、Windowsではじめて、Pythonの環境設定を行うときに
よく遭遇するエラーです。

error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual
C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

というのも、pythonのライブラリはc言語を利用しているものが多く、
コンパイルの必要があります。
しかし、Windowsにはデフォルトでコンパイラが入ってないため
自分で入れる必要があります。なので、C++のコンパイラを入れれば済むエラーです。
とはいえ、エラーメッセージ中のリンクが古くなっていて、
アクセスできないのは残念ですが…

解決法

下記のリンクからビルドツールをインストールするのが良いです。
Visual Studio IDEが入ってる場合は、
下記のリンクからVisual Studioのバージョンにあった
C++のビルドツールのインストーラーをダウンロードして、インストールしましょう。
https://www.microsoft.com/en-us/download/developer-tools.aspx
Visual Studio IDE入ってない場合は、インストールしましょう。
そのときの、オプションでC++のビルドツールも一緒にインストールするのが良いです。
Visual Studio Codeが紛らわしいので注意しましょう。
さらに、古いsetuptoolsはVisual Studio2017に対応していないので、
アップデートも行いましょう。
<
pre>pip install –upgrade setuptools<\pre>

ビルドツールをインストールしてもエラー…

これで解決すると思って、再度、pycryptoをインストールするもコンパイルエラーが…
構文エラーなので、ソースコードとコンパイラの相性が悪いようです。

    C:\Program Files (x86)\Windows Kits\include.0.17134.0\ucrt\inttypes.h(27): error C2061: 構文エラー: 識別子 'intmax_t'
    C:\Program Files (x86)\Windows Kits\include.0.17134.0\ucrt\inttypes.h(28): error C2061: 構文エラー: 識別子 'rem'
    C:\Program Files (x86)\Windows Kits\include.0.17134.0\ucrt\inttypes.h(28): error C2059: 構文エラー: ';'
    C:\Program Files (x86)\Windows Kits\include.0.17134.0\ucrt\inttypes.h(29): error C2059: 構文エラー: '}'
    C:\Program Files (x86)\Windows Kits\include.0.17134.0\ucrt\inttypes.h(31): error C2061: 構文エラー: 識別子 'imaxdiv_t'
    C:\Program Files (x86)\Windows Kits\include.0.17134.0\ucrt\inttypes.h(31): error C2059: 構文エラー: ';'
    C:\Program Files (x86)\Windows Kits\include.0.17134.0\ucrt\inttypes.h(41): error C2143: 構文エラー: '{' が '__cdecl' の前にありません。
    C:\Program Files (x86)\Windows Kits\include.0.17134.0\ucrt\inttypes.h(42): error C2146: 構文エラー: ')' が、識別子 '_Number' の前に必要です。
    C:\Program Files (x86)\Windows Kits\include.0.17134.0\ucrt\inttypes.h(42): error C2061: 構文エラー: 識別子 '_Number'
    C:\Program Files (x86)\Windows Kits\include.0.17134.0\ucrt\inttypes.h(42): error C2059: 構文エラー: ';'
    C:\Program Files (x86)\Windows Kits\include.0.17134.0\ucrt\inttypes.h(43): error C2059: 構文エラー: ')'
    C:\Program Files (x86)\Windows Kits\include.0.17134.0\ucrt\inttypes.h(46): error C2143: 構文エラー: '{' が '__cdecl' の前にありません。
    C:\Program Files (x86)\Windows Kits\include.0.17134.0\ucrt\inttypes.h(47): error C2146: 構文エラー: ')' が、識別子 '_Numerator' の前に必要です。
    C:\Program Files (x86)\Windows Kits\include.0.17134.0\ucrt\inttypes.h(47): error C2061: 構文エラー: 識別子 '_Numerator'
    C:\Program Files (x86)\Windows Kits\include.0.17134.0\ucrt\inttypes.h(47): error C2059: 構文エラー: ';'
    C:\Program Files (x86)\Windows Kits\include.0.17134.0\ucrt\inttypes.h(47): error C2059: 構文エラー: ','
    C:\Program Files (x86)\Windows Kits\include.0.17134.0\ucrt\inttypes.h(49): error C2059: 構文エラー: ')'
    C:\Program Files (x86)\Windows Kits\include.0.17134.0\ucrt\inttypes.h(51): error C2143: 構文エラー: '{' が '__cdecl' の前にありません。
    C:\Program Files (x86)\Windows Kits\include.0.17134.0\ucrt\inttypes.h(57): error C2143: 構文エラー: '{' が '__cdecl' の前にありません。
    C:\Program Files (x86)\Windows Kits\include.0.17134.0\ucrt\inttypes.h(64): error C2143: 構文エラー: '{' が '__cdecl' の前にありません。
    C:\Program Files (x86)\Windows Kits\include.0.17134.0\ucrt\inttypes.h(70): error C2143: 構文エラー: '{' が '__cdecl' の前にありません。
    C:\Program Files (x86)\Windows Kits\include.0.17134.0\ucrt\inttypes.h(77): error C2143: 構文エラー: '{' が '__cdecl' の前にありません。
    C:\Program Files (x86)\Windows Kits\include.0.17134.0\ucrt\inttypes.h(83): error C2143: 構文エラー: '{' が '__cdecl' の前にありません。
    C:\Program Files (x86)\Windows Kits\include.0.17134.0\ucrt\inttypes.h(90): error C2143: 構文エラー: '{' が '__cdecl' の前にありません。
    C:\Program Files (x86)\Windows Kits\include.0.17134.0\ucrt\inttypes.h(96): error C2143: 構文エラー: '{' が '__cdecl' の前にありません。
    error: command 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.15.26726\bin\HostX86\x64\cl.exe' failed with exit status 2

解決方法?

Google検索にかけてみると、ちょうど同じ問題に遭遇していて、
下記のような解決方法がありました。

I found this workaround:
http://www.xavierdupre.fr/app/pymyinstall/helpsphinx/blog/2017/2017-01-03_pycrypto.html
Really ugly solution but it works ;-).

参照元:https://github.com/dlitz/pycrypto/issues/216
回答内のリンク先では、次のように解決法は、
ソースコード(inttypes.h)を下記のように編集することでした。

#define intmax_t long long

#define uintmax_t unsigned long long

に修正。
さすがに、これは面倒なので
Pythonのバージョンを下げることにしました…

  • このエントリーをはてなブックマークに追加