Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Call Matlab Functions from C++

I want to call MATLAB function in my C++ project.

I'm using Matlab R2010a and Visual Studio 2010

First I created a simple matlab function:

function y = foo(x)
    y = x+1;

and then I used matlab compiler to compile this function using matlab GUI compiler (File-> new -> Deployment Project and then choose C++ shared Library). It produces this files 2 folders: distrib and src.

distrib contains:

  1. foo.dll
  2. foo.h
  3. foo.lib

src contains :

  1. foo.cpp
  2. foo.dll
  3. foo.exp
  4. foo.exports
  5. foo.h
  6. foo.lib
  7. foo_mcc_component_data.c

I want to use this file in a C++ application. I tried many times and I didn't find a way. All the ways I found over the internet are using old matlab compiler which produces different files or works on an old version of visual studio.

So please could anyone help me?

What must I do? What files/references must I add and to where? What paths must I define?

like image 966
Amr Ramadan Avatar asked Jun 21 '11 17:06

Amr Ramadan


2 Answers

maybe it is too late but for the future.

Include foo.h.

Add C/C++-General-Additional Include Directories the way to the matlab headers (C:\Program Files (x86)\MATLAB\R2009b\extern\include).

Add foo.lib, mclmcrrt.lib and mclcommain.lib for Linker in Additional Dependencies.

For linker in Additional Library Directories show the way to your matlab libs(C:\Program Files (x86)\MATLAB\R2009b\extern\lib\win32\microsoft for 32bit ver (matlab and VS versions should be the same. I had to install the second Matlab 32bit version.)).

I added the way to the foo.lib in my system path.

Before using your library foo.dll, you should initialize MCR and library function.

mclInitializeApplication(NULL,0);
fooInitialize(); 

After using don't forget:

mclTerminateApplication();
fooTerminate();

And some demonstration code, looks like:

int num = 1;
double numbrIn = 1.5;
std::cout<<"now we have " << numbrIn << std::endl;
mwArray array_in(num, 1, mxDOUBLE_CLASS, mxREAL);
array_in.SetData(&numbrIn,num);
mwArray array_out;
foo(1, array_out, array_in);
array_out.GetData(&numbrIn, num);
std::cout<<"now we have " << numbrIn << std::endl;
like image 77
GreifJG52 Avatar answered Sep 20 '22 16:09

GreifJG52


The files foo.h and foo.lib will be required to compile your application. The foo.dll file will need to be shipped with your resulting application, usually in the same directory.

If you put the foo.h file in the same directory as your source files, you won't need to do anything special to #include "foo.h". You can also add the direct path to foo.lib in the external linker dependencies.

If you want to store these files outside of your project folder and/or re-use these files in other applications, you can read up on VC++ Directories, Projects and Solutions.

Edit: You probably also need to add the MATLAB libraries to your include and library paths. Check out the MathWorks support solution Why do I receive the error 'Could not find include file "mclmcrrt.h"' when trying to compile a stand-alone application?

like image 42
André Caron Avatar answered Sep 19 '22 16:09

André Caron