Home > programming > Compiling a MEX file with Visual Studio

Compiling a MEX file with Visual Studio


1) If we are working on matrix multiplication, then after compiling the .br file we generate a .cpp like below. Modify the .cpp file directly to use the MEX API. The sections in bold are the minimum code changes necessary.

 

#include “common.h”

#include “Timer.h”

#include “mex.h”

 

static int retval = 0;

 

//int main(int argc, char** argv)

void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[])

{

 

float A<Height, Width>;

float B<Width, Height>;

float C<Height, Height>;

Start(0);

streamRead(A, inputA);

streamRead(B, inputB);

// Run the brook program here

for (i = 0; i < cmd.Iterations; ++i)

{

simple_matmult((float)Width, A, B, C);

}

 

// Write data back from stream here

streamWrite(C, output);

Stop(0);

 

 

mexPrintf(“Time to execute matrix multiplication – fast \n”);

}

 

 

2) Follow the direction below to build MEX-files with the Microsoft Visual C++ integrated development environment. These are based on:

http://www.mathworks.com/access/helpdesk/help/techdoc/index.html?/access/helpdesk/help/techdoc/matlab_external/f24338.html&http://www.mathworks.com/support/tech-notes/1600/1605.html

Compiling MEX-Files with the Microsoft® Visual C++® IDE

  1. Create a project (matrix_multiply) and insert your MEX source files. (the .cpp file above)
  2. Add mexversion.rc from the MATLAB include directory, matlab\extern\include, to the project.
  3. Create a .def file to export the MEX entry point. On the Project menu, click Add New Item and select Module-Definition File (.def). For example:
  4. On the Project menu, click Properties for the project to open the property pages.
  5. Under C/C++ General properties, add the MATLAB include directory, matlab\extern\include, as an additional include directory.
  6. Under C/C++ Preprocessor properties, add MATLAB_MEX_FILE as a preprocessor definition.
  7. Under Linker General properties, change the output file extension to .mexw32 if you are building for a 32–bit platform or .mexw64 if you are building for a 64–bit platform.
  8. Locate the .lib files for the compiler you are using under matlabroot\extern\lib\win32\microsoft or matlabroot\extern\lib\win64\microsoft. Under Linker Input properties, add libmx.lib, libmex.lib, and libmat.lib as additional dependencies.
  9. Also under Linker General, add the path to those libraries under “Additional Library Directories”. My path was: “C:\Program Files\MATLAB\R2007b\extern\lib\win32\microsoft”)
  10. Under Linker Input properties, add the module definition (.def) file you created if it is not already there).
  11. Under Linker Command Line, add the following as Additional options:
4.     LIBRARY “matrix_multiply.mexw32”
5.     EXPORTS mexFunction          <-- for a C MEX-file
6.        or
EXPORTS _MEXFUNCTION@16       <-- for a Fortran MEX-file

/export:mexFunction /dll

  1. Under Linker Debugging properties, if you intend to debug the MEX-file using the IDE, specify that the build should generate debugging information. For more information about debugging, see Debugging on the Microsoft® Windows® Platforms.

 

This should do it. Now you should have a matrix_multiply.mexw32 file created. You can execute that file in MATLAB by typing: matrix_multiply           in the folder with the file.

 

Advertisements
Categories: programming
  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: