2009年12月27日日曜日

Windows7 64bit で matlab の mex ファイルをコンパイル

windows7 64 bit で matlab の mex ファイルをコンパイルしようとしたのだが、上手くいかない。使用した matlab は、少し古いが matlab 2007b、また、c compiler は visual c++ 2008 express edition 以下に示す解決方法は、他のバージョンでは試していないが、もしかしたら他のバージョンでも役に立つかもしれない。

matlab centralに似た記事があったので、ダウンロードして試してみたが、64bit版では動作しないことがユーザーコメントに書かれている。自分の環境ではもしやと思って試してみたが、そのままではダメだった。ということで、同様の方法で、matlab_DIR\bin\win64\mexopts 以下に、改良した、msvc90freeopts.bat を作ることにした。

改良したものは下記の通りである。なお、環境変数に、MSSdkを追加し、値は microsoft windows sdk のインストールディレクトリを代入している。

もしかしたら多少おかしい部分があるかもしれないが、自分の環境ではこれで 64bit mex ファイルのコンパイルに成功したので、何かの役に立てばと思い、公開しておく。

基本的に、編集する必要があるのは、VCINSTALLDIR, INCLUDE, LIB, MW_TARGET_ARCH, LINKFLAGSのMACHINEオプション等だけである。これを自分の環境に合わせて書いてしまえば問題ないと思われる。


@echo off
rem msvc90freeopts.BAT
rem
rem Compile and link options used for building MEX-files
rem using the Microsoftョ Visual C++ 2008 Express Edition compiler.
rem
rem $Revision: 1.1.8.1 $ $Date: 2006/11/19 18:53:45 $
rem
rem ********************************************************************
rem General parameters
rem ********************************************************************
echo msvc90freeopts.BAT
set MATLAB=%MATLAB%
set VS90COMNTOOLS=%VS90COMNTOOLS%
set VSINSTALLDIR=%VS90COMNTOOLS%\..\..
set VCINSTALLDIR=%VSINSTALLDIR%\VC
set MSSdk=%MSSdk%
set LINKERDIR=%MSSdk%
set PATH=%VCINSTALLDIR%\BIN\amd64;%LINKERDIR%\bin\x64;%VSINSTALLDIR%\Common7\IDE;%VSINSTALLDIR%\Common7\Tools;%VCINSTALLDIR%\VCPackages;%MATLAB_BIN%;%PATH%
set INCLUDE=%VCINSTALLDIR%\INCLUDE;%LINKERDIR%\INCLUDE;%INCLUDE%
set LIB=%VCINSTALLDIR%\LIB\amd64;C:\Program Files\Microsoft SDKs\Windows\v7.0\lib\x64;%MATLAB%\extern\lib\win64;%LIB%
set MW_TARGET_ARCH=win64

rem ********************************************************************
rem Compiler parameters
rem ********************************************************************
set COMPILER=cl
set COMPFLAGS=/c /Zp8 /GR /W3 /EHsc- /Zc:wchar_t- /DMATLAB_MEX_FILE /nologo
set OPTIMFLAGS=/MD /O2 /Oy- /DNDEBUG
set DEBUGFLAGS=/MD /Zi /Fd"%OUTDIR%%MEX_NAME%%MEX_EXT%.pdb"
set NAME_OBJECT=/Fo

rem ********************************************************************
rem Linker parameters
rem ********************************************************************
set LIBLOC=%MATLAB%\extern\lib\win64\microsoft
set LINKER=link
set LINKFLAGS=/dll /export:%ENTRYPOINT% /MAP /LIBPATH:"%LIBLOC%" libmx.lib libmex.lib libmat.lib /implib:%LIB_NAME%.x /MACHINE:AMD64 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
set LINKOPTIMFLAGS=
set LINKDEBUGFLAGS=/DEBUG /PDB:"%OUTDIR%%MEX_NAME%%MEX_EXT%.pdb"
set LINK_FILE=
set LINK_LIB=
set NAME_OUTPUT=/out:"%OUTDIR%%MEX_NAME%%MEX_EXT%"
set RSP_FILE_INDICATOR=@

rem ********************************************************************
rem Resource compiler parameters
rem ********************************************************************
set RC_COMPILER=rc /fo "%OUTDIR%mexversion.res"
set RC_LINKER=

set POSTLINK_CMDS=del "%OUTDIR%%MEX_NAME%.map"
set POSTLINK_CMDS1=del %LIB_NAME%.x
set POSTLINK_CMDS2=mt -outputresource:"%OUTDIR%%MEX_NAME%%MEX_EXT%";2 -manifest "%OUTDIR%%MEX_NAME%%MEX_EXT%.manifest"
set POSTLINK_CMDS3=del "%OUTDIR%%MEX_NAME%%MEX_EXT%.manifest"