如题所述
æä¸ä¸ªç®åçm代ç ç¼è¯æC++æ¥å£çDLLï¼ç¶åå¨C++ç¨åºä¸è°ç¨ã为äºç®åèµ·è§ï¼è¿éçC++ç¨åºæ¯ä¸ä¸ªWin32 Consoleç¨åºï¼èä¸æ¯Windowså¾å½¢çé¢çç¨åºï¼ä¸è¿ä¸å¦¨ç¢æ们ç讨论ã
ä¸é¢æ¯è¿ä¸ªä¾åç¨å°çm代ç ãå®å®ä¹äºä¸ä¸ªå为myadd2çå½æ°
function [y,z] = myadd2(a, b)
% dummy 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);
// copy 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;
}
// 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;
}
ä¸é¢æ¯è¿ä¸ªä¾åç¨å°çm代ç ãå®å®ä¹äºä¸ä¸ªå为myadd2çå½æ°
function [y,z] = myadd2(a, b)
% dummy 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);
// copy 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;
}
// 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;
}
温馨提示:答案为网友推荐,仅供参考