《量化投资:以MATLAB为工具》

MATLAB技术论坛

 找回密码
 注册账号
查看: 28529|回复: 133
收起左侧

[教程] 如何将MATLAB程序编译产生DLL

    [复制链接]
发表于 2009-1-16 11:00:18 | 显示全部楼层 |阅读模式
把一个简单的m代码编译成C++接口的DLL,然后在C++程序中调用。为了简单起见,这里的C++程序是一个Win32 Console程序,而不是Windows图形界面的程序,不过不妨碍我们的讨论。

下面是这个例子用到的m代码。它定义了一个名为myadd2的函数

  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
复制代码
首先把这个函数编译成C++接口的DLL。为此,我们需要先设置MATLAB编译器。具体做法是在MATLAB命令行执行“mbuild -setup”。然后用下面这行命令把myadd2函数编译成一个C++接口的DLL:

  1. mcc -W cpplib:libmyadd2 -T link:lib myadd2
复制代码
结果,我们将会得到包含libmyadd2.dll,libmyadd2.ctf,libmyadd2.h,libmyadd2.lib等在内的一些文件。接下来我们只需要这四个文件。

然后在VS2005中创建一个Win32 Console的VC++工程,我在测试时取名为testmyadd2_r2007b。把以上四个文件拷贝到VC++工程的源代码所在目录。

接下来设置VC++,让它能找到MATLAB接口函数的定义及连接库函数。可以有两种设置方式:一种是改VS2005中关于VC++的设置,这样的好处是每个新的工程都能自动获得这个设定;而另一种是只改当前工程的设置,也就是设置只对该工程有效。这里用后一种方式。

在VS2005中打开工程testmyadd2_r2007b,选择菜单“Project-->;Properties,在出来的对话框上,把MATLAB提供的include路径加到VC++的头文件搜索路径。
1.jpg
然后把相应的lib所在目录加到linker的额外搜索路径上
2.jpg
接下来,告诉VC++,我们的这个程序需要连接到另外两个额外的库函数:libmyadd2.lib和mclmcrrt.lib。中间用空格隔开
3.jpg
最后则是程序代码。这个程序只有一个main函数,其完整代码附在下面给大家参考。

  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];
复制代码

  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];
复制代码

  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. }
复制代码
最后的运行结果为

4.jpg
发表于 2015-11-11 10:13:53 | 显示全部楼层
with many thanks for you.
回复 支持 反对

使用道具 举报

发表于 2016-5-11 09:54:05 | 显示全部楼层
正好学这些东西,谢谢!
回复 支持 反对

使用道具 举报

发表于 2015-11-15 23:49:29 | 显示全部楼层
最近刚好在学~谢谢
回复 支持 反对

使用道具 举报

发表于 2009-2-27 15:30:32 | 显示全部楼层
正不知道怎么将matlab和vc++混合编程,看了楼主明白了很多。
发表于 2009-3-6 16:44:30 | 显示全部楼层
发表于 2009-4-12 00:50:38 | 显示全部楼层
好好学习,向校长学习
发表于 2009-4-15 12:43:43 | 显示全部楼层
楼主做个视频不?呵呵。。有点看不懂。
发表于 2009-4-22 11:34:48 | 显示全部楼层
正不知道怎么将matlab和vc++混合编程,看了楼主明白了很多。
发表于 2009-4-25 22:00:29 | 显示全部楼层
发表于 2009-4-25 23:32:04 | 显示全部楼层

回复 1# dynamic 的帖子

感谢楼主,想问一下,release时需要注意些什么?
发表于 2009-5-26 22:48:07 | 显示全部楼层
谢谢,正需要!...........................
发表于 2009-7-18 01:39:14 | 显示全部楼层
超赞!只是复杂的情形往往回头不好调试,啊啊啊
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|网站地图|MATLAB技术论坛|Simulink仿真论坛 ( 蜀ICP备19014457号 

GMT+8, 2020-10-27 02:16 , Processed in 0.061104 second(s), 14 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表