matlab与VS混合编程以及错误解决

目录

前言:

1. matlab打包生成dll文件

打包方法一:

打包方法二:

2. VS端配置

3. 代码测试

4. 错误解决

a. 1.0x0000000000000000 处有未经处理的异常(在 Project1.exe 中): 0xC0000005: 执行位置 0x0000000000000000 时发生访问冲突。

b. 找不到.dll文件

c. LNK 11XX无法打开lib文件

d. 其它注意事项


前言:

在实际开发中,通常要将matlab的函数供vs环境下的工程调用,本文将介绍混合编程的过程以及错误处理。

本文主题: 将MATLAB打包生成的dll文件,用于VS工程调用。

环境:

matlab 2021

Visual Studio 2015

注意: VS版本尽量不要高于matlab版本!!

1. matlab打包生成dll文件

        首先创建两个matlab文件

function [result] = add3(a,b,c)
    result = a+add2(b,c);
end
function [result] = add2(a,b)
    result = a+b;
end

matlab的输出尽量放到一个数组里面,减少输出数据的个数。

打包方法一:

第一步:在命令行窗口输入mbuild -setup(注意-之前加空格,否则报错)

第二步:点击mex -setup C++ -client MBUILD后

第三步:继续输入deploytool 等待弹出窗口,并选择Library Compiler

第四步:选择C++ Shared Library,选其他的生成的不对,然后点击右侧加号,选择.m文件,

第五步:点击右上角生成按钮,选择生成文件放置文件夹,点击保存。

第六步:等待打包完成,点击输出文件。

输出文件如下图所示:

只需要红框中的 .lib,.h,.dll三个文件。

打包方法二:

第一步:在命令行窗口输入mbuild -setup(注意-之前加空格,否则报错)

第二步:点击mex -setup C++ -client MBUILD后

第三步:输入 mcc -W cpplib:add3 -T link:lib add3

解释:
-W是控制编译之后的封装格式;
cpplib是指编译成C++的lib,如果需要编译成C的lib,就用lib即可,去掉cpp;
cpplib后面的是需要生成文件的文件名,是自己取的,我取名为add3;
-T表示目标,link:lib表示要连接到一个库文件的目标,目标的名字即是.m函数的名字。
其他具体含义可以通过mcc –help命令查看,注意参数的大小写。

最后,工程目录下多了几个文件,同样只需要红框中的.lib,.h,.dll三个文件

多个.m文件打包成一个.dll:

与打包方法二一样,只是最后一条语句为:输入 mcc -W cpplib:adds -T link:lib add3 add2

        这样就将add3.m与add2.m打包到了一个dll文件里面,此时生成的adds.h文件注册了两个可执行函数add3与add2。

2. VS端配置

第一步:新建一个VS工程,按如下步骤操作

第二步:设置Include 和Library 目录

项目右键->属性->VC++目录->包含目录:添加

<MATLAB>\R2010b\extern\include 我的是:D:\Matlab\MATLAB2021\extern\include

<MATLAB>\R2010b\extern\lib\win32\microsoft 我的是D:\Matlab\MATLAB2021\extern\lib\win64\microsoft

配置后如下图所示

第三步:设置工程目录(很多人出错)

项目右键->属性->C/C++->常规->附件包含目录:添加

<MATLAB>\R2010b\extern\include\ 我的是 D:\Matlab\MATLAB2021\extern\lib\win64\microsoft

第四步:设置链接器(很多人出错)

项目右键->属性->链接器->常规:添加

<MATLAB>\R2021b\extern\lib\win64\microsoft 我的是D:\Matlab\MATLAB2021\extern\lib\win64\microsoft

项目右键->属性->链接器->输入->附件依赖性:添加

配置link连接器,添加:

add3.lib(这一个是add3.m生成的)

libeng.lib

libmat.lib

libmex.lib

libmx.lib

mclmcrrt.lib

mclmcr.lib

附件依赖性在VS2010前以空格隔开,在VS2010后使用;隔开。

第五步:设置环境变量(很多人出错)

我的电脑->属性->高级系统设置->高级->环境变量->Path,添加:

我的是 D:\Matlab\MATLAB2021\bin\win64

配置环境变量后,重启电脑!!!

配置环境变量后,重启电脑!!!

配置环境变量后,重启电脑!!!

第六步:将生成的.h,.dll,.lib文件放到matlab相应目录下

将.dll文件放入 D:\Matlab\MATLAB2021\bin\win64目录

将.h文件放入 D:\Matlab\MATLAB2021\extern\include目录

将.lib文件放入 D:\Matlab\MATLAB2021\extern\lib\win64\microsoft目录

第七步:将生成的.h,.ll,.lib文件放到VS工程目录下

3. 代码测试


#include "stdafx.h"
#include <iostream>
#include "add3.h"
#include "engine.h"
using namespace std;
int main()
{
	mclmcrInitialize();
	if (!mclInitializeApplication(NULL, 0)) return -1;
	if (add3Initialize()) {
		//salientObjectDetection();
		int a = 10, b = 20, c = 30;
		int d;
		mwArray mwA(1, 1, mxINT32_CLASS);
		mwArray mwB(1, 1, mxINT32_CLASS);
		mwArray mwC(1, 1, mxINT32_CLASS);
		mwArray mwD(1, 1, mxINT32_CLASS);
		mwA.SetData(&a, 1);
		mwB.SetData(&b, 1);
		mwC.SetData(&c, 1);
		add3(1, mwD, mwA, mwB, mwC);
		add3Terminate();
		mwD.GetData(&d, 1);
		cout << "d=" << d << endl;
		return 0;
	}
	return -1;
}

点击运行:

 注意:运行的工程与配置的工程是否一致!!!

运行结果:

至此大功告成:

4. 错误解决

a. 1.0x0000000000000000 处有未经处理的异常(在 Project1.exe 中): 0xC0000005: 执行位置 0x0000000000000000 时发生访问冲突。

解决办法一:取消勾选点击继续

解决办法二:忘记对调用的matlab函数进行初始化了,初始化函数为:

XXXInitialize()

我的是add3Initialize(),返回1表示成功,0表示失败。

解决办法三:自己给matlab安装了其他小工具:

也就是你装了一个工具箱到Matlab ,并且这个工具箱会会在matlab运行的时候直接启动,这样直接导致matlab生成的dll文件中也包含了这个文件,所以直接去matlab的 安装目录下找到toolbox\local 路径删,然后在重新用matlab生成一下dll文件。

b. 找不到.dll文件

解决办法1:没有将生成的.dll文件放入matlab安装目录相应位置,和vs工程下。

解决办法2:没有配置环境变量,注意VS配置的第五步。

c. LNK 11XX无法打开lib文件

解决办法:与找不到.dll文件解决办法一样,注意.lib文件是否放入了matlab工程和vs工程的指定位置,并且注意VS工程的二、 三、 四、步是否配置成功。

d. 其它注意事项
  1. matlab中,用syms 定义了变量时,生成的项目到VS环境下会无法运行。一定要将matlab中的syms和sym去掉!!!否则无法运行。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值