Generating C/C++ Code from M-Function include MEX-File

1 回表示 (過去 30 日間)
Thomas
Thomas 2012 年 9 月 20 日
Hi. Is it possible to generating C/C++ Code and Standalone-Application from a M-Function include MEX-File?
I try it like this.
function result = callfunction %#codegen
result = uint32(0);
result = Addi_mex(2,3); %call a mex-file
end
The MEX-Function is written in C++
#include "mex.h"
#include "mexhelper.h"
void mexFunction( int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[])
{
ULONG sum=0, value1=0,value2=0;
// check Inputs
...
// Convert input data to unsigned integer via Matlab-function
...
sum = value1+value2;
plhs[0] = mmCreateMxArray(sum);
}
And Build to "Addi_mex.mexw32" with "mex -g -D_WIN32_WINNT -I ..." (MVS2010)
In the Workspace it works fine, but if I try to generate code or Standalone-Application from the function "callfunction.m" I get an error:
>> coder -build coder.prj
??? Only MATLAB files are supported for code generation. Unsupported file extension 'mexw32' for 'C:/.../coder_add/Add_mex.mexw32'.
I use the Matlab Coder. Is it maybe possible with the Matlab Compiler? And is it also possible to use in the MEX-File some other lib`s or dll`s? (in workspace seems to do)
I hope someone can help me.

採用された回答

Mike Hosea
Mike Hosea 2012 年 9 月 20 日
編集済み: Mike Hosea 2012 年 9 月 20 日
Add
coder.extrinsic('Addi_mex');
to the top of your MATLAB function, and I think it will work in MATLAB. Basically, the compiler is expecting to be given MATLAB code to compile, but when it goes to try to compile Addi_mex, it finds the binary mex file, which it can't handle. If you declare it extrinsic, the compiler never tries to compile Addi_mex, just sets up a call to it.
However, for standalone code generation, ALL inputs must be in MATLAB or C. The compiler cannot deconstruct a mex file and emit C code. For this you wouldn't use your MEX file, rather you'd write a C library that is used both by your MEX file and your coder project. Then from your MATLAB function you would call into this library using coder.ceval.
  6 件のコメント
Thomas
Thomas 2012 年 9 月 21 日
編集済み: Thomas 2012 年 9 月 21 日
Ok thank you. A little step :-) No I creat the mex file by myselfe. So I have the code and not only in binary.
function c = callfunction %#codegen
a = 6;
b = 2;
c = 0;
if isempty(coder.target)
% running in MATLAB
c = Addi(a,b); %call mex
else
% running by coding
c = coder.ceval('Addi',a,b); %call Addi from myLib.lib
end
end
No Problem my generating Code with Matlab Coder and running the exe. But creating the Addi MEX File is not longer possible.
#include "mex.h"
#include "mexhelper.h"
#include "myLib.h"
void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
double sum=0, value1=0,value2=0;
// check inputs
...
// Convert input data to unsigned integer via Matlab-function
...
//sum = value1 + value2; // that runs
sum = Addi(value1,value2); //call the same lib as used from Matlab coder
plhs[0] = mmCreateMxArray(sum);
}
Can you help me, please?
1> === building: "Addi.cpp"
1> Creating library C:\Users\EHT1LO\AppData\Local\Temp\mex_f8x8_K\templib.x and object C:\Users\EHT1LO\AppData\Local\Temp\mex_f8x8_K\templib.exp
1>Addi.obj : error LNK2019: unresolved external symbol "double __cdecl Addi(double,double)" (?Addi@@YANNN@Z) referenced in function _mexFunction
1>out\Addi.mexw32 : fatal error LNK1120: 1 unresolved externals
1>
1>C:\PROGRA~2\MATLAB\R2012A\BIN\MEX.PL : error : Link of 'out\Addi.mexw32' failed.
Mike Hosea
Mike Hosea 2012 年 9 月 21 日
編集済み: Mike Hosea 2012 年 9 月 21 日
It's been a very long time since I created a mex file "from scratch", but it looks like the mex command doesn't know about the library. Did you supply a "-l myLib" ?

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeMATLAB Coder についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by