当前位置: 首页 > news >正文

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三个文件

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去掉!!!否则无法运行。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Liunx入门】Liunx换源
  • 【MATLAB学习笔记】绘图——分割绘图背景并填充不同的颜色
  • 三级_网络技术_50_综合题(报文)
  • Webpack中的自定义 loader 的简单实现
  • C#面:ASP.NET MVC 中如何用表单认证?
  • 二叉树高频题目-上-不含树型dp
  • 认知杂谈25
  • Vue3+Ts封装input组件时遇到的问题
  • C#高级进阶---关于插件开发(初版)
  • 在Ubuntu 16.04上安装MongoDB的方法
  • MySQL多表查询,找出包含全部标签的邮件,包含任意标签的邮件
  • 【Go - 特殊导入包方式 . 和 _】
  • mybatis-plus中Swagger 模式和Kotlin 模式是什么?
  • matlab 计算矩阵元素的标准差
  • 条件拼接 - 根据入参生成where条件
  • ECS应用管理最佳实践
  • python docx文档转html页面
  • session共享问题解决方案
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • Swift 中的尾递归和蹦床
  • TypeScript实现数据结构(一)栈,队列,链表
  • Vue 重置组件到初始状态
  • 动态魔术使用DBMS_SQL
  • 分布式事物理论与实践
  • 工作中总结前端开发流程--vue项目
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 跨域
  • 面试总结JavaScript篇
  • 入手阿里云新服务器的部署NODE
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 试着探索高并发下的系统架构面貌
  • 算法---两个栈实现一个队列
  • 通过npm或yarn自动生成vue组件
  • 微服务入门【系列视频课程】
  • 怎么把视频里的音乐提取出来
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 容器镜像
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • (13)Hive调优——动态分区导致的小文件问题
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (一)模式识别——基于SVM的道路分割实验(附资源)
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • .chm格式文件如何阅读
  • .NET MVC 验证码
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .net 无限分类
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET8使用VS2022打包Docker镜像
  • .net连接oracle数据库
  • :中兴通讯为何成功
  • [04]Web前端进阶—JS伪数组
  • [AIGC] Nacos:一个简单 yet powerful 的配置中心和服务注册中心