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 中可執行文件所在目錄添加到系統路徑上,然後就可以使用編譯後的程序了。