把一個簡單的m代碼編譯成C++接口的DLL,然后在C++程序中調(diào)用。為了簡單起見,這里的C++程序是一個Win32 Console程序,而不是Windows圖形界面的程序,不過不妨礙我們的討論。
下面是這個例子用到的m代碼。它定義了一個名為myadd2的函數(shù)-
- function [y,z] = myadd2(a, b)
- % dummy function, just to demonstrate the idea
- y = a+b;
- z = a+2*b;
- end
復(fù)制代碼 首先把這個函數(shù)編譯成C++接口的DLL。為此,我們需要先設(shè)置MATLAB編譯器。具體做法是在MATLAB命令行執(zhí)行“mbuild -setup”。然后用下面這行命令把myadd2函數(shù)編譯成一個C++接口的DLL:-
- mcc -W cpplib:libmyadd2 -T link:lib myadd2
復(fù)制代碼 結(jié)果,我們將會得到包含libmyadd2.dll,libmyadd2.ctf,libmyadd2.h,libmyadd2.lib等在內(nèi)的一些文件。接下來我們只需要這四個文件。
然后在VS2005中創(chuàng)建一個Win32 Console的VC++工程,我在測試時取名為testmyadd2_r2007b。把以上四個文件拷貝到VC++工程的源代碼所在目錄。
接下來設(shè)置VC++,讓它能找到MATLAB接口函數(shù)的定義及連接庫函數(shù)??梢杂袃煞N設(shè)置方式:一種是改VS2005中關(guān)于VC++的設(shè)置,這樣的好處是每個新的工程都能自動獲得這個設(shè)定;而另一種是只改當(dāng)前工程的設(shè)置,也就是設(shè)置只對該工程有效。這里用后一種方式。
在VS2005中打開工程testmyadd2_r2007b,選擇菜單“Project-->;Properties,在出來的對話框上,把MATLAB提供的include路徑加到VC++的頭文件搜索路徑。
然后把相應(yīng)的lib所在目錄加到linker的額外搜索路徑上
接下來,告訴VC++,我們的這個程序需要連接到另外兩個額外的庫函數(shù):libmyadd2.lib和mclmcrrt.lib。中間用空格隔開
最后則是程序代碼。這個程序只有一個main函數(shù),其完整代碼附在下面給大家參考。-
- #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];
復(fù)制代碼本帖隱藏的內(nèi)容- 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);
- // copy data from mwArray to C++ objects
- // allocate outputs
- double *yData, *zData;
- yData = new double[4];
復(fù)制代碼
- 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;
- }
- // copy 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;
- }
復(fù)制代碼 最后的運(yùn)行結(jié)果為
|