matlabm编译
⑴ 如何将MATLAB程序编译成独立可执行的程序
一、生成独立可执行的程序(exe文件)步骤
1、安装编译器。可有多种选择,matlab自带了一个LCC,推荐使用VC++6.0,我基于VS 2003实现。
2、设置编译器。在matlab命令行输入mbuild –setup以及mex –setup,选择安装的c编译器。
3、调用编译器。此处使用MATLAB下的一个GUI平台deploytool下完全实现。在命令窗口输入deploytool即可看到。具体使用方法请Help。
当然,也可以输入mcc -m filaname, filaname为要转成exe的m文件;
注:在以前的版本中,用编译命令mcc -B sglcpp filaname;自2006的版本后,替换为mcc
-mfilaname;
4、安装<matlab
path>\toolbox\compiler\deploy\win32目录下的MCRInstaller。
二、脱离matlab运行可执行程序
MCR是由matlab的运行环境,占用不到300M的对于用不同matlab版本生成的exe文件,MCR版本也会有不同,因此,在程序打包时,最好将相应版本的MCR一起打包。MCR环境的设置文件存放目录如下:
<matlab path>
\toolbox\compiler\deploy\win32
文件名为MCRInstaller.exe。可将其拷贝到自己的文件夹中,(7.0以前的版本是mglinstaller.exe)。
在MATLAB里运行可执行程序的办法是在前面加一个!,比如:!picshow,后缀名可有可无。
在其它没有安装matlab的机器上运行exe文件前:
首先安装matlab的运行环境。在同一机器上可以并存不同版本的matlab环境(换句话说不同版本不兼容)。
其次是要将“MCRinstaller.exe安装目录\runtime\win32”这个路径添加到该计算机的环境变量中,通常是自动加载。
如果没有,也可手动安装,添加的方法是:
右击“我的电脑”“属性”“高级”“环境变量”“添加”指定一个变量名,然后将上述路径复制到里面就可以了。
注:在安装过程中会弹出让安装Microsoft.NETFramework可以不用安装。
最后就是将编译生成的相相关文件拷贝到同一目录下,双击即可运行。
问题:目前此方法可完全运行在没有安装MATLAB以及C/C++的电脑上,但是如果是在AMD的CPU可以运行,但是不会出现任何MATLAB编译的界面。
美中不足就是,运行的时候dos的那个黑色地窗口一直存在。下面将实现去除黑屏的办法:
消除运行MATLAB生成的exe程序的dos黑屏的办法
基于MATLAB生成exe文件后,每次运行都存在dos黑屏的问题,现在可以通过以下方法解决:
方法一: 在命令窗口输入:
cd(prefdir)
edit compopts.bat
在打开的文件最后添加以下语句:
A.VC环境下:
set
LINKFLAGS=%LINKFLAGS%/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup
B.LCC环境下:
set LINKFLAGS=%LINKFLAGS%
-subsystemwindows
C. Borland:
set LINKFLAGS=%LINKFLAGS% -aa
保存以后,再重新编译m文件,生成的exe文件运行起来就没有dos窗口了
方法二:使用suppress工具:
下载附件中的suppress压缩包后解压,(当然您可以自己去Google然后再下载)会看到一个suppress.ini文件,用记事本打开,然后将
其中“Name=test.exe”中text.exe的改为你生成的exe文件名。将suppress.exe(有个关盘和显示器的图标),改后的
suppress.ini放到你生成的exe的同目录下。执行suppress.exe或者您自己生成的exe可以了。当然您可以自己修改
suppress.exe的名字,改为您自己想要的名字。
其中的方法一在使用后生成的exe再到没有任何安装MATLAB的机子上运行也不会有黑屏了。
方法二的缺点就是要同时存在您生成的exe以及supress.exe,必须在同一目录下。
⑵ MATLAB程序如何编译产生DLL
把一个简单的m代码编译成C++接口的DLL,然后在C++程序中调用。为冲明了简单起见,这里的C++程序是一个Win32 Console程序,而不是Windows图形界面的程序,不过不妨碍我们的讨论。x0dx0ax0dx0a下面是这个例子用到的m代码。它定义了一个名为myadd2的函数x0dx0ax0dx0afunction [y,z] = myadd2(a, b)x0dx0ax0dx0a% mmy function, just to demonstrate the ideax0dx0ax0dx0ay = a+b;x0dx0ax0dx0az = a+2*b;x0dx0ax0dx0aendx0dx0a复制代码x0dx0a首先把这个函数编译成C++接口的DLL。为此,我们需要先设置MATLAB编译器。衫判闷具体做法是在MATLAB命令行执行“mbuild -setup”。然后用下面这行命令把myadd2函数编译成一个C++接口的DLL:x0dx0ax0dx0amcc -W cpplib:libmyadd2 -T link:lib myadd2x0dx0a复制代码x0dx0a结果,我们将会得到包含libmyadd2.dll,libmyadd2.ctf,libmyadd2.h,libmyadd2.lib等在内的一些文件。接下来我们只需要这四个文件。x0dx0ax0dx0a然后在VS2005中创建一个Win32 Console的VC++工程,我在测试时取名为testmyadd2_r2007b。把以上四个文件拷贝到VC++工程的源代码所在目录。x0dx0ax0dx0a接下来设置VC++,让它能找到MATLAB接口函数的定义及连接库函数。可以有两种或弯设置方式:一种是改VS2005中关于VC++的设置,这样的好处是每个新的工程都能自动获得这个设定;而另一种是只改当前工程的设置,也就是设置只对该工程有效。这里用后一种方式。x0dx0ax0dx0a在VS2005中打开工程testmyadd2_r2007b,选择菜单“Project-->;Properties,在出来的对话框上,把MATLAB提供的include路径加到VC++的头文件搜索路径。x0dx0ax0dx0a然后把相应的lib所在目录加到linker的额外搜索路径上x0dx0ax0dx0a接下来,告诉VC++,我们的这个程序需要连接到另外两个额外的库函数:libmyadd2.lib和mclmcrrt.lib。中间用空格隔开x0dx0ax0dx0a最后则是程序代码。这个程序只有一个main函数,其完整代码附在下面给大家参考。x0dx0ax0dx0a#include "stdafx.h"x0dx0ax0dx0a#include
⑶ linux下怎么编译matlab m文件
安装matlab_linux,linux下matlab的下载以及安装的参考连接,http://bbs.feng.com/read-htm-tid-6280022.html。
启动matlab,在matlab命令行上设置编译器,使用命令如下:
mex -setup
启动编译工具,deploytool,命令如下,安装图形界面添加需要编译的文件,并开始编译,可以编译成可执行文件或者动态链接库。若希望直接执行,编译成动可执行文件即可,若和其他语言混编,可以做成动态链接库,可以根据需要在图形界面上进行配置。本实验是做成一个可执行文件。
deploytool
假设应用程序名称为,Test,这编译完成后会生成一个Test文件夹,我们需要的可执行文件就在Test/distrib目录下。此时distrib 目录下面有两个文件,一个是run_Test.sh脚本文件和Test可执行文件。此时执行run_Test.sh文件,并不能执行,因为在Linux下,默认不会安装MCR,需要手动安装,MCR所在的路径为:matlab按照路径/toolbox/compiler/deploy/glnx86。安装完MCR后,执行如下命令,即可执行编译生成的Test文件。
run_Test.sh MCR_Install_Dir
若不想使用run_Test.sh脚本,直接运行Test文件,只需要设置两个环境变量即可,分别是:
export XAPPLRESDIR=/opt/matlab2009b/X11/app-defaults
LD_LIBRARY_PATH=/opt/matlab2009b/runtime/glnx86:/opt/matlab2009b/bin/glnx86:/opt/matlab2009b/sys/os/glnx86:/opt/matlab2009b/sys/java/jre/glnx86/jre/lib/i386/native_threads:/opt/matlab2009b/sys/java/jre/glnx86/jre/lib/i386/server:/opt/matlab2009b/sys/java/jre/glnx86/jre/lib/i386/client:/opt/matlab2009b/sys/java/jre/glnx86/jre/lib/i386
其中,/opt/matlab2009b,为matlab的安装路径,此时可以直接运行,Test文件了。
⑷ matlab调用c进行编译和debug
在MATLAB中调用C代码进行编译和debug需要进行以下步骤:
创建C代码文件
在MATLAB中,可以使用mex命令来将C/C++代码编译成可执行文件。首先需要创建C代码文件,例如myfunction.c。在该文件中编写C代码实现所需的功能。
创建MATLAB接口函数
在MATLAB中,需要创建一个接口函数来调用C代码。该接口函数的命名格式为mexFunction,并且需要包含以下参数:
plaintext
Copy code
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
其中,nlhs和plhs[]表示输游粗出参数的数量和指针数组,nrhs和prhs[]表示输入参数的数量喊磨汪和指针数组。在该接口函数中,需要将输入参数转换为C语言数据类型,并调用C代码实郑仔现所需的功能。最后,将输出结果转换为MATLAB数据类型,并存储到plhs[]中。
3. 编写mex命令
在终端中输入以下命令:
plaintext
Copy code
mex myfunction.c
该命令将编译myfunction.c文件,并生成可执行文件myfunction.mex。在编译过程中,需要指定所需的头文件和库文件。
4. 调用C函数进行debug
在MATLAB中,可以使用dbstop命令设置断点,然后使用dbstep命令逐语句执行代码,进行debug。例如:
plaintext
Copy code
dbstop('myfunction.c', 'line', 10);
myfunction();
dbstep;
该代码将在myfunction.c文件的第10行设置断点,然后调用myfunction函数并逐语句执行代码。
需要注意的是,在编译和debug过程中可能会出现各种问题,例如编译错误、链接错误、内存泄漏等。因此,建议熟悉C语言编程和debug技巧,并在编译和debug过程中仔细检查代码,以确保程序的正确性和稳定性。
⑸ MATLAB程序如何编译产生DLL
把一个简单的m代码编译成C++接口的DLL,然后在C++程序中调用。为了简单起见,这里的C++程序是一个Win32 Console程序,而不是Windows图形界面的程序,不过不妨碍我们的讨论。
下面是这个例子用到的m代码。它定义了一个名为myadd2的函数
function [y,z] = myadd2(a, b)
% mmy function, just to demonstrate the idea
y = a+b;
z = a+2*b;
end
复制代码
首先把这个函数编译成C++接口的DLL。为此,我们需要先设置MATLAB编译器。具体做法是在MATLAB命令行执行“mbuild -setup”。然后用下面这行命令把myadd2函数编译成一个C++接口的DLL:
mcc -W cpplib:libmyadd2 -T link:lib myadd2
复制代码
结果,我们将会得到包含libmyadd2.dll,libmyadd2.ctf,libmyadd2.h,libmyadd2.lib等在内的一些文件。接下来我们只需要这四个文件。
然后在VS2005中创建一个Win32 Console的VC++工程,我在测试时取名为testmyadd2_r2007b。把以上四个文件拷贝到VC++工程的源代码所在目录。
接下来设置VC++,让它能找到MATLAB接口函数的定义及连接库函数。可以有两种设置方式:一种是改VS2005中关于VC++的设置,这样的好处是每个新的工程都能自动获得这个设定;而另一种是只改当前工程的设置,也就是设置只对该工程有效。这里用后一种方式。
在VS2005中打开工程testmyadd2_r2007b,选择菜单“Project-->;Properties,在出来的对话框上,把MATLAB提供的include路径加到VC++的头文件搜索路径。
然后把相应的lib所在目录加到linker的额外搜索路径上
接下来,告诉VC++,我们的这个程序需要连接到另外两个额外的库函数:libmyadd2.lib和mclmcrrt.lib。中间用空格隔开
最后则是程序代码。这个程序只有一个main函数,其完整代码附在下面给大家参考。
#include "stdafx.h"
#include <iostream>
#include "mclmcr.h"
#include "mclcppclass.h"
#include "libmyadd2.h"
int _tmain(int argc, _TCHAR* argv[])
{
std::cout << "Hello world!" << std::endl;
/* Initialize the MCR */
if( !mclInitializeApplication(NULL,0) )
{
std::cout << "Could not initialize the application!" << std::endl;
return -1;
}
// initialize lib
if( !libmyadd2Initialize())
{
std::cout << "Could not initialize libmyadd2!" << std::endl;
return -1;
}
try
{
// declare and initialize a
mwArray a(2, 2, mxDOUBLE_CLASS);
double *aData;
aData = new double[4];
复制代码
本帖隐藏的内容
int i;
for( i=0; i<4; ++i)
{
aData = 1.0*i;
}
// print output
std::cout << "a = " << std::endl;
std::cout << aData[0] << ",\t" << aData[1] << std::endl;
std::cout << aData[2] << ",\t" << aData[3] << std::endl;
a.SetData(aData, 4);
// declare and initialize b
mwArray b(2, 2, mxDOUBLE_CLASS);
b(1,1) = 11.;
b(1,2) = 12.;
b(2,1) = 21.;
b(2,2) = 22.;
mwArray y(2, 2, mxDOUBLE_CLASS);
mwArray z(2, 2, mxDOUBLE_CLASS);
// call the function
myadd2(2, y, z, a, b);
// data from mwArray to C++ objects
// allocate outputs
double *yData, *zData;
yData = new double[4];
复制代码
if( yData == NULL )
{
std::cout << "Failed to allocate memory for yData!" << std::endl;
return -1;
}
zData = new double[4];
if( zData == NULL )
{
std::cout << "Failed to allocate memory for zData!" << std::endl;
return -1;
}
// data from mwArray to C++
y.GetData(yData, 4);
z.GetData(zData, 4);
// print output
std::cout << "y = " << std::endl;
std::cout << yData[0] << ",\t" << yData[1] << std::endl;
std::cout << yData[2] << ",\t" << yData[3] << std::endl;
std::cout << "z = " << std::endl;
std::cout << zData[0] << ",\t" << zData[1] << std::endl;
std::cout << zData[2] << ",\t" << zData[3] << std::endl;
// deallocate memory
delete [] aData;
delete [] zData;
delete [] yData;
}
catch( const mwException& e)
{
std::cerr << e.what() << std::endl;
}
// terminate the lib
libmyadd2Terminate();
// terminate MCR
mclTerminateApplication();
return 0;
}
⑹ matlab如何编译
一般需要用 function定义的子文件可执行,只有一个主文件,并将M文件放在一起即可……下面有个示例希望对你有帮助
⑺ Matlab 2017b编译生成exe或DLL文件后无法运行的问题及其解决方法
问题原因
出现此问题是由于Windows 的system32目录下两个DLL文件版本太低,这两个文件是SSLEAY32.DLL和LIBEAY32.DLL。
这两个文件在MATLAB安装目录的\bin\win64目录下也有,\bin\win64这个目录是在添加到了系统的PATH变量里了的。但是Matlab编译后的exe程序在运行时,system32目录有高的优先级,会使用system32目录下的这两个文件悔饥,导致初始化错误,直接闪退。
解决方法
知道了此原因,有两种解决方法:
(1)将Matlab的安装目空亏录 \bin\win64下的SSLEAY32.DLL和LIBEAY32.DLL复制到windows的system32目录下,覆斗前神盖旧版本的文件。但是这样可能导致使用这两个DLL文件的其他程序出现问题。
(2)将Matlab的安装目录 \bin\win64下的SSLEAY32.DLL和LIBEAY32.DLL文件复制到自己编译后的exe同目录下,这样exe文件在运行时就是找自己目录下的这两个DLL文件,而不会使用windows\system32目录下的DLL文件。
---------------------
原文:https://blog.csdn.net/hongandyi/article/details/79427078
⑻ 如何将MATLAB程序编译成exe文件
1.设置编译器:
在确定安装好Matlab
Compiler后,还需要对Compiler进行适当的配置,方法是在Matlab命令窗口输入:
mbuild –setup, 按提示选择matlab自带编译器LCC。
2.将程序编译成exe文件:
(1)如果全是M文件
调用格式:
Mcc -m mainmfile mfile1 mfile2 ……
mfileN;
第一个mainmfile 为主程序(main
function),其余均为需要的M文件。
(2)如果是GUI文件
例如mygui.fig 和mygui.m,编译这个GUI的命令是:
>>mcc -m
mygui
(3)如果既有GUI文件,又有M文件(谁是主程序,谁放在前)
①>>mcc -m mygui mfile
(mygui是主程序,即mygui中用到mfile.m);
②>>mcc -m mfile
mygui(mfile是主程序,即mfile.m中用到mygui)。
(4)如果GUI用到ActiveX控件
>>mcc -m mygui -a
myactivex
myactivex
是ActiveX控件的文件名。
编译完成后,可通过双击生成.exe文件;或者在matlab命令行输入带“!”的命令:
>>! mainmfile
(主程序文件名)
3.编译后的文件可以先打包成一个.exe文件,然后再用隐藏DOS窗口的软件将该.exe文件弹出的DOS窗口隐藏。
(1)打包软件很多。如MoleBox Pro;
(2)隐藏DOS窗口的方法或软件也很多,在各大Matlab论坛上都有,例如:Matlab中文论谈。
下面介绍两种隐藏方法:
方法一: 在命令窗口输入:
cd(prefdir)
edit compopts.bat
根据你使用的环境,在打开的文件最后添加以下语句:
A.VC环境下:
set
LINKFLAGS=%LINKFLAGS%/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup
B.LCC环境下:
set LINKFLAGS=%LINKFLAGS%
-subsystemwindows
C. Borland:
set LINKFLAGS=%LINKFLAGS% -aa
保存以后,再重新编译m文件,生成的exe文件运行起来就没有dos窗口了。
方法二:使用suppress工具,点击下列地址下载(具体操作里面有说明)。
http://www.mathworks.com/matlabcentral/fx_files/3909/1/suppress.zip
方法一生成的exe再到没有任何安装MATLAB的机子上运行也不会有黑屏了。
方法二的缺点就是要同时存在您生成的exe以及supress.exe,必须在同一目录下。
4.如果目标计算机上没有安装该版本的matlab,上面生成的exe文件不能正常运行,解决方法有二:
(1)将该执行文件所需要的dll文件都复制到目标计算机上;
(2)在目标计算机上安装MCRinstaller.exe。(该文件位于matlab安装目录下的
\toolbox\compiler\deploy\win32内)。
将“MCRinstaller.exe安装目录\runtime\win32”这个路径添加到目标计算机的环境变量中,通常是自动加载。
如果没有,也可手动安装,添加的方法是:
右击“我的电脑”“属性”“高级”“环境变量”“添加”指定一个变量名,然后将上述路径复制到里面就可以了。
注:在安装过程中会弹出让安装Microsoft.NETFramework可以不用安装。
最后就是将编译生成的相相关文件拷贝到同一目录下,双击即可运行。
⑼ matlab如何编译mex文件
通过MEX文件可以在MATLAB中像调用内嵌函数一样调用现有的使用C语言和Fortran等语言编写的函数,实现了代码重用,同时也能解决MATLAB循环效率低的缺点,提高MATLAB环境中数据处理的效率。
MEX文件的后缀名为 .mexw32
MEX文件的编写和编译需要两个基本条件:一是必须按照MATLAB应用程序接口组件和相关工具,二是要有C语言或Fortran语言的编译器。
需要对MATLAB系统进行设置,使MATLAB系统知道使用系统的哪一个C语言编译器,以及其参数和路径。
MEX文件系统设置:
>> mex –setup按照提示进行,最后出现Done…系统配置完毕。
C语言MEX文件的建立
C语言MEX文件的建立
1. MEX文件的结构
a) 计算子程序
b) 入口子程序,void mexFunction(int nlhs, mxArray *plhs[],int nrhs,const mxArray *prhs[]){ /*用户特定的代码….*/ }
2. 创建timestwoalt.c
#include "mex.h"
void timestwo_alt(double *y, double x)
{
*y = 2.0*x;
}
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[] )
{
double *y;
doublex;
/* 检查参数 */
if (nrhs != 1) {
mexErrMsgTxt("One input argument required.");
} else if (nlhs > 1) {
mexErrMsgTxt("Too many output arguments.");
} else if (!mxIsNumeric(prhs[0])) {
mexErrMsgTxt("Argument must be numeric.");
} else if (mxGetNumberOfElements(prhs[0]) != 1 || mxIsComplex(prhs[0])) {
mexErrMsgTxt("Argument must be non-complex scalar.");
}
/* 为输出参数创建变量 */
plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL);
/*
为参数 x、y赋值,x为值,而y为指针
(由于MATLAB没有值传递,所以用指针才能得到修改后的y值,
不然修改的是y的一个副本,为临时变量,在函数返回时,y值没有变化,
不能得到希望的结果)
*/
x = mxGetScalar(prhs[0]);
y = mxGetPr(plhs[0]);
/* 调用timestwo_alt 子函数 */
timestwo_alt(y,x);
}
3. 编译链接C语言的MEX文件源程序,在MATLAB的控制窗口中输入:mex timestwoalt.c生成一个名为timestwoalt.mexw32的MEX文件
4. 运行:在MATLAB的控制窗口中输入
x=2;
y=timestwoalt(x)
输出:y=4
MEX文件实现了一种C语言与MATLAB的接口,其实际的计算功能仍在C语言形式的计算子程序中完成,而入口子程序的功能是检查参数以匹配C语言的参数规范(how to?)。
当有C语言编写的大型程序时,不必用MATLAB语言重新编写,只要将此C语言程序作为一个计算子程序,然后编写一个入口子程序,完成参数的匹配,然后编译成MEX文件即可。
MEX文件的另外一个功能是可以将MATLAB编程中的瓶颈问题,如多重循环等,将此类费时的指令用C语言实现,然后作必要的入口子程序,编译成MEX文件,可以有效地提高MATLAB的效率。
S-函数创建器限制了C语言S-函数的功能:只能有一个输入信号和一个输出信号,而且只能处理double类型的数据!所以,可用性不大。
⑽ MATLAB中如何设置编译器
1. 安装
单独安装、和MATLAB同时安装。
2. 设置(以vs2005为例)
>> mbuild -setup
Please choose your compiler for building standalone MATLAB applications:
Would you like mbuild to locate installed compilers [y]/n? y
Select a compiler:
[1] Lcc-win32 C 2.4.1 in D:\PROGRA~1\MATLAB\R2010a\sys\lcc
[2] Microsoft Visual C++ 2008 SP1 in D:\Program Files\Microsoft Visual Studio 9.0
[3] Microsoft Visual C++ 2005 SP1 in C:\Program Files\Microsoft Visual Studio 8
[0] None
Compiler: 3
Please verify your choices:
Compiler: Microsoft Visual C++ 2005 SP1
Location: C:\Program Files\Microsoft Visual Studio 8
Are these correct [y]/n?
Trying to update options file: C:\Documents and Settings\Administrator\Application Data\MathWorks\MATLAB\R2010a\compopts.bat
From template: D:\PROGRA~1\MATLAB\R2010a\bin\win32\mbuildopts\msvc80compp.bat
Done . . .
3. 使用
(1)在 MATLAB 环境中使用 mcc 命令;
(2)在系统命令环境中使用 mcc.exe (在Windows上);
(3)在 MATLAB 环境中使用 Deployment Tool。
4. 程序发布
(1)使用 MATLAB 命令 builder;
(2)使用 Deployment Tool 图形化工具。
一般来说,需要发布的文件有3个:
(1)编译得到的可执行文件或库函数;
(2)CTF 文件;
(3)MCRInstaller.zip。
在最终用户的计算机上,首先需要把MCRInstaller.zip 解压,并把 MCR 中可执行文件所在目录添加到系统路径上,然后就可以使用编译后的程序了。