打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
使用MATLAB的MCC命令生成C/C++程序

首先,配置MATLAB

用如下命令:

mex–setup

mbuild-setup

 

例一:将m文件转化成库文件使用

 

1、建立一个名为ceshidll.m的M函数文件,该函数的功能是输入两组数完成两组数据的插值拟合,并将结果用图形表示:

ceshidll.m文件内容如下:
function ceshidll(x,y)
a=min(x):0.1:max(x);
b = interp1(x,y,a,''spline'');%一维插值函数
plot(x,y,''*'',a,b);

2、在MATLAB Command中用如下命令编译函数ceshidll.m:
>> mcc -t -Wlibhg:dlltest -Tlink:lib -h libmmfile.mlib ceshidll.m
参数说明:
-t 将m文件编译为C\C++代码
-W libhg:dlltest 生成使用C函数图形库的文件,生成的文件名为dlltest
-T link:lib 生成库文件
-h 辅助选项,可以将任何被调用的辅助函数都包含到编译的文件中
libmmfile.mlib连接任何需要的共享函数库
ceshidll.m 被编译的文件名

编译完成后在MATLAB当前目录下会生成以下文件: ceshidll.c、ceshidll.h 、dlltest.c、dlltest.exports、dlltest.h、dlltest.mlib、dlltest.exp、dlltest.lib、dlltest.dll。其中dlltest.h、dlltest.lib和dlltest.dll文件是我们需要的。

使用方法:

 #include"matlab.h"
#include "dlltest.h"
#pragma comment(lib,"dlltest")

关键代码:

UpdateData(TRUE);        //刷新输入数据
double X[100],Y[100];
CString AA,BB,a;
int i=1;
mxArray*A=NULL;          //初始化矩阵
mxArray *B=NULL;
  AA=m_edit1;          //字符串赋值
  BB=m_edit2;
.....//将字符转化为数字
mlfEnterNewContext(0,0); //自动管理内存
dlltestInitialize();
mlfCeshidll(A,B);        //调用dll文件中函数
mxDestroyArray(A);       //释放矩阵内存
mxDestroyArray(B);
mlfRestorePreviousContext(0, 0);

 

例二:将m文件 转换成对应的C\C++文件

 

1、在MATLAB中编写如下函数: function [x]=gjfcz(A,b)
%A=[-1.5 1 2; 4 2 3 ; -3 2 8]
%b=[3;5;6]
x=A\b
保存名为gjfcz.m,该函数的功能为求解线形方程组,可参考第四章的内容。

2、在MATLAB的命令窗口输入以下命令:mcc –m gjfcz.m

该命令用来生成对应的C文件和可执行程序。在MATLAB工作目录下(一般是MATLAB\work)将会生成如下文件:gjfcz.exe,gjfcz.c,gjfcz.h,gjfcz_main.c,其中gjfcz.c,gjfcz.h是我们需要的文件。

3、新建名为JXXFC基于对话框的工程,面板上添加一个按扭。

4、拷贝gjfcz.c,gjfcz.h两文件到工程目录下,并将文件引入工程(Project->Add toProject->Files)。

5、为按扭添加如下响应代码:

void CJXXFCDlg::OnButton1()
{
  static  double Adata[]={-1.5,4,-3,1,2,2,2,3,8};
  static  double bdata[]={3,5,6};
  double  Xdata[100];
  mxArray *A = NULL;//赋初值
  mxArray *b = NULL;
  mxArray *x = NULL;

  
   mlfEnterNewContext(0, 0);

  //创建矩阵
  mlfAssign(&A, mlfDoubleMatrix(3, 3,Adata, NULL));
  mlfAssign(&b, mlfDoubleMatrix(3, 1, bdata, NULL));
  InitializeModule_gjfcz();
  x=mlfGjfcz(A,b);//调用gjfcz.c中的函数求解
  TerminateModule_gjfcz();
  memcpy(Xdata,mxGetPr(x),3*sizeof(double));  //mxGetPr(x)用来得到x的地址,从而获得matlab输出
  CString R;
  R.Format("%f\n%f\n%f",Xdata[0],Xdata[1],Xdata[2]);
  MessageBox(R);
  
  mxDestroyArray(A);
  mxDestroyArray(b);
  mxDestroyArray(x);

  
  mlfRestorePreviousContext(0, 0);

}

例三:利用图形库画图

写一个简单的m函数:

function y=huatu_test()
x=-10:0.1:10;
y=sin(x);
plot(x,y,''*'')

文件保存为huatu_test.m。

mcc -t -Wlibhg:dlltest -T link:lib -h libmmfile.mlibhuatu_test.m

 

#include "dlltest.h"

打开dlltest.h文件,里面有有关函数的定义,找到其中三个函数:

extern mxArray *mlfHuatu_test(void);
extern void dlltestInitialize(void);
extern void dlltestTerminate(void);

从函数意思不难知道它们的作用,dlltestInitialize用来初始化dll库,dlltestTerminate用来结束调用dll,mlfHuatu_test为主程序执行函数。将三个函数拷贝到button响应代码中,进行修改:

void CCeshiDlg::OnButton1()
{
dlltestInitialize();
mlfHuatu_test();
dlltestTerminate();
}

 

利用mcc命令,通过不同的参数设置可以生成不同的文件,例如:

mcc -B sgl myfun将myfun.m文件生成对应的c文件和使用c图形库的可执行程序
mcc -B sglcpp myfun将myfun.m文件生成相应的c++文件和使用c++图形库的可执行程序
mcc的参数实际上有很多,例如:

mcc -t -W main -L C -T link:exe -hlibmmfile.mlib myfun

该命令是将myfun.m生成可执行c程序

为了简化选项设置,编译器提供了宏选项,实际上上述命令利用一个参数就可以了:

mcc -m myfun

该命令和上述命令是等价的,也是用来生成可执行c程序。关于mcc命令详细参数设置可以参考MATLAB帮助文档。

大家在使用VC调用MATLAB中遇到什么问题,可以发电子邮件到c_dinco@sina.com,把遇到的问题说清楚,正在写书,同时有什么好的建议,也欢迎发邮件来。

关于程序运行的说明:

1、根据实际情况修改VC中头文件和库文件的路径;

2、如果自己编写的程序图形不能显示菜单栏和工具栏,拷贝文件夹bin到当前目录下

 

MCC MATLAB to C/C++ Compiler (Version 3.0).
MCC [-options] fun [fun2 ...] [mexfile1 ...] [mlibfile1...]

Translate fun.m to fun.c or fun.cpp, and optionally create anysupported
binary file. Write any resulting files into the current directory,by
default.

If more than one M-file is specified, a C or C++ file is generatedfor each
M-file.

If C or object files are specified, they are passed to MEX orMBUILD along
with any generated C files.

If MEX-files are specified, MCC will generate wrapper code so thatcalls can
be made from compiled M-files to the specified MEX-files. Also, ifa
MEX-file and an M-file with the same base name are located in thesame
directory, specifying the MEX-file causes MCC to use it instead ofthe
M-file. Otherwise MCC favors M-files over MEX-files.

MLIB files describe the functions in a shared library created byMCC (see -W
lib below). Specifying an MLIB file tells MCC to link to the MLIBfile's
corresponding shared library whenever it needs to use any of thefunctions
found in that library. The MLIB file and its corresponding sharedlibrary
file must be located within the same directory.

If conflicting options are presented to MCC, the rightmostconflicting
option is used.

OPTIONS:

A

Specify annotation. The following table shows valid
strings and their effects:

annotation:all (*) - All lines from source M-file appear ascomments 
in generated output file.
annotation:comments - Comments from source M-file appear ascomments in 
generated output file.
annotation:none - No text from source M-file appears ingenerated 
output file.

line:on - #line directives appear in generated outputfile 
which map lines in source M-code to linesin 
output file.
line:off (*) - No such #line directives are generated.

debugline:on - Run-time error messages report the sourcefile 
name and line number where they occurred.
debugline:off (*) - Run-time error messages do not reportany 
information about the source where they occurred.

(*) indicates default setting.

b Generate an MS Excel compatible formula function for the givenlist of M-files.

B [:[,]] Specify bundle file. is a text file containing
Compiler command line options. The Compiler behaves as if the"-B
" were replaced by the contents of the bundle file.Newlines
appearing in these files are allowed and are treated aswhitespace.
The MathWorks provides options files for the following:

ccom Used for building a C COM compatible object onWindows
(requires COM Builder)

cexcel Used for building a C MS Excel Compatable COM objecton
Windows (requires MATLAB Excel Builder)

csglcom Used for building C COM compatible object onWindows
using the C Graphics Library (requires COM Builder)

csglexcel Used for building a C MS Excel compatible object onWindows
using the C Graphics Library (requires MATLAB ExcelBuilder)

csglsharedlib
Used for building a C Graphics Library shared library

cppcom Used for building a C++ COM compatible object onWindows
(requires COM Builder)

cppexcel Used for building a C++ MS Excel Compatiable COM objecton
Windows (requires MATLAB Excel Builder)

cppsglcom Used for building C++ COM compatible object onWindows
using the Graphics Library (requires COM Builder)

cppsglexcel
Used for building a C++ MS Excel compatible object onWindows
using the Graphics Library (requires MATLAB ExcelBuilder)

cpplib Used forbuilding a C++ library

csharedlib
Used for building a C shared library

csglsharedlib
Used for building a C Graphics shared library

pcode Used for building MATLAB P-Code files.

sgl Used forbuilding stand-alone C Graphics applications.

sglcpp Used forbuilding stand-alone C++ GraphicsLibrary 
applications.

c Conly. Translate M-file to C, but do not produce a MEX-fileor 
stand-alone application. This is equivalentto "-T codegen" asthe
rightmost argument on the command line.

d Output directory. All generated files will be put in
.

F list. List the s available in the next form of thecommand,
together with their current values and a shortexplanation.

F : Typesetting format options. Assign the value to
the formatting option . See "F list" for s.

f Use the specified options file when calling MEX or
MBUILD. This allows you to use different ANSI compilers.This
option is a direct pass-through to the MEX or MBUILD script.See
"External Interfaces" for more information.

G Debug only. Simply turn debugging on, so debuggingsymbol
information is included.

g Debug. Include debugging symbol information. This optionalso
includes the -A debugline:on switch. This will have an impacton
performance of the generated code. If you wish to havedebugging
information, but do not want the performance degradation
associated with the debug line information use: -g -A
debugline:off. This option also includes the -O none switch.That
switch causes all Compiler optimizations to be turned off. Ifyou
wish to have some optimizations on, you may specify them afterthe
debug switch.

h Compile helperfunctions. All M-functions called will be compiled into theresulting MEX-file or stand-alone application.

i When generating a library include only entry points mentioned onthe
command line in the list of exported symbols.

I Include path. Add to the list of paths to search for
M-files. The MATLAB path is automatically included when runningfrom
MATLAB, but NOT when running from DOS or the Unix shell. See"help
mccsavepath".

Language. Specifies target language. can be "C" for C, "Cpp" forC++, or "P" for MATLAB P-code.

l Line. Generates code that reports file name and line numbers onrun-time errors. (Equivalent to -A debugline:on)

m Macro that generates a C stand-alone application. This isequivalent to 
the options "-t -W main -L C -h -T link:exe libmmfile.mlib", whichcan
be found in the file/toolbox/compiler/bundles/macro_option_m. 
Note: the "-h" means that helper functions will beincluded.

M "" Pass to the MBUILD or MEX script used to build an
executable. If -M is used multiple times, the rightmost occurrenceis
used.

o Output name. Set the name of the final executableoutput
(MEX or stand-alone application) to . A suitable,
possibly platform-dependent, extension is added to
(e.g., ".exe" for PC stand-alone applications, ".mexsol" forSolaris
MEX-files).

O Optimization. There are three possibilities:

:[on|off] - Turns the class on or off 
For example: -O fold_scalar_mxarrays:on

list - Lists the available optimization classes.

- Uses a bundle file called
opt_bundle_ to determine which optimizations are on oroff.
For example "-O all" looks for a bundle file calledopt_bundle_all
and uses the switches present. The current optimizationlevels
are "all" and "none". The default is to have alloptimizations
on.

p Macro that generates C++ stand-alone application. This isequivalent to
the options "-t -W main -L Cpp -h -T link:exe libmmfile.mlib",which can
be found in the file/toolbox/compiler/bundles/macro_option_p. 
Note: the "-h" means that helper functions will beincluded.

S Macro that generates Simulink C-MEX S-Function. This isequivalent to 
the options "-t -W simulink -L C -T link:mex libmatlbmx.mlib",which can
be found in the file/toolbox/compiler/bundles/macro_option_S. 
Note: the absence of "-h" means that helper functions will notbe 
included.

Translate M code totarget language. Translate any M-functions specified on the commandline to C or C++ functions. This option is included in all macrooptions. Omitting it allows the generation of wrapper C/C++ fileswithout generating the C/C++ files corresponding toM-files.

Specify target phase and type. The following table shows validstrings and their effects:

codegen - translateM-files to C/C++ files and generate a 
wrapper file. (This is the default -Tsetting.)
compile:mex - same ascodegen, plus compile C/C++ files to object
form suitable for linking into aSimulink 
S-function MEX-file.
compile:mexlibrary -same as codegen, plus compile C/C++ files to object form suitablefor linking into an ordinary (non-S-function) MEX-file.
compile:exe - same ascodegen, plus compile C/C++ files to object form suitable forlinking into a stand-alone executable.
compile:lib - same ascodegen, plus compile C/C++ files to object form suitable forlinking into a shared library/DLL.
link:mex - same ascompile:mex, plus link object files into a Simulink S-functionMEX-file.
link:mexlibrary - same as compile:mexlibrary, plus link objectfiles into an ordinary (non S-function) MEX-file.
link:exe - same as compile:exe, plus link object files into astand-alone executable.
link:lib - same ascompile:lib, plus link object files into a sharedlibrary/DLL.

u Specify that the number of inputs to a generatedSimulink
S-function should be . Valid only if either "-S" or "-W
simulink" option has also been specified.

v Verbose. Show compilation steps.

w list. List the strings allowed in the next form of thecommand,
together with the full text of the warning messages to whichthey
correspond.

w [:] Warnings. The possible options are "enable","disable",
and "error". If "enable:" or "disable:" is specified,enable
or disable the warning associated with . If "error:" is
specified, enable the warning associated with and treatany
instances of that warning as an error. If the but not ":"
is specified, the Compiler applies the action to allwarning
messages. For backward compatibility with previous Compilerrevisions,
"-w" (with no option) is the same as "-w enable".

W Wrapper functions. Specify which type of wrapper file should begenerated by the Compiler. can be one of "mex",
"main", "simulink", "lib:","com:,,", or "none"(default). For thelib wrapper, contains the name of the shared library to build. Whengenerating a "lib" wrapper, MCC also creates an MLIB filedescribing the functions in the shared library.

x Macro thatgenerates a MEX-file. This is equivalent to the options "-t -W mex-L C -T link:mexlibrary libmatlbmx.mlib", which can be found in thefile /toolbox/compiler/bundles/macro_option_x. Note: the absence of"-h" means that helper functions will not be included.

y Specify that the number of outputs from a generatedSimulink
S-function should be . Valid only if either "-S"or 
"-W simulink" option has also been specified.

Y Override default license.dat file with specified
argument.

z Specify the path to use for library and include files.
This option uses the specified path for the Compilerlibraries
instead of MATLABROOT.

? Help. Display this help message.

EXAMPLES:

Make a C translation and a MEX-file for myfun.m:
mcc -x myfun

Make a C translation and a stand-alone executable formyfun.m:
mcc -m myfun

Make a C++ translation and a stand-alone executable formyfun.m:
mcc -p myfun

Make a C translation and a Simulink S-function formyfun.m
(using dynamically sized inputs and outputs):
mcc -S myfun

Make a C translation and a Simulink S-function formyfun.m
(explicitly calling for one input and two outputs):
mcc -S -u 1 -y 2 myfun

Make a C translation and stand-alone executable for myfun.m. Lookfor
myfun.m in the directory /files/source, and put the resulting Cfiles and
executable in the directory /files/target:
mcc -m -I /files/source -d /files/target myfun

Make a C translation and a MEX-file for myfun.m. Also translate andinclude 
all M-functions called directly or indirectly by myfun.m.Incorporate the 
full text of the original M-files into their corresponding C filesas C 
comments:
mcc -x -h -A annotation:all myfun

Make a generic C translation of myfun.m:
mcc -t -L C myfun

Make a generic C++ translation of myfun.m:
mcc -t -L Cpp myfun

Make a C MEX wrapper file from myfun1.m and myfun2.m:
mcc -W mex -L C libmatlbmx.mlib myfun1 myfun2

Make a C translation and a stand-alone executable from myfun1.m andmyfun2.m
(using one mcc call):
mcc -m myfun1 myfun2

Make a C translation and a stand-alone executable from myfun1.m andmyfun2.m
(by generating each output file with a separate MCC call). Notethat the
MLIB file "libmmfile.mlib" only needs to be specified whengenerating a
wrapper file, and when linking the final executable:
mcc -t -L C myfun1 % yields myfun1.c
mcc -t -L C myfun2 % yields myfun2.c
mcc -W main -L C myfun1 myfun2 libmmfile.mlib % yieldsmyfun1_main.c
mcc -T compile:exe myfun1.c % yields myfun1.o
mcc -T compile:exe myfun2.c % yields myfun2.o
mcc -T compile:exe myfun1_main.c % yields myfun1_main.o
mcc -T link:exe myfun1.o myfun2.o myfun1_main.olibmmfile.mlib

Make a shared/dynamically linked library called "liba" from a0.mand a1.m,
where neither a0 nor a1 calls functions in libmmfile:
mcc -t -W lib:liba -T link:lib a0 a1

Make a shared/dynamically linked library called "liba" from a0.mand
a1.m, where at least one of a0 or a1 calls at least one functionin
libmmfile. Define LIBMMFILE to be 1 when compiling the Ccode.:
mcc -t -W lib:liba -T link:lib a0 a1 libmmfile.mlib -M"-DLIBMMFILE=1"

Make a C translation and a stand-alone graphics library executablefrom 
myfun.m (using one MCC call):
mcc -B sgl myfun1 

Make a C++ translation and a stand-alone graphics libraryexecutable from 
myfun.m (using one MCC call):
mcc -B sglcpp myfun1 

Make a shared/dynamically linked library called "liba" from a0.mand a1.m
that makes calls into the MATLAB C/C++ Graphics Library:
mcc -B sgl -t -W libsgl:liba -T link:lib a0 a1          
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
mcc mbuild mex
matlab mex -setup
VC 中使用MATLAB的C 数学库和MCC生成的程序
基于VC与Matlab的混合编程实现图像的三维显示
MATLAB 与 C 语言的接口
【新提醒】mex 文件中使用cuda加速matlab|MATLAB 并行计算与分布式服务器|MATLAB技术论坛
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服