I would like to convert MATLAB files into a C++ shared library that can be called from my BORLAND C++ Builder Version 6.0 project. I would like to see a complete example that lists the steps necessary to do this.
MATLAB: How to use a C++ shared library that was generated with MATLAB Compiler 4.5 (R2006b) using Borland C++ Builder Version 6.0
borlandlibraryMATLAB Compilershared
Related Solutions
This example shows how to generate a C++ shared library with MATLAB Compiler 4.0 (R14) and use it in an MSVC 6.0 project.
1. Execute:
mbuild -setup
from the MATLAB command prompt and select the MSVC 6.0 compiler.
2. Copy these files from $MATLABROOT/extern/examples/compiler to your build directory:
$MATLABROOT/extern/examples/compiler/addmatrix.m
$MATLABROOT/extern/examples/compiler/multiplymatrix.m
$MATLABROOT/extern/examples/compiler/eigmatrix.m
$MATLABROOT/extern/examples/compiler/matrixdriver.cpp
(where $MATLABROOT is the MATLAB root directory on your machine, as returned by typing
matlabroot
at the MATLAB Command Prompt.)
3. To create the C++ shared library, use:
mcc -W cpplib:libmatrixp -T link:lib addmatrix.m multiplymatrix.m eigmatrix.m -v
4. Start the Microsoft Visual C/C++ 6.0 IDE.
5. From the File menu, select New. Click on the Projects tab. Select Win32 Console Application. In the Project Name field, type "matrixdriver". Also, verify that Create new workspace is filled in and that Win32 is checked in the Platforms field. Click OK.
6. Choose Empty Project as the console application to create, then click Finish, and then click OK.
7. Select the File View tab in the left-hand frame and double-click on matrixdriver files. Select Source Files in the tree underneath matrixdriver files, and then select Project from the menubar. In the dropdown menu, select Add to Project and then click on Files. Select the matrixdriver.cpp file that resides in your build directory from step 2.
8. Right-click on matrixdriver files and select Add Files to Project. Navigate to the directory in which you compiled the shared library and select:
libmatrix.lib
Also, add the following file located in $MATLABROOT\extern\lib\win32\microsoft\msvc60:
mclmcrrt.lib
In MATLAB 7.2 (R2006a) and later, this file is located in $MATLABROOT\extern\lib\win32\microsoft.
9. Highlight test files and right-click. Select Settings. Click on the C/C++ Tab. In the Category listbox select Code Generation. In the Use Runtime library listbox, select Multithreaded DLL.
Now change the Category listbox to Preprocessor. Add to the Additional include directories field:
$MATLABROOT\extern\include
Also add to the Additional include directories field the directory in which libmatrix.h is located. This should be your work directory from step 2. Click OK.
10. Select Build from the menubar and in the dropdown menu select Rebuild All.
11. You should now have built matrixdriver.exe.
12. Before executing matrixdriver.exe, you may need to place libmatrix.dll and libmatrix.ctf (created in step 3) in the same location as matrixdriver.exe.
The steps to create a C shared library from within MATLAB are:
1. Select the compiler to be used by MCC:
mbuild -setup
2. Compile your MATLAB files into a DLL (on Windows):
mcc -B csharedlib:mylib <MATLAB files>
The -B csharedlib option is a bundle option that expands into
-W lib:<libname> -T link:lib
The -W lib:<libname> option tells the MATLAB Compiler to generate a function wrapper for a shared library and call it libname. The -T link:lib option specifies the target output as a shared library.
Note the directory where the Compiler puts the shared library because you will need it later on. This step will produce mylib.dll, mylib.lib, and mylib.h. You can add the -g option to produce a DLL suitable for debugging in MSVC (or your own IDE).
Alternatively, you may also use DEPLOYTOOL and choose C Shared library as the target to achieve this.
3. Add mylib.lib to your MSVC (or your own IDE) project.
4. Make sure to call the initialization and termination routines from your code before calling any of the exported DLL functions.
To initialize the shared library and the MCR, you need to call:
mclInitializeApplication(NULL,0);mylibInitialize();
Afterwards, you should call the termination routine:
mclTerminateApplication();mylibTerminate();
5. You can call the functions compiled from the MATLAB code by invoking the exported DLL functions from your C code. For example:
Example:
In MATLAB:
1. Write a MATLAB function named foo and save it as foo.m with the following code:
function y = foo(x)y = x+1;
2. Select the compiler to be used by MCC:
mbuild -setup
3. Use the MATLAB Compiler to compile foo.m into C code that can be included in a C shared library:
mcc -B csharedlib:foolib foo.m
This will generate the following files:
foolib.ctf
foolib.h
foolib.dll
foolib.lib
foolib.exp
foolib_mcc_component_data.c
foolib.c
foolib.exports
In Microsoft Visual 2010 Express Edition
1. Start the Microsoft Visual 2010 Express Edition IDE.
2. Go to FILE and NEW. In the Project Types field, select Visual C++ Projects. In the Templates field, select Win32 Console Project. In the Name field type "test". Click OK. In the Win32 application Wizard, select Application Settings. Under Additional Options, check Empty project. Click Finish.
3. Select the Solution Explorer tab. Select Source Files, select Project menu option, select Add New Item. In the Templates tab select C++ Source file, type "foowrap.c" in the File name field and click Open.
4. Enter the following code in the foowrap.c file:
/* Include the MCR header file and the library specific header file* as generated by MATLAB Compiler */#include "mclmcr.h" #include "foolib.h"#include <stdio.h>int main(){mxArray *x_ptr;mxArray *y_ptr=NULL;double *y;double ret;/* Call the MCR and library initialization functions */if( !mclInitializeApplication(NULL,0) ){fprintf(stderr, "Could not initialize the application.\n");exit(1);}if (!foolibInitialize()){fprintf(stderr,"Could not initialize the library.\n");exit(1);}/* Create an mxArray to input into mlfFoo */x_ptr = mxCreateDoubleScalar(1);/* Call the implementation function *//* Note the second input argument should be &y_ptr instead of y_ptr*/mlfFoo(1,&y_ptr,x_ptr);/* The return value from mlfFoo is an mxArray so we must extract the data from it */y = mxGetPr(y_ptr);ret = *y;/* Print a double precision number*/printf("The output of foo is %f\n",ret);/* Call the library termination function */foolibTerminate();mxDestroyArray(x_ptr);mxDestroyArray(y_ptr);mclTerminateApplication();return 0;}
5. Select your project in the Solution Explorer. From Project menu option, select Properties. Open the Linker folder and select the General category. Add the location of foolib.lib and the following
$MATLABROOT\extern\lib\<arch>\microsoft\msvc71
in the Additional Library Directories field. Note $MATLABROOT is the MATLAB root directory on your machine, as returned by typing
matlabroot
at the MATLAB Command Prompt.
For example, you may have
c:\foo;$MATLABROOT\extern\lib\<arch>\microsoft\msvc71
in the Additional Library Directories field.
Note that for MATLAB releases starting with MATLAB 7.2 (R2006a), there are no subfolders under
$MATLABROOT\extern\lib\<arch>\microsoft
Therefore add this folder instead of
$MATLABROOT\extern\lib\<arch>\microsoft\msvc71
if you are using MATLAB 7.2 or later.
6.After specifying the library directories, select the Input category and type the following libraries in the Additional Dependencies field:
mclmcrrt.lib
foolib.lib
7. Open C/C++ folder, select General. Add to Additional Include directories field:
$MATLABROOT\extern\include
Also add to the Additional Include directories field the directory in which foolib.h is located.
8.Under C/C++ folder, select Code Generation. In the Runtime Library, select Multi-threaded DLL. Click OK.
9. Check the target machine flag in Visual Studio: This should correspond to the libraries that you are linking against. For example, if you specify ’x64’, it should link against the 64-bit MATLAB libraries. If you specify 'Win32', it should link against 32-bit MATLAB libraries.
For additional information on how the target platform of the Visual Studio project can be changed, refer to
"How to: Configure Visual C++ Projects to Target 64-Bit Platforms" at:
<http://msdn2.microsoft.com/en-us/library/9yb4317s(VS.80).aspx>
10. Go to Build->Build Solution. You should now have built test.exe.
Please make sure to choose 'x64' option from the drop down menu for the 'Solution Platform' window in Visual Studio before building your project if you are linking against '64 bit' libraries.After building the project, an additional folder named 'x64' will be created in your current project working directory and your executable will be placed in it.
11. Place foolib.dll in folder where test.exe is located, if you have changed the Visual Studio Platform to 64bit then your executable will be in a folder 'x64'.
12. Run your application.
NOTE: The <arch> folder mentioned above referred to "win32" or "win64" folder depending on whether you want to create a 32 bit or 64 bit C shared library respectively.
Related Question
- Is there an example on how to use C++ shared libraries with Microsoft Visual C++ 2005 Professional or Express editions
- How to create a C shared library with MATLAB Compiler 4.4 that can be used in a Microsoft Visual Studio 2005 win32 Console Application
- Unable to build a shared library
- How to create a C shared library with MATLAB Compiler 4.0 (R14) that can be used in a Microsoft .NET 2003 project
- Am I unable to generate a C++ shared library using a Borland compiler and MATLAB Compiler 4.0 (R14)
- How to create a C/C++ shared library with MATLAB Compiler that can be used in a Microsoft Visual C++ 2005 project using Windows Forms Application
- Does mclInitializeApplication() fail if I use different compiler flags than MBUILD does in MATLAB Compiler 4.3 (R14SP3)
- How to compile a MATLAB Engine Fortran application using Microsoft Visual Studio 2008, Intel Visual Fortran 11.1 and MATLAB 7.10 (R2010a)
Best Answer