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

news2024/11/14 3:22:08

目录

前言:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2074430.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity游戏开发——Unity脚本组件:游戏开发的灵魂

Unity游戏开发 “好读书&#xff0c;不求甚解&#xff1b;每有会意&#xff0c;便欣然忘食。” 本文目录&#xff1a; Unity游戏开发 Unity游戏开发Unity脚本组件&#xff1a;游戏开发的灵魂前言1.Standard Assets导入报错解决办法2. 什么是Unity脚本组件&#xff1f;3. 创建和…

vue 精选评论词云 集成echarts-wordcloud TF-IDF算法

这一期在我们的系统里集成词云组件&#xff0c;开发的功能是景区精选评论的词云展示功能。 这个界面的逻辑是这样的&#xff1a; 在数据框里输入城市&#xff0c;可以是模糊搜索的&#xff0c;选择城市&#xff1b; 选择城市后&#xff0c;发往后台去查询该城市的精选评论&a…

python,json数据格式,pyecharts模块,pycharm中安装pyecharts

json数据格式 JSON是一种轻量级的数据交互格式 可以按照JSON指定的格式去组织和封装数据 JSON本质上是一个带有特定格式的字符串 主要功能&#xff1a; json就是一种在各个编程语言中流通的数据格式&#xff0c;负责不同编程语言中的数据传递和交互. 类似于&#xff1a; 国…

P39-数据存储2

编程题 编程题 编程题

2024 年顶级 Flutter UI 框架和库

根据 2022 年 StackOverflow 调查显示&#xff0c;Flutter 是最受欢迎的跨平台工具之一。自发布以来的 16 个月内&#xff0c;已有超过 200 万开发者采用了 Flutter。在本博客中&#xff0c;我们将浏览 GitHub 上可用的顶级 Flutter 存储库。除了每个存储库之外&#xff0c;还提…

MySQL 系统学习系列 - 事务、视图与存储过程的使用《MySQL系列篇-06》

数据库事务、视图、存储过程 事务 1. 事务简介 事务&#xff08;transaction&#xff09;是指访问并更新数据库中各种数据的一个程序执行单元&#xff08;unit&#xff09; [最小执行单元] MySQL事务主要用于处理操作量大。复杂度高的数据 1.MySQL数据库只有InnoDB引擎支持事…

App应用冷启动耗时排查

1 查看冷启动耗时 adb shell am start -S -W com.gerry.lifecycle/com.gerry.lifecycle.MainActivity发现冷启动耗时居然要6s多&#xff0c;下面开始排查 2 生成trace文件 // Application中开始trace记录 override fun attachBaseContext(base: Context?) {super.attachBas…

虚幻5|简单的设置角色受到伤害,远程攻击机关设置,制作UI,低血量UI

虚幻5|制作玩家血量&#xff0c;体力&#xff08;还未编辑&#xff0c;只用于引用&#xff09;-CSDN博客 需完成制作玩家血量及体力部分 一.给角色添加死亡动画 1.为了保证角色在播放死亡蒙太奇的时候&#xff0c;不会重新播放&#xff0c;而是保持原来倒地的姿势&#xff0…

Renesa Version Board开发RT-Thread 之WIFI创建Client

概述 本文主要介绍使用Renesa Version Board中WIFI功能&#xff0c;该模块基于RW007模块设计&#xff0c;RT-Thread软件架构已经实现该硬件相关的驱动接口。笔者基于该模块的相关接口在LWIP软件框架的基础上实现Client功能。实现数据的发送和接收。 1 WLAN 框架简介 参考文档…

【Java】—— Java面向对象基础:使用Java创建和打印员工对象信息

在Java中&#xff0c;类的定义和使用是面向对象编程的核心。本文将通过一个简单的例子来展示如何定义一个员工类&#xff08;Employee&#xff09;&#xff0c;并在测试类中创建员工对象&#xff0c;为这些对象的属性赋值&#xff0c;并打印出它们的信息。 定义员工类&#xff…

大模型微调

文章目录 前言一、使用的库二、数据预处理1.引入库2.读入数据3.对数据进行预处理4.转换为json格式文件 三&#xff0c;使用算子分析数据并进行数据处理四&#xff0c;划分训练集和测试集五&#xff0c;编写训练脚本开始训练六&#xff0c;进行模型推理人工评估总结 前言 这是使…

网络优化|单源最短路|Dijkstra|Floyd|Matlab

图和网络可以用来描述集合元素和元素之间关系。大量的最优化问题都可以抽象为网络模型加以解释&#xff0c;描述和求解。 图与网络模型在建模时具有直观、易理解、适应性强等&#xff0c;广泛应用在管理科学、物理学、化学、计算机科学、信息论、控制论、社会科学以及军事科学等…

C# 循环访问目录树详解与示例

文章目录 一、目录树遍历的概念二、使用System.IO命名空间三、DirectoryInfo和FileInfo类四、递归遍历目录树五、示例&#xff1a;列出目录树中的所有文件和文件夹六、异常处理七、迭代方法八、总结 在C#中&#xff0c;访问文件系统是常见的需求之一。有时我们需要遍历目录树以…

嵌入式开发技术进步带来新机遇

嵌入式开发作为信息技术领域的重要分支&#xff0c;随着科技的不断进步&#xff0c;正迎来新的机遇。本文将从人工智能、物联网、边缘计算等方面探讨嵌入式开发技术的进步如何带来新的发展机遇&#xff0c;并展望未来的发展趋势。 一、引言 嵌入式系统是一种特殊的计算机系统&…

unreal engine5中character角色和怪物交互时发生穿模

UE5系列文章目录 文章目录 UE5系列文章目录前言一、原因定位二、解决方法 前言 在 Unreal Engine 5 中&#xff0c;角色“穿模”通常指的是角色模型与其他物体&#xff08;如墙壁、地面或其他对象&#xff09;发生不正确的穿透或重叠现象。这可能是由多种原因造成的&#xff0…

C++ | Leetcode C++题解之第372题超级次方

题目&#xff1a; 题解&#xff1a; class Solution {const int MOD 1337;int pow(int x, int n) {int res 1;while (n) {if (n % 2) {res (long) res * x % MOD;}x (long) x * x % MOD;n / 2;}return res;}public:int superPow(int a, vector<int> &b) {int an…

C# 泛型类型的约束详解与示例

文章目录 一、泛型约束概述二、泛型约束详解与示例1. 类约束2. 接口约束3. 引用类型约束4. 值类型约束5. 无参数构造函数约束6、多重约束7、默认构造函数约束8、基类和接口的组合约束 三、总结 在C#编程语言中&#xff0c;泛型是一种非常强大的特性&#xff0c;它允许我们编写可…

NetSuite 2024.2 学习笔记

NetSuite一年两次的发版&#xff0c;每次都会带来一些新的东西。这对于顾问来说&#xff0c;应该成为必修课。 每个版本发版内容的学习时长&#xff0c;大约在20小时左右。包括&#xff1a; •Release Notes通读 •Release Preview环境申请 •热点功能验证 •New Release学习笔…

vue中video视频路径改变,dom不更新问题

效果展示 视频切换前 视频切换后 完整代码 <template><!-- 设置v-if只在路径有值时&#xff0c;标签才存在 --><video v-if"state.videoSrc ! null" controls><source :src"state.videoSrc" type"video/mp4"></…

Java | Leetcode Java题解之第372题超级次方

题目&#xff1a; 题解&#xff1a; class Solution {static final int MOD 1337;public int superPow(int a, int[] b) {int ans 1;for (int e : b) {ans (int) ((long) pow(ans, 10) * pow(a, e) % MOD);}return ans;}public int pow(int x, int n) {int res 1;while (n…