日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

如何將MATLAB程序編譯產(chǎn)生DLL|MATLAB 混合編程與應(yīng)用發(fā)布|MATLAB技術(shù)論壇

 LSS133LSS 2014-06-11
 把一個簡單的m代碼編譯成C++接口的DLL,然后在C++程序中調(diào)用。為了簡單起見,這里的C++程序是一個Win32 Console程序,而不是Windows圖形界面的程序,不過不妨礙我們的討論。

下面是這個例子用到的m代碼。它定義了一個名為myadd2的函數(shù)

  1. function [y,z] = myadd2(a, b)
  2. % dummy function, just to demonstrate the idea
  3. y = a+b;
  4. z = a+2*b;
  5. end
復(fù)制代碼
首先把這個函數(shù)編譯成C++接口的DLL。為此,我們需要先設(shè)置MATLAB編譯器。具體做法是在MATLAB命令行執(zhí)行“mbuild -setup”。然后用下面這行命令把myadd2函數(shù)編譯成一個C++接口的DLL:

  1. 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++的頭文件搜索路徑。
1.jpg
然后把相應(yīng)的lib所在目錄加到linker的額外搜索路徑上
2.jpg
接下來,告訴VC++,我們的這個程序需要連接到另外兩個額外的庫函數(shù):libmyadd2.lib和mclmcrrt.lib。中間用空格隔開
3.jpg
最后則是程序代碼。這個程序只有一個main函數(shù),其完整代碼附在下面給大家參考。

  1. #include "stdafx.h"

  2. #include <iostream>
  3. #include "mclmcr.h"
  4. #include "mclcppclass.h"
  5. #include "libmyadd2.h"


  6. int _tmain(int argc, _TCHAR* argv[])
  7. {

  8.         std::cout << "Hello world!" << std::endl;
  9.         /* Initialize the MCR */
  10.         if( !mclInitializeApplication(NULL,0) )
  11.         {
  12.                 std::cout << "Could not initialize the application!" << std::endl;
  13.                 return -1;
  14.         }

  15.         // initialize lib
  16.         if( !libmyadd2Initialize())
  17.         {
  18.                 std::cout << "Could not initialize libmyadd2!" << std::endl;
  19.                 return -1;
  20.         }

  21.         try
  22.         {
  23.         // declare and initialize a
  24.         mwArray a(2, 2,  mxDOUBLE_CLASS);
  25.         double *aData;
  26.         aData = new double[4];
復(fù)制代碼

本帖隱藏的內(nèi)容

  1.         int i;
  2.         for( i=0; i<4; ++i)
  3.         {
  4.                 aData = 1.0*i;
  5.         }
  6.         // print output
  7.         std::cout << "a = " << std::endl;
  8.         std::cout << aData[0] << ",\t" << aData[1] << std::endl;
  9.         std::cout << aData[2] << ",\t" << aData[3] << std::endl;

  10.         a.SetData(aData, 4);

  11.         // declare and initialize b
  12.         mwArray b(2, 2,  mxDOUBLE_CLASS);
  13.         b(1,1) = 11.;
  14.         b(1,2) = 12.;
  15.         b(2,1) = 21.;
  16.         b(2,2) = 22.;

  17.         mwArray y(2, 2,  mxDOUBLE_CLASS);
  18.         mwArray z(2, 2,  mxDOUBLE_CLASS);

  19.         // call the function
  20.                 myadd2(2, y, z, a, b);

  21.         // copy data from mwArray to C++ objects

  22.         // allocate outputs
  23.         double *yData, *zData;
  24.         yData = new double[4];
復(fù)制代碼

  1.         if( yData == NULL )
  2.         {
  3.                 std::cout << "Failed to allocate memory for yData!" << std::endl;
  4.                 return -1;
  5.         }

  6.         zData = new double[4];
  7.         if( zData == NULL )
  8.         {
  9.                 std::cout << "Failed to allocate memory for zData!" << std::endl;
  10.                 return -1;
  11.         }

  12.         // copy data from mwArray to C++
  13.         y.GetData(yData, 4);
  14.         z.GetData(zData, 4);

  15.         // print output
  16.         std::cout << "y = " << std::endl;
  17.         std::cout << yData[0] << ",\t" << yData[1] << std::endl;
  18.         std::cout << yData[2] << ",\t" << yData[3] << std::endl;

  19.         std::cout << "z = " << std::endl;
  20.         std::cout << zData[0] << ",\t" << zData[1] << std::endl;
  21.         std::cout << zData[2] << ",\t" << zData[3] << std::endl;

  22.         
  23.         // deallocate memory
  24.         delete [] aData;
  25.         delete [] zData;
  26.         delete [] yData;
  27.         }
  28.         catch( const mwException& e)
  29.         {
  30.           std::cerr << e.what() << std::endl;
  31.                   
  32.         }
  33.         // terminate the lib
  34.         libmyadd2Terminate();

  35.         // terminate MCR
  36.         mclTerminateApplication();


  37.         return 0;
  38. }
復(fù)制代碼
最后的運(yùn)行結(jié)果為

4.jpg

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多