一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

程序中使用MATLAB編譯產(chǎn)生的DLL (VC6.0, MATLAB R2010b, mw...

 DCC No.1 2011-05-12
最近需要在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è)不變,即如下:
  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ù)制代碼
2、運(yùn)行mbuild -setup設(shè)置好編譯器后(我選的是vc6.0的編譯器,沒用MATLAB自帶的),利用
  1. 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 填寫
  1. testmyadd2_r2010b
復(fù)制代碼
,點(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下填入如下路徑
  1. F:\MATLAB\R2010b\extern\include
復(fù)制代碼
(注意2010b下該路徑和之前也有不同)。
點(diǎn)“link”選項(xiàng)卡,Category選擇General,在下面的Object/library modules 那欄的最后添加
  1. libmyadd2.lib mclmcrrt.lib
復(fù)制代碼
兩個(gè)庫之間以及和其他庫以空格隔開。
然后Category選擇input,Additional  library path下填寫:
  1. F:\MATLAB\R2010b\extern\lib\win32\microsoft
復(fù)制代碼
,點(diǎn)擊OK。
至此配置完畢
5、打開testmyadd2_r2010b.cpp文件,在#include "stdafx.h"后添加
  1. #include <iostream>
  2. #include "libmyadd2.h"
復(fù)制代碼
(注意這里不再需要include  "mclmcr.h"和"mclcppclass.h"了,因?yàn)?010b生成的"libmyadd2.h"已經(jīng)包含這兩個(gè)頭文件了)。之后在main函數(shù)里
  1. return 0
復(fù)制代碼
這句上面添加如下代碼:
  1. std::cout << "Hello world!" << std::endl;
  2.         /* Initialize the MCR */
  3.         if( !mclInitializeApplication(NULL,0) )
  4.         {
  5.                 std::cout << "Could not initialize the application!" << std::endl;
  6.                 return -1;
  7.         }

  8.         // initialize lib
  9.         if( !libmyadd2Initialize())
  10.         {
  11.                 std::cout << "Could not initialize libmyadd2!" << std::endl;
  12.                 return -1;
  13.         }

  14.         try
  15.         {
  16.         // declare and initialize a
  17.         mwArray a(2, 2,  mxDOUBLE_CLASS);
  18.         double *aData;
  19.         aData = new double[4];
  20.         int i;
  21.         for( i=0; i<4; ++i)
  22.         {
  23.                 aData[i] = 1.0*i;
  24.         }
  25.         // print output
  26.         std::cout << "a = " << std::endl;
  27.         std::cout << aData[0] << ",\t" << aData[1] << std::endl;
  28.         std::cout << aData[2] << ",\t" << aData[3] << std::endl;

  29.         a.SetData(aData, 4);

  30.         // declare and initialize b
  31.         mwArray b(2, 2,  mxDOUBLE_CLASS);
  32.         b(1,1) = 11.;
  33.         b(1,2) = 12.;
  34.         b(2,1) = 21.;
  35.         b(2,2) = 22.;

  36.         mwArray y(2, 2,  mxDOUBLE_CLASS);
  37.         mwArray z(2, 2,  mxDOUBLE_CLASS);

  38.         // call the function
  39.                 myadd2(2, y, z, a, b);

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

  41.         // allocate outputs
  42.         double *yData, *zData;
  43.         yData = new double[4];
  44.         if( yData == NULL )
  45.         {
  46.                 std::cout << "Failed to allocate memory for yData!" << std::endl;
  47.                 return -1;
  48.         }

  49.         zData = new double[4];
  50.         if( zData == NULL )
  51.         {
  52.                 std::cout << "Failed to allocate memory for zData!" << std::endl;
  53.                 return -1;
  54.         }

  55.         // copy data from mwArray to C++
  56.         y.GetData(yData, 4);
  57.         z.GetData(zData, 4);

  58.         // print output
  59.         std::cout << "y = " << std::endl;
  60.         std::cout << yData[0] << ",\t" << yData[1] << std::endl;
  61.         std::cout << yData[2] << ",\t" << yData[3] << std::endl;

  62.         std::cout << "z = " << std::endl;
  63.         std::cout << zData[0] << ",\t" << zData[1] << std::endl;
  64.         std::cout << zData[2] << ",\t" << zData[3] << std::endl;

  65.         
  66.         // deallocate memory
  67.         delete [] aData;
  68.         delete [] zData;
  69.         delete [] yData;
  70.         }
  71.         catch( const mwException& e)
  72.         {
  73.           std::cerr << e.what() << std::endl;
  74.                   
  75.         }
  76.         // terminate the lib
  77.         libmyadd2Terminate();

  78.         // terminate MCR
  79.         mclTerminateApplication();
復(fù)制代碼
至此可以編譯運(yùn)行了。

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    日本精品最新字幕视频播放| 日韩一区二区三区久久| 久七久精品视频黄色的| 在线日韩欧美国产自拍| 欧美性猛交内射老熟妇| 深夜视频在线观看免费你懂| 日韩av亚洲一区二区三区| 日韩一区二区三区免费av| 国产一区二区在线免费| 久久老熟女一区二区三区福利| 国产在线一区中文字幕 | 免费一级欧美大片免费看| 最新国产欧美精品91| 亚洲天堂精品1024| 91精品国自产拍老熟女露脸| 中文字幕一区二区三区中文| 日本道播放一区二区三区| 国产成人精品一区二三区在线观看| 91亚洲熟女少妇在线观看| 亚洲精品中文字幕一二三| 亚洲精品欧美精品一区三区| 中文字幕高清不卡一区| 国产欧美亚洲精品自拍| 在线播放欧美精品一区| 国产精品久久女同磨豆腐| 午夜色午夜视频之日本| 欧美成人久久久免费播放| 国产二级一级内射视频播放| 国产目拍亚洲精品区一区| 久久福利视频在线观看| 亚洲精品国产主播一区| 99久久人妻精品免费一区| 国产高清三级视频在线观看| 国产伦精品一区二区三区高清版| 欧美三级不卡在线观线看| 好吊日视频这里都是精品| 91亚洲精品亚洲国产| 日韩一级免费中文字幕视频| 成人精品国产亚洲av久久| 日本黄色录像韩国黄色录像| 极品少妇嫩草视频在线观看|