LoginSignup
8
5

More than 5 years have passed since last update.

64bit Anaconda に cvxopt をインストールする

Last updated at Posted at 2016-02-26

概要

Windowsで 64bit版 の Anacondacvxopt をインストールしようと思ったら非常に苦労したので作業内容をまとめる.

cvxopt のドキュメントには Windows へのインストール方法 が書かれている.しかし,32bit 版の Python を想定しているらしく,ドキュメント通りにすんなりとインストールは出来ないので注意.本稿は,このドキュメントに沿って変更すべき点をまとめる.

想定環境

  • Windows 10 (64bit)
  • Anaconda for 64bit Windows (Python2.7)
  • MinGW (64bit)

これらは既にインストールされているものとする.

なお,以降の作業は専用のディレクトリを作って,その中で行うものとする.例として D:\glpk 内で行う場合は,次のようにすればコマンドプロンプトを開くことができる.
84CEE4CD-2BB7-40D7-B2EA-4A2596B8E1A2.png

依存ライブラリの準備

これは ドキュメント 通りで良い.

BLAS

BLAS のソースファイル をダウンロードする.そして,コマンドプロンプトから次のコマンドを実行する.

$ tar -xvf blas.tgz
$ cd BLAS-3.5.0
$ sed 's/_LINUX/_WIN/' make.inc -i
$ make && cp blas_WIN.a ../libblas.a
$ cd ..

ただし,2行目のディレクトリ名は取得した BLAS ソースファイルのバージョンによって変わるので適宜読み替える.

LAPACK

LAPACK のソースファイル をダウンロードする.そして,コマンドプロンプトから次のコマンドを実行する.

$ tar -xvf lapack-3.5.0.tgz
$ cd lapack-3.5.0
$ cp make.inc.example make.inc
$ make lapacklib && cp liblapack.a ..
$ cd ..

もし,libquadmath-0.dll が無いと言われたら,ここ からダウンロードして MinGW/bin(デフォルトだと C:\MinGW\bin だと思われる) に置いてから上記コマンドを実行する.

CVXOPT のコンパイル

ここからが本番.CVXOPT のソースファイル をダウンロードする.そして,コマンドプロンプトから次のコマンドを実行する.ファイル名やフォルダ名はバージョンによって変わるので適宜読み替える.

$ tar -xvf cvxopt-1.1.8.tar.gz
$ cd cvxopt-1.1.8/src

setup.py を開いて,

  • 12行目あたりにある BLAS_LIB 変数の初期化を BLAS_LIB = ['blas','gfortran'] に変更
  • 9行目あたりにある BLAS_LIB_DIR 変数の初期化を BLAS_LIB_DIR = '.' に変更

次に,distutils パッケージの cygwinccompiler モジュールを編集する.Anaconda が c:\Anaconda にある場合,c:\Anaconda\Lib\distutils\cygwinccompiler.py を開く.もし,このファイルに -mno-cygwin という文字列があればすべて削除する.(手元の環境では無かった)

libpython27.a と libmsvcr90.a の作成

後の処理で必要な,Linux の静的ライブラリ libpython27.alibmsvcr90.a が,デフォルトでは用意されていないので Windows 用のライブラリから変換する.

まず,変換用のツールをインストールする.

$ mingw-get install pexports

次に,Anaconda ディレクトリ(例えば c:\Anaconda)にある python27.dllmsvcr90.dll を cvxopt の setup.py があるディレクトリにコピーする.

libpython27.a の作成は次のコマンドを実行すれば良い.

$ pexports python27.dll > python27.def
$ dlltool --dllname python27.dll --def python27.def --output-lib libpython27.a

libmsvcr90.a の作成はもう少し複雑である.まず,

$ pexports msvcr90.dll > msvcr90.def

を実行し,できた msvcr90.def をテキストエディタで開く.そして,304〜314行目付近にある,

  • _decode_pointer という行を ;_decode_pointer
  • _encode_pointer という行を ;_encode_pointer

修正する.その後,

dlltool --dllname msvcr90.dll --def msvcr90.def --output-lib libmsvcr90.a

を実行する.出来上がった libpython27.alibmsvcr90.a は,Anaconda の libs フォルダにもコピーしておく.
その際,もし libs ディレクトリに python27.lib があれば python27.lib_ に変更しておく.

ソースコードの修正

オリジナルのソースコードのままではエラーが出るので,次のファイルを修正する必要がある.

src/C/cholmod.c

31行目付近の

cholmod.c
/* defined in pyconfig.h */
#if (SIZEOF_INT < SIZEOF_LONG)
#define CHOL(name) cholmod_l_ ## name
#else
#define CHOL(name) cholmod_ ## name
#endif

cholmod.c
/* defined in pyconfig.h */
// #if (SIZEOF_INT < SIZEOF_LONG)
#define CHOL(name) cholmod_l_ ## name
// #else
// #define CHOL(name) cholmod_ ## name
// #endif

に修正.

src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config.h

155行目付近にある下記のコードを削除する.

SuiteSparse_config.h
#ifndef NTIMER
#ifdef _POSIX_C_SOURCE
#if    _POSIX_C_SOURCE >= 199309L
#define SUITESPARSE_TIMER_ENABLED
#endif
#endif
#endif

src/C/amd.c

27行目付近にある,

amd.c
#if (SIZEOF_INT < SIZEOF_LONG)
#define amd_order amd_l_order
#define amd_defaults amd_l_defaults
#endif

amd.c
//#if (SIZEOF_INT < SIZEOF_LONG)
#define amd_order amd_l_order
#define amd_defaults amd_l_defaults
//#endif

に修正.

コンパイルとインストール

ここまでして,ようやく次のコマンドでコンパイルできる.

$ python setup.py build --compiler=mingw32

インストールするためには,Anaconda の Lib/distutilsdistutils.cfg を作成し次の内容を記入する.

distutils.cfg
[build]
compiler=mingw32

その後,インストールする.

$ python setup.py install
8
5
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
8
5