http://blog.sina.com.cn/s/blog_67dd3b950101er5t.html
1、背景
众所周知,matlab在处理矩阵、数学计算、计算机仿真、图像处理等方面有着 c c++无可比拟的优势,但是做成系统供使用时,又显得过于粗糙,为了使用起来高大上,计算起来有简单,方便。无疑,c++ 与matlab混合编程将会使非常靠谱的选择。
这里暂且不论所谓的matlab效率低,c/c++效率高的问题,自我感觉,以我目前编码的功底,所编写的代码的效率远远不及matlab提供的代码的效率。除非你是大牛,或者你是人云亦云,所以能用matlab混合c++编码还是很不错的选择,话不多说,我们开始讨论正题。
2、我使用的版本是matlab2012与vs2010混合编程的。
软件的下载这里就不多说了,我相信看这篇教程的你,这两个软件已经安装的妥妥当当的了。
这个是求两个矩阵的和的一个函数,建立好之后就开始编译了,在Matlab主面板中输入mex-setup,选择编译器,如图:
选择y,选择完了再对mbuild进行选择,在Matlab主面板里面输入:mbuild-setup,和编译器一样,进行选择,操作一模一样,这里就不在啰嗦了,完了之后就开始编译文件了,
在主面板里面输入 mcc -W cpplib:add -T link:libadd.m,其中,前一个add是编译产生的文件名,后一个add.m是你编写的matlab源文件,接下来就是等待编译了,大概需要编译个几分钟,完了之后就会在源文件的目录下面产生一些文件,如下图:
但是,我们需要的只有三个文件,.dll、.lib、.h文件,其他的可要可不要。好了,源文件已经编译好了,接下来就是对VC环境进行配置了,再次声明,我的平台是VC2010+Matlab2012a,首先创建一个工程,然后右键单击工程—>属性—>VC++目录,添加包含目录:D:ProgramFilesMATLABR2012aexterni
#include <iostream>
#include "add.h"
using namespace std;
int main()
{
}
接下来直接执行就可以了,我的程序运行的结果如下:
ps说明:配置过程中遇到的问题:
配置时经常遇到 LINK2019的错误。这种错误就是典型的lib缺失导入的问题。
main.obj : error LNK2019: 无法解析的外部符号 mclGetMatrix_proxy,该符号在函数 "public: __cdecl mwArray::mwArray(unsigned __int64,unsigned __int64,enum mxClassID,enum mxComplexity)" (??0mwArray@@QEAA@_K0W4mxClassID@@W4mxComplexity@@@Z) 中被引用 1>main.obj : error LNK2019: 无法解析的外部符号 mclcppGetLastError_proxy,该符号在函数 "public: static void __cdecl mwException::raise_error(void)" (?raise_error@mwException@@SAXXZ) 中被引用 1>main.obj : error LNK2019: 无法解析的外部符号 mclcppCreateError_proxy,该符号在函数 "public: __cdecl mwException::mwException(void)" (??0mwException@@QEAA@XZ) 中被引用 1>main.obj : error LNK2019: 无法解析的外部符号 ref_count_obj_addref_proxy,该符号在函数 "public: __cdecl mwException::mwException(class mwException const &)" (??0mwException@@QEAA@AEBV0@@Z) 中被引用 1>main.obj : error LNK2019: 无法解析的外部符号 ref_count_obj_release_proxy,该符号在函数 "public: virtual __cdecl mwException::~mwException(void)" (??1mwException@@UEAA@XZ) 中被引用 1>main.obj : error LNK2019: 无法解析的外部符号 error_info_get_message_proxy,该符号在函数 "public: virtual char const * __cdecl mwException::what(void)const " (?what@mwException@@UEBAPEBDXZ) 中被引用 1>main.obj : error LNK2019: 无法解析的外部符号 array_ref_getV_int_proxy,该符号在函数 "public: class mwArray __cdecl mwArray::GetPromoted(unsigned __int64,...)" (?GetPromoted@mwArray@@QEAA?AV1@_KZZ) 中被引用 1>main.obj : error LNK2019: 无法解析的外部符号 array_ref_set_numeric_mxDouble_proxy,该符号在函数 "public: void __cdecl mwArray::SetData(double *,unsigned __int64)" (?SetData@mwArray@@QEAAXPEAN_K@Z) 中被引用 1>main.obj : error LNK2019: 无法解析的外部符号 array_ref_get_numeric_mxDouble_proxy,该符号在函数 "public: __cdecl mwArray::operator double(void)const " (??BmwArray@@QEBANXZ) 中被引用
这里是因为缺少:mclmcrrt.lib
#pragma comment(lib,"mclmcrrt.lib") 也可能是VS中的平台配置问题,若MATLAB是32位则选择win32,若64位则应选择x64
即可解决。
由于以上连接中采用的是32位,此操作系统为64位,MATLAB R2012a为64位,解决办法:
打开配置管理器,如下:
点击WIN32后的小按钮,点new,加入64位,如下图:
后,单击确定,进行编译,即Build,成功编译。
RDAClient.exe 中的 0x00000000 处有未经处理的异常: 0xC0000005: 在位置 0x0000000000000000 发生访问冲突
是因为在定义mwArray变量之前没有调用 Initialize()函数,在定义之前调用即可解决