Mex programming for a beginner
Afficher commentaires plus anciens
I'm having trouble learning how to use MEX files, and all of the documentation (even this one: https://www.mathworks.com/help/matlab/matlab_external/standalone-example.html#zmw57dd0e18781, which seemed simple at first but completely lost me after a couple paragraphs) is going WAY over my head.
Right now, I'm trying to use code from a .dll and I don't have the original source code, but I do have a header file with function prototypes of all of the functions that I need, all within extern "C".
So instead of changing these functions or really doing anything all that complicated, I'm just trying to use the .dll functions in my MATLAB code. Here's an example of one of my functions (I have twenty):
#include "mex.h"
#include "AllFunctions.h"
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[]){
if(nrhs != 0) {
mexErrMsgIdAndTxt("Error: myfun.c",
"Cannot have any inputs.");
}
if(nlhs != 1) {
mexErrMsgIdAndTxt("Error: myfun.c",
"One output required.");
}
double *output; //output
/* create the output matrix */
plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL);
/* get a pointer to the real data in the output matrix */
output = mxGetPr(plhs[0]);
/* call the computational routine */
myfun;
}
It has no inputs and one output. Most of my functions have a few simple inputs and one output, and a few functions pass pointers. Loadlibrary completely fails for me, and the solutions given on multiple threads do not pertain to me, so I'm trying to use MEX's instead.
I'd like to know if this is the proper approach and maybe what I should include to make this actually work before I make twenty functions that don't work. They all work in tandem with each other, so it is very difficult to test one function and then move on from there. Thanks for helping me out.
PS: Please don't tell me I need to go study MEXs more, as I am doing so as you type up your response. If there is another thing I should be looking at, I'll be very grateful. Any help is appreciated, but please don't tell me to spend my time researching (unless its something specific) before I ask beginner questions because I did a lot of research before posting this question, and I am continuing to do so afterwards.
5 commentaires
Steven Lord
le 21 Juin 2017
"Right now, I'm trying to use code from a .dll and I don't have the original source code, but I do have a header file with function prototypes of all of the functions that I need, all within extern "C"."
Based on that, my first thought would be to try using loadlibrary. Since you say "Loadlibrary completely fails for me", perhaps if you show how you're calling loadlibrary and give the full error message we can help you get that approach working.
James Tursa
le 21 Juin 2017
Modifié(e) : James Tursa
le 21 Juin 2017
Are you somehow expecting that myfun call in your mex routine to call a function by that name in your dll just because you included the header file? (It won't). When you are compiling your mex routine, are you trying to link in that dll?
Mandeguz
le 22 Juin 2017
Mandeguz
le 22 Juin 2017
Mandeguz
le 5 Juil 2017
Réponse acceptée
Plus de réponses (1)
Philip Borghesani
le 5 Juil 2017
Modifié(e) : Philip Borghesani
le 5 Juil 2017
1 vote
I suggest a two pronged approach.
- Get Loadlibrary working if at all possible. There is only one real error in your loadlibrary output (the last line) the rest are warnings caused by parsing windows.h and can safely be ignored. The error is the last line and is due to a missing #ifdef __cplusplus I think you fixed it in the header you are using for myfun for mex. Using loadlibrary will save you from writing a large number of simple mex files or a large mex file with a gateway.
- You may find that some functions are better called from a mex file. As alluded to by James Tursa, to call a dll from a mex file you must link with its corresponding library. The mex command gives information on how to link with an extra lib file. On Linux this is the same shared library that loadlibrary would use but on Windows this must be a .lib file. If you have mex configured for mingGW you may need to generate a lib file for that compiler. You were probably supplied with a lib file for Microsoft compilers.
I suggest new questions that are specific to current problems you are having with loadlibrary or mex. Solving multiple problems in a single answer causes confusion... Learning how a function is called from mex (or c) helps quite a bit in how to structure code that calls that function with loadlibrary
Catégories
En savoir plus sur Write C Functions Callable from MATLAB (MEX Files) dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


