最近实验室一位伊拉克博士仁兄在写paper,要做仿真。需要在c++中调用matlab里面的函数。据说matlab已经有了动态链接库供调用,但是从网上百度google了下,暂时也没有找到比较详细的教程,就打算自己编译matlab某个函数的动态库。具体流程如下,以调用matlab中sin函数为例。
其中libMySin指的是生成的动态链接库的名字,mySin是matlab文件名。
4.编写Makefile
LIBPATH 中:
是我mySin.m文件所在的路径,编译的libMySin.so动态库所在的位置
是我电脑中matlab安装的路径,matlab动态库所在的位置
ubuntu12.04下的matlab安装请参照:
http://bbs.weiphone.com/read-htm-tid-6280022.html
1.编写mySin.m
- function z = mySin(x)
- z = sin(x);
- end
2.编译libMySin.so
在matlab中打开mySin.m文件所在的路径,然后在matlab命令行中输入如下命令:
- mcc -W cpplib:libMySin -T link:lib mySin -C
其中libMySin指的是生成的动态链接库的名字,mySin是matlab文件名。
3.编写cpp文件调用mySin,文件名为MainSin.cpp,和mySin.m在同一路径下
- #include "mclmcrrt.h"
- #include "mclmcr.h"
- #include "mclcppclass.h"
- #include "matrix.h"
- #include <iostream>
- #include "libMySin.h"
- int main(void)
- {
- double a = 1.57;
- double b;
- // initialize lib,这里必须做初始化!
- if(!libMySinInitialize())
- {
- std::cout << "Could not initialize libMySin!" << std::endl;
- return -1;
- }
- // 为变量分配内存空间,可以查帮助mwArray
- mwArray mwA(1, 1, mxDOUBLE_CLASS); // 1,1表示矩阵的大小(所有maltab只有一种变量,就是矩阵,为了和Cpp变量接轨,设置成1*1的矩阵,mxDOUBLE_CLASS表示变量的精度)
- mwArray mwB(1, 1, mxDOUBLE_CLASS);
- mwA.SetData(&a, 1);
- // using mySin,调用我们自己写的函数
- mySin(1, mwB, mwA);
- // get data
- b = mwB.Get(1, 1);
- printf("sin %f is %f\n",a, b);
- // 后面是一些终止调用的程序
- // terminate the lib
- libMySinTerminate();
- // terminate MCR
- mclTerminateApplication();
- return 0;
- }
4.编写Makefile
- LIBPATH = -L/home/zk/matlab_test/mySin -L/usr/local/MATLAB/R2013b/runtime/glnxa64 -lmwmclmcrrt -lMySin
- INCLUDEPATH = -I/usr/local/MATLAB/R2013b/extern/include/
- LD_LIBRARY_PATH = /home/zk/matlab_test/mySin:/usr/local/MATLAB/R2013b/runtime/glnxa64:$LD_LIBRARY_PATH
- export LD_LIBRARY_PATH
- MainSin.o:MainSin.cpp
- g++ -c MainSin.cpp $(INCLUDEPATH)
- MainSinApp:MainSin.o
- g++ -o MainSinApp MainSin.o $(LIBPATH)
- ./MainSinApp
- MainApp
- clean:
- rm -f *.o
LIBPATH 中:
- /home/zk/matlab_test/mySi
- /usr/local/MATLAB/R2013b/runtime/glnxa64
INCLUDEPATH也是matlab安装的路径,matlab头文件所在的位置。
5.在终端执行make命令就可以看到结果啦
- make MainSinApp