Jun 17, 2009

matlab mex

For linux:

因为 matlab 对 gcc 的版本敏感。
参见 gcc 版本问题 一文。

修改
/opt/matlab/bin/gccopts.sh

找到对应 Arch
修改如下变量

GCC_LIBDIR
CC
CXX
FC

如要 c, fortran 混编,需要在 lib 中加入 -lg2c,这个库使得c能调用 fortran 编译得到的object.

修改后,别忘了再次执行
mex -setup

以下是一个例子,对于不同 Matlab 版本可能不一样。
GCC_LIBDIR=`gcc34 -v 2>&1 | awk '/.*Reading specs.*/ {print substr($4,0,length($4)-6)}'`
            ;;
        glnx86)
#----------------------------------------------------------------------------
            RPATH="-Wl,-rpath-link,$TMW_ROOT/bin/$Arch"
            CC='gcc34'
            CFLAGS='-fPIC -ansi -D_GNU_SOURCE -pthread -fexceptions -m32'
            CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64" 
            CLIBS="$RPATH $MLIBS -lm -lstdc++ -lg2c"
            COPTIMFLAGS='-O -DNDEBUG'
            CDEBUGFLAGS='-g'
#           
            CXX='g++34'
            CXXFLAGS='-fPIC -ansi -D_GNU_SOURCE -pthread '
            CXXFLAGS="$CXXFLAGS -D_FILE_OFFSET_BITS=64" 
            CXXLIBS="$RPATH $MLIBS -lm"
            CXXOPTIMFLAGS='-O -DNDEBUG'
            CXXDEBUGFLAGS='-g'
#
#
            FC='g77'
            FFLAGS='-fPIC -fexceptions'
            FLIBS="$RPATH $MLIBS -lm"
            FOPTIMFLAGS='-O'
            FDEBUGFLAGS='-g'
#
            LD="$COMPILER"
            LDEXTENSION='.mexglx'
            LDFLAGS="-pthread -shared -m32 -Wl,--version-script,$TMW_ROOT/extern/lib/$Arch/$MAPFILE -Wl,--no-undefined"
            LDOPTIMFLAGS='-O'
            LDDEBUGFLAGS='-g'
#
            POSTLINK_CMDS=':'
#----------------------------------------------------------------------------
            ;;
        glnxa64)

编译 fortran

unix 中可以使用
mex -fortran foo.f


For windows:
若使用 gnumex
matlab 中
>> gnumex
选择编译器,生成mexopts.sh,并修改这个文件。

编译命令例子
mex -c -cxx arrayofmatrices.cpp
mex -c -cxx matlabexception.cpp
mex -c -cxx matlabprogram.cpp
mex -c -cxx matlabstring.cpp
mex -c -cxx lbfgsb.cpp
mex -c -cxx matlabmatrix.cpp
mex -c -cxx matlabscalar.cpp
mex -c -cxx program.cpp
mex -c -fortran solver.f

mex -output lbfgsb arrayofmatrices.o  matlabexception.o  matlabprogram.o  matlabstring.o  solver.o lbfgsb.o    matlabmatrix.o     matlabscalar.o   program.o


A tutorial
that may help.

0 comments: