How to Call Matlab Functions from C++

Amr Ramadan picture Amr Ramadan · Jun 21, 2011 · Viewed 19.2k times · Source

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?

Answer

GreifJG52 picture GreifJG52 · May 4, 2012

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;