MFC与Matlab编程总结 (以《Matlab与C/C++混合编程技术(第三版)》-刘维 第五章 生成DLL为例)

来源:互联网 发布:网络策略和访问服务 编辑:程序博客网 时间:2024/06/02 05:30
     近期要完成一个任务,把人脸超分辨率的算法集成在一个系统中,嵌入人脸库及字典集等。老板的要求是有比较好的界面,目前也只能是VS那一套了,前一段时间完成的项目是用的MFC,这次也就是用MFC来完成吧。但是问题是,以前写的人脸超分辨率的算法都是用Matlab写的,Matlab有非常好的矩阵计算能力,要想把算法在C++下重新实现,短时间内有点困难。那就把Matlab算法封装成DLL吧,Matlab基本上是用C写的,有比较好的兼容性,目前晚上也有不少关于C++与Matlab混合编程的资料。在图书馆找书的时候无意间找到了刘维的那本《精通Matlab与C/C++混合程序设计》(第三版),看着介绍不错,准备按照上面的方法做。
     昨天一整天(上午9:00--晚上12:00),外加前天一晚上(加班到凌晨一点),我几乎遇到了所有人遇到问题的集合,完美的走过了“大弯路”,今天早上终于搞定了这本书介绍的C++使用Matlab封装的DLL的例子。先不啰嗦那些弯路,直接介绍如何正确的使用这本书中的五章的第二个例子。
     注意:提前声明一下,这里我是在32位系统中完成的,至于64位系统,我尝试了两种,winXP64位,win8.1,都不行,不能识别DLL里面的函数,应该是有些库没加进去,或者这些库跟32位的有区别,尝试了win64那个文件夹也不行,暂时没有解决方案,待研究。另外,如果您是matlab2013b,抱歉,不能配置VC编译器(mcc),也就不能编译出自己的dll,lib,h文件。目前“市场”上所有破解Matlab2013b都不能配置编译器,至少我没有找到一个成功的案例,除非您是土豪,自己买的正版。
     没有在图书馆借到这本书的光盘,所以就在网上下载了这本书的源码。但是这些源码的文件名都有问题--每个文件名后面都多了一个下划线。这是错误的,需要写个批处理把这些文件重命名,去掉那个下划线,否则,不能加载解决方案的工程文件。不嫌麻烦就自己手动改,反正文件也不多。
     书中的例子都是用VC2010 + Matlab 2010b(也是7.14),而且书中的代码直接是工程文件,里面的包含目录(include)和库目录都需要根据自己机器实际安装目录修改(真蛋疼)。我对VC2010配置附加库还不是很熟悉,一般我都是按照OpenCV的方式配置,这本书中给的配置方式不太一样,详细的配置方式在书中195页有介绍。下面两张图是他的配置:
图-1 
图-2
     其中图-1 表示的包含目录,也就是(include),注意是在C/C++ --> 常规里面,书的作者的Matlab是安装在D盘,这里的Include目录对应着“C:\Program Files\MATLAB\R2012a\extern\include”,这里红字是我的安装目录,另外里面还有一个win32文件夹,最好也添加到里面。总结一下,就是把:“C:\Program Files\MATLAB\R2012a\extern\include”和“C:\Program Files\MATLAB\R2012a\extern\include\win32”添加到包含目录中。
     图-2 表示的是库目录,是在链接器 --> 常规中,这里对应着“C:\Program Files\MATLAB\R2012a\extern\lib\win32\microsoft”,把这个目录添加到库目录中。
     注意:以上我都是在修改作者的代码,因为作者的Matlab安装在D盘,我的安装在C盘。还有,这是作者的方式,我是按照OpenCV添加包含目录和库目录的方法,不知道的可以查一下相关知识。
     还有,作者只用的是Matlab2010b,我用的是2012a,版本不用编译器不用,这时候直接运行修改好的工程,会有意想不到的错误,如下图所示:
图-3
     图-3显示的错误让我郁闷了好长时间,我对matlab并不是很熟悉,导致整个过程都是在走弯路,上面显示的编号是Matlab的编译器版本,7.14表示的Matlab2010b的便器版本号,因为我们到目前为止还是用的作者提供的dll、lib、h文件,(这三个文件在工程根目录中能够看到),这三个文件是在2010b版本中生成的,需要2010b版本的编译器,也就是MCR(不了解的自己查查,这个东西比较多),我的机器安装的是2012a,编译器应该是8.**,所以显示找不到7_14的DLL文件。这需要我们自己重新把matlab的m文件编译成DLL库。
     需要配置mcc编译器(这个不了解的也查查吧,介绍太多了)在matlab命令狂中输入"mbuild -setup",然后如下图:选择VC2010的编译器。
>> mbuild -setup

Welcome to mbuild -setup.  This utility will help you set up 
a default compiler.  For a list of supported compilers, see 
http://www.mathworks.com/support/compilers/R2012a/win32.html

Please choose your compiler for building shared libraries or COM components:

Would you like mbuild to locate installed compilers [y]/n? y
Select a compiler:
[1] Lcc-win32 C 2.4.1 in C:\PROGRA~1\MATLAB\R2012a\sys\lcc
[2] Microsoft Visual C++ 2010 in C:\Program Files\Microsoft Visual Studio 10.0
[3] Microsoft Visual C++ 6.0 in C:\Program Files\Microsoft Visual Studio

[0] None

Compiler: 2
Please verify your choices:

Compiler: Microsoft Visual C++ 2010 
Location: C:\Program Files\Microsoft Visual Studio 10.0

Are these correct [y]/n? y
****************************************************************************
  Warning: Applications/components generated using Microsoft Visual C++     
           2010 require that the Microsoft Visual Studio 2010 run-time      
           libraries be available on the computer used for deployment.      
           To redistribute your applications/components, be sure that the   
           deployment machine has these run-time libraries.                 
****************************************************************************


Trying to update options file: C:\Documents and Settings\zhaoying\Application Data\MathWorks\MATLAB\R2012a\compopts.bat
From template:              C:\PROGRA~1\MATLAB\R2012a\bin\win32\mbuildopts\msvc100compp.bat

Done . . . 

然后转到存放m文件的文件夹(提前存好,比如我见了一个vc的文件夹,里面放着sincplot.m),然后输入:
mcc -B csharedlib:libsincplot sincplot.m

然后,得到这些(图-4)文件,但是我们只需要,dll、lib、h三个文件
图-4
     把这三个文件覆盖工程中的三个文件,再运行程序:
     
图-5
     以上我们都是在这本书的例子上直接修改的配置,正常的新建一个工程,除了以上的步骤,还需要添加附加依赖项。如图-6所示:
图-6
     在附加依赖项中添加两个lib文件:libsincplot.lib mclmcrrt.lib,注意在配置时用回车隔开,若需要其他功能还需要添加其他的里边文件,libmx.lib
libmat.lib  mclmcr.lib。等等吧,还要添加头文件啥的,这里完成这些已经是告一段落了,已经有了比较大的成就。剩下的就是研究怎么建工程,研究代码了。
参考(给点启发的也算,乱序)
http://zhidao.baidu.com/link?url=nr4dCxDgQt6CV_W6dta1r4rYL2u2lhy51KAuxco6g_vzPNYMI7aXlf32bEodXQx0LtDvhM1LEcWFxFLVNWmqeq

http://www.cnblogs.com/xpvincent/archive/2013/02/05/2893046.html

http://www.ilovematlab.cn/thread-205148-1-1.html

http://www.ilovematlab.cn/thread-62535-1-1.html

http://www.ilovematlab.cn/thread-62548-1-1.html

http://wenku.baidu.com/link?url=ntR67NsL5qpcGN1ItOr4o95jEyPYBsQlR_RdOAN1WlzSqD_Oy9waLP49D90mdcS0r9GmF8qPCI5kf5504qH8eNbOYChwT-rAUf3BhweTK0W

http://www.ilovematlab.cn/thread-89416-1-1.html

http://blog.sina.com.cn/s/blog_6d04b0d10101n7i2.html



1 0
原创粉丝点击