LoginSignup
7
3

More than 3 years have passed since last update.

pycocoapiをWindowsでビルドするときに詰まったら

Last updated at Posted at 2020-03-30

Windowsで普通に pip install pycocoapi としようとして色々詰まったのでメモ。

(以下の内容は主に https://github.com/cocodataset/cocoapi/issues/51 にあるトラブルシューティング+α。Qiitaにある他の記事も参照したけど、コンパイラフラッグが足りなくてビルドがコケたので、いろいろ足した。)

基本はgitでクローンしてビルド

そもそもgitが入ってないときはgit for windows

git clone https://github.com/cocodataset/cocoapi.git

で、ビルドしようとして多分間違いなくコケる。

cd cocoapi\PythonAPI
python setup.py build_ext install

# 以下エラーメッセージがいろいろ

ので、ここからはエラーメッセージの内容に応じてトラブルシューティング。

1. cl.exe がない

error: command 'cl.exe' failed: No such file or directory みたいなエラーメッセージが出たら、cl.exeがPATHにない。

一番簡単な解決法は、Visual Studioをインストールして、開発者コマンドプロンプトを使う。(インストールの仕方はいろんな記事があるのでそちらを参照。)

ちなみに開発者コマンドプロンプトにはいろんな種類があるが、今回はx64 Native Toolsコマンドプロンプトを使う。

起動するには、Visual Studioをインストールした上で、検索バーでx64 Nativeと打てば出てくる。

SnapCrab_NoName_2020-3-30_12-36-21_No-00.png

2. Wno-cpp が使えない

さて、VS2017用 x64 Native Toolsコマンドプロンプトを起動して、

cd cocoapi\PythonAPI # cocoapiをgitでクローンしたパス
python setup.py build_ext install

を実行すると、invalid numeric argument '/Wno-cpp' みたいなエラーメッセージが出る。(ちなみにそれ以前にpythonがないというエラーが出る場合は、pythonのPATHが通っていない。)

なので、cocoapi\PythonAPI\setup.pyの14行目あたりにある、extra_compile_argsを以下のように空にする。

extra_compile_args=[],
#extra_compile_args=['-Wno-cpp', '-Wno-unused-function', '-std=c99'],

書き換えたら再度トライ。

3. math.h がない、basetsd.h がない等々

今度はヘッダファイルが足りないと言われるので、さらにcocoapi\PythonAPI\setup.pyinclude_dirsを以下のように書き換える。

include_dirs = [np.get_include(), '../common', 'C:/Program Files (x86)/Windows Kits/10/Include/10.0.17763.0/ucrt', 'C:/Program Files (x86)/Windows Kits/10/Include/10.0.17763.0/winrt','C:/Program Files (x86)/Windows Kits/10/Include/10.0.17763.0/um','C:/Program Files (x86)/Windows Kits/10/Include/10.0.17763.0/shared'],
#include_dirs = [np.get_include(), '../common'],
  • ※1: 10.0.17763.0 の部分はWindowsのバージョンによって異なるので、エクスプローラーで C:\Program Files (x86)\Windows Kits\10\Include の中身を確認して存在するバージョンに書き換える必要がある。
  • ※2: もし C:\Program Files (x86)\Windows Kits の中身が存在しない場合は、Visual Studio InstallerからWindows 10 SDKを追加する必要がある。

4. kernel32.lib がない

さて今度はリンカフラッグが足りないので、include_dirsの次の行に以下を書き足す

library_dirs = ['C:/Program Files (x86)/Windows Kits/10/Lib/10.0.17763.0/um/x64','C:/Program Files (x86)/Windows Kits/10/Lib/10.0.17763.0/ucrt/x64'],

10.0.17763.0の部分に関しては先程と同様。(もしx64コマンドプロンプトじゃなくてx86コマンドプロンプトを使ってる場合は、x64をx86に書き換える必要があると思う。)

ちなみに最終的なsetup.pyはこんな感じ。

from setuptools import setup, Extension
import numpy as np

# To compile and install locally run "python setup.py build_ext --inplace"
# To install library to Python site-packages run "python setup.py build_ext install"

ext_modules = [
    Extension(
        'pycocotools._mask',
        sources=['../common/maskApi.c', 'pycocotools/_mask.pyx'],
        include_dirs = [np.get_include(), '../common', 'C:/Program Files (x86)/Windows Kits/10/Include/10.0.17763.0/ucrt', 'C:/Program Files (x86)/Windows Kits/10/Include/10.0.17763.0/winrt','C:/Program Files (x86)/Windows Kits/10/Include/10.0.17763.0/um','C:/Program Files (x86)/Windows Kits/10/Include/10.0.17763.0/shared'],
        library_dirs = ['C:/Program Files (x86)/Windows Kits/10/Lib/10.0.17763.0/um/x64','C:/Program Files (x86)/Windows Kits/10/Lib/10.0.17763.0/ucrt/x64'],
        extra_compile_args=[],
    )
]

setup(
    name='pycocotools',
    packages=['pycocotools'],
    package_dir = {'pycocotools': 'pycocotools'},
    install_requires=[
        'setuptools>=18.0',
        'cython>=0.27.3',
        'matplotlib>=2.1.0'
    ],
    version='2.0',
    ext_modules= ext_modules
)

5. rc.exe がない

これが最後の砦。C:\Program Files (x86)\Windows Kits\10\bin\x64 をPATHに追加して、もう一度x64 Native Toolsコマンドプロンプトを開き直し、同じコマンドを実行すればOK。

( もしPATHにこのフォルダを追加したくない場合は、中にある rc.exercdll.dll だけをコピーしてPATHの通ったフォルダに置けばOK。)

6. やっとビルドが通る

あぁ長い道のりだった。ちゃんとインストールできてるかは以下のコマンドでわかる。

python
>>> from pycocotools.coco import COCO
>>> 

エラーが出なければOK。

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3