首先,必须要强调的问题是,我本来以为这两者混合编程与双方的版本问题没有关系,虽然网上有很多网友都说和版本有关,但是我还是一头死心,想把MATLAB2012b与vs2013连接起来。尝试了千百种方法,出错误到头大。在别人的MATLAB2016a上运行mcc mex等命令顺利得到我要配置的文件。因此,终于放弃挣扎,卸载了2012b安装了较新版本的MATLAB2016a。一下是具体过程:
(1)第一次努力调试:整个系统的环境是w10,MATLAB2012b,vs2013
step 1:这个时候就需要在MATLAB里面敲很多命令,包括没build -setup;mex -setup;两个命令。需要注意的是,这两个命令中“-”前面是有空格的。具体的我是参考是百度文库,白水米饭这位网友上传的文章的第一部分内容:
http://wenku.baidu.com/link?url=hug8CR9wprZ401u9TgTPXdBGG2sD8OAfS_tEVnDwTUzw4BUxJncW_p_34uoSnq8D- HonLddofmYVMc1ad9y4Sl6MQZs5YNLPGGbvJPHAsz3
step 2:写m文件,实际上是一个简单的函数
function [c]=MyAdd(a,b)
%UNTITLED Summary of this function goes here
% Detailed explanation goes here
c=a+b
end
保存为MyAdd.m文件。
step 3:在MATLAB中敲入 mcc -W cpplib:MyAdd -T link:lib -h libmmfile.mlib MyAdd.m 命令。
等待MATLAB反应,这需要一段时间。但实际上,我在MATLAB2012b中,走到这一步就完全卡死了,根本得不到我想要的xx.cpp xx.dll xx.def xx.exp ……等 等。因此挪步第二种环境情况。
(2)第二次努力调试:整个系统的环境是w10,MATLAB2016a,vs2013
step 1:卸载MATLAB2012b
step 2:安装MATLAB2016a,需要该步骤中MATLAB2016a安装包的同志可以在下方评论区留言告知,我会将百度网盘整理分享出来。
step 3:敲MATLAB命令
mcc -W cpplib:MyAdd -T link:lib -h libmmfile.mlib MyAdd.m
等待反应然后
mex -setup
等待反应做相应选择。会出现如图所示的几个文件。还有相应的readme等txt文件等。
step 4:配置系统环境。
第一,在搜索窗搜索“环境变量”----用户变量-----路径(path)------新建(添加MATLAB2016a软件安装目录):
即就是添加这两个:从…到MATLAB/extern/lib/win64/microsoft;
从…到MATLAB/bin/win64;
第二,在搜索窗搜索“环境变量”----系统变量-----路径(path)------新建(添加目录):
即就是添加这两个:从…到MATLAB/runtime/win64;
从…到MATLAB/bin/win64;
从…到MATLAB/bin;
从…到MATLAB/extern/lib/win64/microsoft;
step 5:配置vs2013环境。
第一,创建一个控制平台程序,空项目,建一个cpp文件,写入测试程序:
test.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <iostream>
//#include "mclmcr.h"
//#include "matrix.h"
//#include "mclcppclass.h"
#include "MyAdd.h"
using namespace std;
#pragma comment(lib, "MyAdd.lib")
int main()
{
double a = 6;
double b = 9;
double c;
// initialize lib,这里必须做初始化!
if (!MyAddInitialize())
{
std::cout << "Could not initialize libMyAdd!" << std::endl;
return -1;
}
//mclmcrrt9_0_1.dll
// 为变量分配内存空间,可以查帮助mwArray
mwArray mwA(1, 1, mxDOUBLE_CLASS); // 1,1表示矩阵的大小(所有maltab只有一种变量,就是矩阵,为了和Cpp变量接轨,设置成1*1的矩阵,mxDOUBLE_CLASS表示变量的精度)
mwArray mwB(1, 1, mxDOUBLE_CLASS);
mwArray mwC(1, 1, mxDOUBLE_CLASS);
// set data,不用我解释了吧,很简单的,调用类里面的SetData函数给类赋值
mwA.SetData(&a, 1);
mwB.SetData(&b, 1);
// using my add,掉我自己写的函数
MyAdd(1, mwC, mwA, mwB);
// get data,不用我解释了吧,很简单的,调用类里面的Get函数获取取函数返回值
c = mwC.Get(1, 1);
std::cout << "c is n" << c << std::endl;
// 后面是一些终止调用的程序
// terminate the lib
MyAddTerminate();
// terminate MCR
mclTerminateApplication();
return 0;
}
//int _tmain(int argc, _TCHAR* argv[])
//{
// return 0;
//}
第二,属性页---VC++目录---包含目录,添加:从…到MATLAB/extern/include;
第三,属性页---VC++目录---库目录,添加:从…到MATLAB/extern/lib/win64/microsoft;
第三,属性页---C/C++---常规----附加包含目录,添加:从…到MATLAB/extern/include;
第四,属性页---连接器---常规----附加库目录,添加:从…到MATLAB/extern/lib/win64/microsoft;
第五,属性页---连接器---输入----附加依赖项,添加:libeng.lib libmat.lib libmex.lib libmx.lib mclmcrrt.lib mclmcr.lib libMyAdd.lib
step 6:把生成的libxx.h libxxx.dll libxxx.lib 等文件复制到vs下新建的工程的文件夹下,然后添加-----现有项 添加到工程中。
step 7:然后编译连接,生成运行。即可完成混合编程测试。