VC與Matlab混合編程之調用動態連結程式庫dll(C++)——<二>

來源:互聯網
上載者:User

標籤:c++   dll   

VC與Matlab混合編程之調用動態連結程式庫dll——<二>
1、是先建立 matlab 的 m 檔案。
ellipsefit.m
其包含:function [Xc,Yc,A,B,Phi,P]=ellipsefit(x,y)
2.MCC命令編譯產生得到h、dll、lib等檔案
在matlab命令列中輸入:
mcc -W cpplib:ellipsefit ellipsefit.m -T link:lib (此方式為c++風格函數)
(具體命令含義可參考《精通matlab與C/C++混合程式設計》劉維,第3版,北京航空航天大學出版社。)
(ellipsefit是產生的lib檔案名稱,可以隨意命名。ellipsefit.m是想調用的.m檔案名稱。
至此,可以發現在ellipsefit.m所在的目錄產生了一系列檔案。我們將要使用:ellipsefit.h, ellipsefit.dll, ellipsefit.lib
2.3:建立一個 VC 工程:test
為了簡單,我們在這裡建立一個win32控制台程式。如下:
然後,將上面這3個檔案(ellipsefit.h, ellipsefit.dll, ellipsefit.lib
)拷貝到VC工程所在的目錄中,以便VC調用之,並將.h檔案加入到工程中。
其中,ellipsefit.h中的function [Xc,Yc,A,B,Phi,P]=ellipsefit(x,y)對應的c++風格的函數介面是:

extern LIB_ellipsefit_CPP_API void MW_CALL_CONV ellipsefit(int nargout, mwArray& Xc, mwArray& Yc, mwArray& A, mwArray& B, mwArray& Phi, mwArray& P, const mwArray& x, const mwArray& y);

即在自己的主程式中調用該介面即可,c++中使用mwArray矩陣進行資料操作
2.3 VC 編程:(代碼如下 )

// test.cpp : 定義控制台應用程式的進入點。//#include "stdafx.h"#include<vector>#include<iostream>#include<fstream>/********************************VC調ì??用??mcc產¨2生|¨2的ì?dll************************************/#include "mclmcrrt.h"#include "mclmcr.h"#include "mclcppclass.h"#include "matrix.h"// include lib head file#include "ellipsefit.h"// link matlab sys lib#pragma comment(lib, "mclmcrrt.lib")#pragma comment(lib, "libmx.lib")#pragma comment(lib, "libmat.lib")#pragma comment(lib, "mclmcr.lib")// link lib#pragma comment(lib, "ellipsefit.lib")using namespace std;bool readFile(vector<double> &vec_in, ifstream &infile){    double temp;    while(infile>>temp)        vec_in.push_back(temp);    return true;}bool ellipsefit_dll(double &Xc,double &Yc,double &A,double &B,double &Phi,double &P,vector<double> x,vector<double> y){    mwArray mwa_x(x.size(),1 , mxDOUBLE_CLASS), mwa_y(y.size(),1 , mxDOUBLE_CLASS);    mwa_x.SetData(&x[0],x.size());    mwa_y.SetData(&y[0],y.size());    mwArray mwa_Xc(1,1,mxDOUBLE_CLASS),mwa_Yc(1,1,mxDOUBLE_CLASS),mwa_A(1,1,mxDOUBLE_CLASS),mwa_B(1,1,mxDOUBLE_CLASS),            mwa_Phi(1,1,mxDOUBLE_CLASS),mwa_P(1,1,mxDOUBLE_CLASS);    ellipsefit(6,mwa_Xc,mwa_Yc,mwa_A,mwa_B,mwa_Phi,mwa_P,mwa_x, mwa_y);    Xc=mwa_Xc(1,1);    Yc=mwa_Yc(1,1);    A=mwa_A(1,1);    B=mwa_B(1,1);    Phi=mwa_Phi(1,1);    P=mwa_P(1,1);    return true;}int main(int argc, _TCHAR* argv[]){    if (!mclInitializeApplication(NULL, 0))    {        cout << "Could not initialize the application."<< endl;;    }    if (!ellipsefitInitialize())    {        cout << "Can‘t Initalize!" << endl;    }    cout << "開a始o?運?行D" << endl;    ifstream infile_x,infile_y;    char *infile_name_x="x.txt";    char *infile_name_y="y.txt";    infile_x.open(infile_name_x);    vector<double> vec_x;    readFile(vec_x,infile_x);    infile_y.open(infile_name_y);    vector<double> vec_y;    readFile(vec_y,infile_y);    double Xc,Yc,A,B,Phi,P;     ellipsefit_dll(Xc,Yc,A,B,Phi,P,vec_x,vec_y);    cout<<"Xc="<<Xc<<endl;    cout<<"Yc="<<Yc<<endl;    cout<<"A="<<A<<endl;    cout<<"B="<<B<<endl;    cout<<"Phi="<<Phi<<endl;    cout<<"P="<<P<<endl;    ellipsefitTerminate();    mclTerminateApplication();    system("pause");    return 0;}

VC與Matlab混合編程之調用動態連結程式庫dll(C++)——<二>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.