VC和MATLAB混合开发经验总结

àì夳堔傛蜴生んèń 2022-08-11 16:52 255阅读 0赞

作者:朱金灿

来源:http://blog.csdn.net/clever101

前期准备:

  1. 1.请确认机器中已经安装Matlab主程序或(MCRMATLAB Compiler Runtime(具体到matlab安装目录下搜索MCRInstaller.exe)。
  2. 2.准备好MATLAB编译好的C/C++文件:包括<my\_dll>.h<my\_dll>.lib <my\_dll>.dll
  3. 其中<my\_dll>为生成的文件名。

建立工程:

  1. 1.新建一个工程。将<my\_dll>.h、<my\_dll>.lib拷贝到工程文件夹下
  2. <my\_dll>.dll拷贝到输出目录。
  3. 2.将<my\_dll>.h添加到工程中。
  4. 3.在工程属性页 -> C/C++ -> 附加的包含目录 选项中添加包含目录
  5. <you\_dir>\\R2009a\\extern\\include
  6. 注:<you\_dir>为计算机中matlab的安装位置。
  7. 若以添加系统环境变量则可跳过这一步。
  8. 若没有安装matlab,只安装MCR,则到MCR目录下找\\extern\\include 也可。
  9. 4.在工程属性页 -> 链接器 -> 附加库目录 选项中添加包含目录
  10. <you\_dir>\\R2009a\\extern\\lib\\win32\\microsoft
  11. 注:<you\_dir>为计算机中matlab的安装位置。
  12. 若没有安装matlab,只安装MCR,则到MCR目录下找\\extern\\lib\\win32\\microsoft 也可。
  13. 5.在工程属性页 -> 链接器 -> 输入 -> 附加依赖项 中添加依赖项
  14. mclmcrrt.lib mclmcr.lib dlltest.lib

调用dll:

  1. 1.先执行mclInitializeApplication(NULL,0)以初始化MCR库,请检测返回值以确认初始化成功。
  2. 2.执行<my\_dll>.h 中的 <my\_dll>Initialize(void)以初始化DLL,请检测返回值以确认初始化成功。
  3. 注:初始化可以放到构造函数中运行。
  4. 3.执行函数操作如mlfDraw\_test(int nargout,mxArray\*\* y)。
  5. 注:若有图形界面函数为异步调用,既显示图像后即返回值。
  6. 可以用mclWaitForFiguresToDie(NULL)来阻塞线程等待Matlab窗口关闭。
  7. \*调用前请确认MCRdll初始化成功,若不成功调用函数可导致程序崩溃。
  8. 4.执行完函数后调用<my\_dll>Terminate(void)来结束DLL
  9. 5.最后调用mclTerminateApplication()来结束MCR库。
  10. 注:执行4函数时请确认所有Matlab已经关闭。
  11. 如在有Matlab窗口时执行4函数可能发生未知错误!
  12. 有如下两种方法确认:
  13. 1.调用mclWaitForFiguresToDie(NULL)来阻塞线程等待Matlab窗口关闭。
  14. 2.调用mclKillAllFigures(NULL)来强制关闭所有Matlab窗口。
  15. \*注:上述45两个函数请勿放置在析构函数中是执行,若这样做有可能发生未知错误!
  16. 请在宿主对象析构函数之前调用上述45函数!

3.部署调用matlab的程序时在安装MCR后,需要在Path环境变量设置MCR的路径,具体是setPATH=\v710\runtime\win32;%PATH%

第二部分Matlab编译C/C++dll:

Matlab 生成DLL

编译器的安装

  1. matlab中先安装编译器,我在第一次安装的时候一路y下来,
  2. 只有一个compiler,还是最老的。这教育我们要学会说N,按照以下步骤操作
  3. >>mbuild -setup
  4. Pleasechoose your compiler for building standalone MATLAB applications:
  5. Wouldyou like mbuild to locate installed compilers \[y\]/n? n
  6. Selecta compiler:
  7. \[1\]Lcc-win32 C 2.4.1
  8. \[2\]Microsoft Visual C++ 6.0
  9. \[3\]Microsoft Visual C++ .NET 2003
  10. \[4\]Microsoft Visual C++ 2005 SP1
  11. \[5\]Microsoft Visual C++ 2008 Express
  12. \[6\]Microsoft Visual C++ 2008 SP1
  13. \[0\]None
  14. Compiler:6
  15. Thedefault location for Microsoft Visual C++ 2008 SP1 compilers is C:/ProgramFiles/Microsoft Visual Studio 9.0,
  16. butthat directory does not exist on this machine.
  17. UseC:/Program Files/Microsoft Visual Studio 9.0 anyway \[y\]/n? n
  18. Pleaseenter the location of your compiler: \[C:/Program Files/Microsoft Visual Studio9.0\] <you\_dir\_VS>/Microsoft Visual Studio 9.0
  19. Pleaseverify your choices:
  20. Compiler:Microsoft Visual C++ 2008 SP1
  21. Location:e:/Program Files/Microsoft Visual Studio 9.0
  22. Arethese correct \[y\]/n? y
  23. \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
  24. Warning: Applications/components generatedusing Microsoft Visual Studio
  25. 2008 require that the Microsoft VisualStudio 2008 run-time
  26. libraries be available on the computer usedfor deployment.
  27. To redistribute your applications/components,be sure that the
  28. deployment machine has these run-timelibraries.
  29. \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
  30. Tryingto update options file: C:/Users/Administrator/AppData/Roaming/MathWorks/MATLAB/R2009a/compopts.bat
  31. Fromtemplate: E:/PROGRA~1/MATLAB/R2009a/bin/win32/mbuildopts/msvc90compp.bat
  32. Done. . .

DLL的生成

  1. 首先新建一个m文件,文件名为myadd2.m,定义了一个名为myadd2的函数,代码如下:
  2. function [y,z] = myadd2(a, b)
  3. % dummy function, just to demonstrate the idea
  4. y = a+b;
  5. z = a+2*b;
  6. end
  7. MATLAB命令框中输入以下命令:
  8. mcc -W cpplib:libmyadd2 -T link:lib myadd2.m
  9. 在编译生成C++库后同时生成一个readme文件,这个文件就是告诉你以后部署软件时该安装哪些库的。

发表评论

表情:
评论列表 (有 0 条评论,255人围观)

还没有评论,来说两句吧...

相关阅读

    相关 开发经验总结

    面向对象开发思想 2020年03月15日22:19:22 要真正理解面向对象设计,学习C++不是一个好的方式。他太大太杂了。 类和对象的关系可以理解为鸡蛋和土鸡

    相关 android开发经验总结

    工作这么长时间了,也学习到了不少的知识,很多东西都需要理解记忆。以前在课本上学习的东西,迁移到工作当中虽然,有很多是用不到的,但是基础的知识点还是很有用的。有时在书上看到非常难