vc与matlab混合编程版本问题解决方法(接着上一篇)

来源:互联网 发布:4g网络必须用4g手机吗 编辑:程序博客网 时间:2024/06/04 20:07

vcmatlab混合编程版本问题解决方法

 

(首先声明本人没有经常使用matlab,不是很熟悉matlab的使用情况,但以下是这三天折腾完发现的问题,希望能对大家有所帮助。)

由于matlab的版本比较多,造成了混合编程时会碰到很多问题。查找了很多资料发现matlab的改变主要分界线是7.0版本。Matlab7.0以前的编程库文件、头文件的定义与之后的版本有点区别。通过查找,网上的应用实例有不同的说明,挺乱的。比较典型的有两种:一种是使用mcc -W lib:libmcctest02 -T link:lib mcctest02.m命令生成libmcctest02.hlibmcctest02.liblibmcctest02.dll文件;另一种是使用deploytool方法生成libmcctest02.hlibmcctest01.liblibmcctest02.dll文件。这中间就存在一些问题,以下说明这两中生成dll文件给编程带来的麻烦。

1.   使用mcc -W lib:libmcctest02 -T link:lib mcctest02.m生成的dll文件是基于C语言的,如果使用VC编程时将会存在问题,比如mwarray类就不能调用,一般网上说明是需要天剑matlab.hpp文件,但是matlab7.0版本以后就没有这个文件了,cpp的class已经包含在头文件在#include"mclcppclass.h"中了,需要在VC文件中加入该头文件。但是在调用M文件定义函数时,需要调用mlf+函数名,如mlfmcctest02();生成的头文件libmcctest02.h中也能看到该函数的定义。

extern LIB_libmcctest02_C_API bool MW_CALL_CONVmlfMcctest02(mxArray* wndname, mxArray* showwnd);

2.   deploytool方法生成libmcctest02.hlibmcctest01.liblibmcctest02.dll文件才是VC编程员最想要的。生成方法在网上很多,这里就不一一说明了,只强调一点在建立项目是需要选择C++ Share Library本人使用matlab2012a)。如下图,其他的步骤就跟网友们说的一样了。

具体类似方法:http://archive.cnblogs.com/a/1941220/

编译生成libmcctest02.hlibmcctest01.liblibmcctest02.dll,现在咱们看libmcctest02.h有什么变化。

extern LIB_libmcctest02_CPP_API void MW_CALL_CONVmcctest02(const mwArray& wndname, const mwArray& showwnd);

调用定义函数时调用mcctest02()就可以了,并且不需要添加#include "mclcppclass.h"文件,因为已经包含在libmcctest02.h文件中了。

3.   下面是在VC中使用时不看头文件libmcctest02.h,造成的时间浪费,希望大家不用犯同样的错误了。在查看资料或者网页时会发现,一般在定义调用mcctest02()参数时都是用mwArray类来定义,但是如果使用mcc -W lib:libmcctest02 -T link:lib mcctest02.m生成库文件的方法,是行不通的,因为mlfMcctest02(mxArray* wndname, mxArray* showwnd);的参数是mxArray类声明的形参,对应不上。这种错误最直接的解决方法是查看matlab的帮助文档。

4.   以上的过程在使用VC6.0与VS2005都验证过,在做混合编程时,应该跟VC的版本没很大的关系。在MFC应用程序中插入Matlab的figure时,有一个问题需要注意,这是VC编译器的应用问题。

VC6.0HWNDhFig = ::FindWindow(NULL, "Mytest");"Mytest"还可以使用表示该字符串的数组或指针,但是在VS2005中不可以。

VS2005HWNDhFig = ::FindWindow(NULL, _T("Mytest"));

原创粉丝点击