vs2010調用matlab2011下的.m文件


 

很幸運在網上找到了采用引擎的方法,用vs2009調用matlab2008下的.m文件;但個人的環境是vs2010+matlab2011;想着二者差不多,故將s2010調用matlab2008拿來試試;

實驗環境:

Win7

MATLAB 2009b(安裝路徑:E:/Program Files/MATLAB/R2009a)

VS2008 中文版(安裝路徑:E:/Program Files/Microsoft Visual Studio 9.0)

1.Matlab 生成DLL

1.1編譯器的安裝

在matlab中先安裝編譯器,我在第一次安裝的時候一路y下來,只有一個compiler,還是最老的。這教育我們要學會說N,按照以下步驟操作

>> mbuild -setup

Please choose your compiler for building standalone MATLAB applications:

 

Would you like mbuild to locate installed compilers [y]/n? n

 

Select a compiler:

[1] Lcc-win32 C 2.4.1

[2] Microsoft Visual C++ 6.0

[3] Microsoft Visual C++ .NET 2003

[4] Microsoft Visual C++ 2005 SP1

[5] Microsoft Visual C++ 2008 Express

[6] Microsoft Visual C++ 2008 SP1

 

[0] None

 

Compiler: 6

 

The default location for Microsoft Visual C++ 2008 SP1 compilers is C:/Program Files/Microsoft Visual Studio 9.0,

but that directory does not exist on this machine. 

 

Use C:/Program Files/Microsoft Visual Studio 9.0 anyway [y]/n? n

Please enter the location of your compiler: [C:/Program Files/Microsoft Visual Studio 9.0] e:/Program Files/Microsoft Visual Studio 9.0

 (紅色部分換成你的vs所安裝的地址)

Please verify your choices:

 

Compiler: Microsoft Visual C++ 2008 SP1 

Location: e:/Program Files/Microsoft Visual Studio 9.0

 

Are these correct [y]/n? y

 

****************************************************************************

  Warning: Applications/components generated using Microsoft Visual Studio  

           2008 require that the Microsoft Visual Studio 2008 run-time      

           libraries be available on the computer used for deployment.      

           To redistribute your applications/components, be sure that the   

           deployment machine has these run-time libraries.                 

****************************************************************************

 

Trying to update options file: C:/Users/Administrator/AppData/Roaming/MathWorks/MATLAB/R2009a/compopts.bat

From template:             E:/PROGRA~1/MATLAB/R2009a/bin/win32/mbuildopts/msvc90compp.bat

 

Done . . .

 

1.2 DLL的生成

首先新建一個m文件,文件名為myadd2.m,定義了一個名為myadd2的函數,代碼如下:

//////////////////////////////////////////////////////

function [y,z] = myadd2(a, b)% dummy function, just to demonstrate the ideay = a+b;z = a+2*b;end

/////////////////////////////////////

在MATLAB命令框中輸入以下命令:

mcc -W cpplib:libmyadd2 -T link:lib myadd2.m

 

生成libmyadd2.lib, libmyadd2.h, libmyadd2.dll 等文件,將這三個文件拷到VS的項目目錄下

 

2. VS調用DLL

2.1 新建一個項目,並設置環境

新 建一個win32 控制台應用程序,我取的名字是matlabDll2.當然新建其他的項目類型也可以,我這只是個例子。接下來進行配置,在該項目的屬性 中進行了配置,只對該項目有效。若建新的項目需要重新配置。項目建好后將 libmyadd2.lib, libmyadd2.h, libmyadd2.dll拷貝到項目目錄下。

首先配置項目屬性頁/配置屬性/C-C++/常規/附加包含目錄,請根據自己電腦上軟件的安裝位置對照設置,2008與2005不同的地方時這里要加兩個目錄,如下圖所示:

其次配置項目屬性頁/配置屬性/鏈接器/常規/附加庫目錄,請根據自己電腦上軟件的安裝位置對照設置,如下圖所示:

然后配置項目屬性頁/配置屬性/鏈接器/輸入/附加依賴性,填入libmyadd2.lib mclmcrrt.lib mclmcr.lib ,如下圖所示:

在 這一步俺可吃了大苦頭了,有篇文檔只說添加前兩項,俺就照做了,結果導致運行失敗,找了好長時間也沒發現錯誤,兩天的功夫都在找,結果就是因為少填了這一 項,還有其他的一些包含lib,比如libmex.lib  libmx.lib ,這里沒填,好像是VC6上要配的。

配置到此結束

2.2 編寫主程序,調試運行

這段代碼是從別處拷來的,是一段完整代碼,將它粘到matlabDLL2.cpp 主CPP文件中,調試通過:

#include "stdafx.h"
#include 
#include "mclmcr.h"
#include "mclcppclass.h"
#include "libmyadd2.h"
///////////////////////////////////////////////////////////////////////// int _tmain(int argc, _TCHAR* argv[]) { std::cout << "Hello world!" << std::endl; // 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[i] = 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;}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM