最近需要在VC下調(diào)用MATLAB的dll,以前沒怎么接觸過這些,今天特地摸索了一下。主要借鑒的是taohe兄的這篇帖子:
http://forum./thread-801187-1-1.html但不同的是我現(xiàn)在用的MATLAB是R2010b,而VC是6.0,兩個(gè)產(chǎn)品時(shí)間間隔達(dá)10多年之久。taohe兄的實(shí)驗(yàn)環(huán)境是vs2005,MATLAB 2007b兩個(gè)產(chǎn)品時(shí)間間隔還是比較接近的。
之前按照taohe兄帖子里的步驟實(shí)現(xiàn),發(fā)現(xiàn)總是無法成功,出現(xiàn)N多各種奇怪錯(cuò)誤,譬如:error C2065: 'mclInitializeApplication_proxy' : undeclared identifier 之類的奇怪錯(cuò)誤提示(后來才知道這是 2008a以后,Mathworks公司對(duì)mclmcrrt.h 和 mclmcr.h頭文件做了修改,要求mclmcr.h必須include在mclmcrrt.h之后。)
現(xiàn)將操作步驟寫下:
1、編寫測(cè)試m函數(shù),這個(gè)不變,即如下:
- function [y,z] = myadd2(a, b)
- % dummy function, just to demonstrate the idea
- y = a+b;
- z = a+2*b;
- end
復(fù)制代碼
2、運(yùn)行mbuild -setup設(shè)置好編譯器后(我選的是vc6.0的編譯器,沒用MATLAB自帶的),利用
- mcc -W cpplib:libmyadd2 -T link:lib myadd2.m -C
復(fù)制代碼
生成需要的libmyadd2.dll,libmyadd2.h,libmyadd2.lib,libmyadd2.ctf文件。(注意,R2010b下,mcc -W cpplib:libmyadd2 -T link:lib myadd2.m不再生成libmyadd2.ctf文件,需加-C選項(xiàng))
3、VC下新建控制臺(tái)程序,步驟如下:file>new,選擇Win32 Console Application,右側(cè)project name 填寫
,點(diǎn)擊OK。
在下一個(gè)界面選“a simple application”finish點(diǎn)OK。
至此程序框架搭好,將libmyadd2.dll,libmyadd2.h,libmyadd2.lib和libmyadd2.ctf復(fù)制到testmyadd2_r2010b工程目錄下。
并將libmyadd2.h添加到Header files組內(nèi)。
4、進(jìn)行項(xiàng)目必要的設(shè)置(注意這里和VC2005有較大不同)。vc主界面進(jìn)入project>Settings,點(diǎn)C/C++選項(xiàng)卡,Category選擇Preprocessor,Additional include directories下填入如下路徑
- F:\MATLAB\R2010b\extern\include
復(fù)制代碼
(注意2010b下該路徑和之前也有不同)。
點(diǎn)“link”選項(xiàng)卡,Category選擇General,在下面的Object/library modules 那欄的最后添加
- libmyadd2.lib mclmcrrt.lib
復(fù)制代碼
兩個(gè)庫之間以及和其他庫以空格隔開。
然后Category選擇input,Additional library path下填寫:
- F:\MATLAB\R2010b\extern\lib\win32\microsoft
復(fù)制代碼
,點(diǎn)擊OK。
至此配置完畢
5、打開testmyadd2_r2010b.cpp文件,在#include "stdafx.h"后添加
- #include <iostream>
- #include "libmyadd2.h"
復(fù)制代碼
(注意這里不再需要include "mclmcr.h"和"mclcppclass.h"了,因?yàn)?010b生成的"libmyadd2.h"已經(jīng)包含這兩個(gè)頭文件了)。之后在main函數(shù)里
這句上面添加如下代碼:
- 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[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();
復(fù)制代碼
至此可以編譯運(yùn)行了。