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

目录

前言:

[1. matlab打包生成dll文件](#1. matlab打包生成dll文件)

打包方法一:

打包方法二:

[2. VS端配置](#2. VS端配置)

[3. 代码测试](#3. 代码测试)

[4. 错误解决](#4. 错误解决)

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

[b. 找不到.dll文件](#b. 找不到.dll文件)

[c. LNK 11XX无法打开lib文件](#c. LNK 11XX无法打开lib文件)

[d. 其它注意事项](#d. 其它注意事项)


前言:

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

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

环境:

matlab 2021

Visual Studio 2015

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

1. matlab打包生成dll文件

首先创建两个matlab文件

Matlab 复制代码
function [result] = add3(a,b,c)
    result = a+add2(b,c);
end
Matlab 复制代码
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. 代码测试

cpp 复制代码
#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去掉!!!否则无法运行。
相关推荐
爱技术的小伙子2 分钟前
【30天玩转python】面向对象编程基础
开发语言·python
theoxiong12 分钟前
Python的Scapy库详解
开发语言·python·网络协议·tcp/ip·http·信息与通信·scapy
_晓夏_21 分钟前
【JVM 工具命令】JAVA程序线上问题诊断,JVM工具命令的使用,jstat, jstack,jmap命令的使用
java·开发语言·jvm·jvm命令工具·java程序线上问题定位命令·java程序问题故障排查命令·jvm线上问题故障排查
机器学习之心22 分钟前
时序预测 | Matlab实现PSO-CNN粒子群优化卷积神经网络时间序列预测
matlab·cnn·时间序列预测·pso-cnn·粒子群优化卷积神经网络
阿昆的科研日常28 分钟前
R语言论文插图模板第9期—滑珠散点图
开发语言·r语言·可视化·论文插图
hsg7732 分钟前
ArcGIS Pro 克隆clone python环境报错问题处理方法
开发语言·python·arcgis
Dola_Pan37 分钟前
C++ STL-deque容器入门详解
开发语言·c++
Ty_110638 分钟前
深入理解Java虚拟机:Jvm总结-虚拟机字节码执行引擎
java·开发语言·jvm
1750633194543 分钟前
Matlab/Simulink中PMSM模型的反电动势系数和转矩系数
算法·机器学习·matlab
Flying_Fish_roe44 分钟前
Reactive 编程-Vert.x
开发语言·python