目录
前言:
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. 其它注意事项
- matlab中,用syms 定义了变量时,生成的项目到VS环境下会无法运行。一定要将matlab中的syms和sym去掉!!!否则无法运行。