DATE: 2018.12.9
轉載自:https://blog.csdn.net/leixiaohua1020/article/details/38318517
先簡單的說說mcc、mbuild和mex到底怎么回事:
mcc將M文件轉換成C/C++文件和相應的MEX包裹文件(需要Matlab編輯器),但在特定條件下可以自動調用mbuild或者mex
mex將C/C++文件(入口函數為mexfunction())編譯成MEX(DLL)文件(需要C/C++編輯器)
mbuild將C/C++文件(入口函數為main())生成可獨立運行的C應用程序(需要C/C++編輯器)
一、 mcc命令
Matlab編譯器使用mcc命令能將一個M文件翻譯成C文件,同時生成一個相應的包裹文件,這個包裹文件包含了編譯器產生的代碼和它支持的可執行文件類型之間所需的接口。利用改包裹文件提供的接口,生成的C文件能用在任何編譯器所支持的可執行文件類型(如MEX文件、EXE文件、DLL文件)中,這些C文件與最終生成的可執行文件是相互獨立的。
Matlab編譯器(Lcc)在特定的條件下能自動調用mex和mbuild函數,尤其是mcc –x/-m/-p時。
(1)創建MEX文件
>>mcc –x filename (注意這個命令在2008a中已經去掉了)將M文件filename.m翻譯成C代碼,並生成一個可被Matlab直接調用的C的MEX。
(2)創建simulink S函數
>>mcc –s filename
將M文件filename.m翻譯成C代碼,並生成一個相應的simulink S函數,該函數的輸入輸出變量的大小可動態改變。
(3)創建可獨立執行的C程序
>>mcc –m filename
將M文件filename.m翻譯成C代碼,生成的可執行文件能獨立於Matlab運行環境。
(4)創建可獨立運行的C++程序
>>mcc –p filename
將M文件filename.m翻譯成C++代碼,生成的可執行文件能獨立於Matlab運行環境。
(5)創建可獨立運行的C圖形庫函數
>>mcc –B sgl filename
如果filename.m中包含了對Matlab圖形處理函數的調用,上述命令,將filename轉換成為C語言,並生成一個能獨立於Matlab運行環境的可執行程序。
(6) 創建可獨立運行的C++圖形庫函數
>>mcc –B sgl cpp filename
如果filename.m中包含了對Matlab圖形處理函數的調用,上述命令,將filename轉換成為C++語言,並生成一個能獨立於Matlab運行環境的可執行程序。
(7)創建C函數庫
>>mcc –m –W lib:libfoo –T link:libfoo.m
創建一個C函數庫
二、 mex命令
用戶可以在Matlab中按簡單的M文件語法規則設計出來完成特定計算的算法。然后用Matlab編譯器調用mex命令創建C共享庫函數(DLL)或C++靜態函數庫,最后將它們整合到C/C++應用程序中,編譯完這些C/C++應用程序,就可以用這些算法來實現特定的計算功能。當然這過程中也隱藏了算法和加快了代碼的執行效率。
由於MEX文件執行效率高,故如果有文件重名的話,Matlab將優先調用MEX文件,下面以一個例子說明:
function theimage=gasket(numpoits)
theimage=zeros(1000);
corners=[866 1;1 500;866 1000];
startpoit=[866 1];
therand=ceil(rand(numpoits,1)*3);
for ii=1:numpoits
startpoit=floor((corners(therand(ii),:)+startpoit)/2);
theimage(startpoit(1),startpoit(2))=1;
end
imagesc(theimage)
colormap([1 1 1;0 0 0]);
axis equal tight
現在直接調用
>> tic ,gasket(5000000);toc
Elapsed time is 7.240129 seconds.
接着把它編譯成mex文件在調用試試
>>mcc -p tic gasket;tic ,gasket(5000000);toc
Elapsed time is 1.23861 seconds.
三、 mbuild命令
要建立獨立運行的C應用程序,系統中需要安裝Matlab、Matlab編譯器、C/C++編譯器以及Matlab C/C++數學庫函數和圖形庫函數。
Matlab編譯器使用mbuild命令可以直接將C/C++源代碼編譯為獨立運行程序,在這些源代碼中可以使用Matlab提供的接口來調用Matlab數學庫函數。
雖然生成的可執行程序可以脫離Matlab環境運行,但是它需要Matlab C/C++數學庫文件或者圖形庫文件的支持才能運行。但如果C/C++源代碼完全是按傳統C/C++源代碼語法規則編寫,沒有包含Matlab數學庫和圖形庫的調用,則不僅可以獨立與Matlab環境,也不需要那兩個庫函數的支持。
對於如何在其他環境中運行那個生成的exe文件,大家看看這個帖子:http://www.matlabsky.com/thread-543-1-1.html
下面說說一些比較和區別:
- MEX文件和EXE文件的差別
Mex文件與Matlab解釋器在同一個過程空間運行,當用戶調用一個MEX文件時Matlab解釋器就會動態的連接到MEX文件。
可獨立運行的C/C++應用程序(exe)可以獨立於Matlab環境而運行,而MEX文件則不行,它需要Matlab的支持。還有EXE中可以調用MEX文件。
- mex和mbuild編譯的C/C++文件的差別
使用mbuild命令編譯的C/C++源文件中,必須包含main()函數,它能獨立於Matlab運行。而mex命令編譯的C/C++源文件中不含main()函數,它是以mexfunction()函數作為入口的,編譯后生成的是mex文件,被Matlab調用。
原文地址:http://blog.sina.com.cn/s/blog_5928f2dd0100gf27.html