(2/4)Matlab(.exe)调用C/C++生成的(.dll)——Matlab调用DLL

(1/4)Matlab(.exe)调用C/C++生成的(.dll)——Matlab安装MinGW
(2/4)Matlab(.exe)调用C/C++生成的(.dll)——Matlab调用DLL
(3/4)Matlab(.exe)调用C/C++生成的(.dll)——MCR下载/安装
(4/4)Matlab(.exe)调用C/C++生成的(.dll)——已编译的应用程序(.exe)不支持使用头文件(.h)加载库(loadlibrary)

本文共给出两种教程方式:(一)简易教程;(二)详细教程;

一、简易教程

【简易教程1——VS操作步骤】
11、新建项目工程名:DLL,包括(.h)和(.cpp);
22、(.h)文件的函数需设置为外部接口:extern “C” __declspec(dllexport);
33、配置管理器-设置:Debug x64;
44、点击-编译;

【简易教程2——Matlab操作步骤】
11、将项目文件包下的(.h)和x64下的(.dll)移植到Matlab运行文件路径下;
22、命令行窗口:

loadlibrary('dll.dll','dll.h');	%加载dll模块
libfunctions DLL -full			%查看DLL中导出的函数

33、命令行窗口:

[X1,X2...XN] = calllib('LIBNAME','FUNCNAME',ARG1,...,ARGN)		%调用dll中的函数

二、详细教程

【详细教程1——Visual Studil操作步骤】
11、新建一个C++ DLL项目工程,命名为:MatlabDllTest
(1)利用Visual Studio建立一个Win32的Dll工程:文件-新建项目-Win32控制台应用程序
(2)应用程序类型:DLL; 附加选项:空项目;

22、添加头文件,编辑:MatlabDllTest.h

#pragma once
#ifndef MATLABDLLTEST_H
#define MATLABDLLTEST_H
#ifdef __cplusplus
extern "C"
{
#endif
	__declspec(dllexport)double add0(double x,double y);
	__declspec(dllexport)int plus0(double x,double y);
	#ifdef __cplusplus
}
#endif
#endif

33、添加源文件,编辑:MatlabDllTest.cpp

#include "stdafx.h"
#include "MatlabDllTest.h"
double add0(double x,double y)
{
	return (x + y);
}
int plus0(double x,double y)
{
	return (x - y)
}

44、属性配置及rebuild
(1)选择x64平台生成MatlabDllTest.dll:右击"项目解决方案",点击"属性",点击右上角的"配置管理器",然后选择"活动解决方案配置-Debug",“活动解决方案平台-x64”。
(2)rebuild程序,此时生成了64位的dll文件。
【备注1】如选择Win32平台生成胡Debug文件夹下胡(.dll),Matlab执行loadlibrary语句时,将显示如下报错提示:“具有与主机不同的体系结构”。
【备注2】Matlab命令行窗口:help loadlibrary(Matlab调用VS函数接口的注意事项:Limitations to Shared Library Support)
【备注3】如果加装的时候报错,需要在VS中修改项目属性:C/C++ -> 代码生成 -> 运行库设置为:多线程调试(/MTd)

【详细教程2——MATLAB操作步骤】
55、在Matlab的命令窗口输入:
mex -setup
选择编译器:mex -setup C++。

66、加载DLL
把编译链接之后产生的MatlabDllTest.dll和MatlabDllTest.h文件,拷贝到Matlab的当前工作目录下,输入:
loadlibrary('MatlabDllTest.dll','MatlabDllTest.dll');

77、查看DLL中导出的函数:
libfunctions MatlabDllTest -full;
-full选项会列出导出函数的详细输入和输出参数,输出信息如下:
类 lib.dll 的方法:
double add0(double,double)
int32 puls(double,double)

88、调用函数
[ doublePtr ] = calllib('MatlabDllTest','add',1.3,4.6);
【备注1】如果您调用的函数没有正确的输入或输出参数,或者头文件中的函数签名中存在错误,则会发生此错误。报错显示如下:(错误)没有匹配的签名。
详情请Matlab Search:(错误)没有匹配的签名。

99、从内存中卸载共享C库,以释放内存。
unloadlibrary MatlabDllTest;

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: loadlibrary是Matlab的一个函数,用于动态链接库的加载。如果出现错误,可能是因为动态链接库的路径不正确,或者动态链接库不兼容当前的Matlab版本。需要确保路径正确,并且动态链接库版本与Matlab版本匹配。 ### 回答2: 在使用Matlab中的loadlibrary函数时,有时会出现错误。以下是一些常见的错误和解决方法: 1.错误信息:"The specified module could not be found." 解决方法:这可能是由于库文件路径不正确引起的。请确保库文件的路径是正确的,并在loadlibrary函数中正确指定。 2.错误信息:"Unable to load one or more of the requested types." 解决方法:这可能是由于库文件缺少一些类型定义引起的。请确保库文件中包含所有需要的类型定义,并在loadlibrary函数中正确指定。 3.错误信息:"Invalid MEX-file 'filename': The specified procedure could not be found." 解决方法:这可能是由于使用了错误的函数名引起的。请确保在loadlibrary函数中指定的函数名称是正确的,并且与库文件中的函数名称完全匹配。 4.错误信息:"Undefined function or variable 'libraryname'." 解决方法:这可能是由于没有正确加载库文件引起的。请确保已正确加载库文件,并在loadlibrary函数中使用正确的库文件名称。 总之,大多数loadlibrary函数的错误都由于路径问题、类型定义问题、函数名称不匹配或库文件未加载等原因引起。正确解决这些问题需要仔细检查代码,并确保正确地指定相关参数。 ### 回答3: loadlibrary 是 MATLAB 中一个用于动态链接库加载的函数,使用它可以加载外部 DLL 或者共享对象库,将其作为 MATLAB 的一个函数库来使用,从而提高 MATLAB 的功能性。然而,在使用 loadlibrary 的过程中,有时候会出现一些错误,我们需要找到相应的解决方法。 1. 错误信息:Could not load the DLL xxxx.dll 这个错误常常是由于要加载的 DLL 文件或者其依赖的库文件没有加到系统 PATH 环境变量里面所引起的。解决这个问题的方法就是找到所需要的 DLL 或者库文件的路径,然后在 MATLAB 中添加路径。可以使用 addpath 函数或者 Set Path 工具箱来解决问题。 2. 错误信息:Undefined function or variable 'libname' 当你调用 loadlibrary 的时候,你需要指定一个调用 DLL 的别名,这个别名在后面你调用 DLL 的时候会用到。很多时候这里写错了别名,或者忘记给代表这个别名的字符串变量赋值了。这里的解决方法就是检查你写的这个别名是否正确,并且确认代表这个别名的字符串变量已经赋值。 3. 错误信息:The system cannot find the specified file 这个错误是由于 loadlibrary 所指定的 DLL 文件无法被找到,常常是由于 DLL 文件不存在,或者路径有误所引起。解决这个问题的方法就是找到正确的 DLL 文件的路径,或者确认 DLL 文件已经正确放置。 4. 错误信息:Cannot open include file 'header.h' 这个错误是由于要加载的 DLL 依赖的头文件没有在 MATLAB 中被找到所引起的。解决这个问题的方法就是找到正确的头文件路径,然后在 MATLAB 中添加路径。同样地,你可以使用 addpath 函数或者 Set Path 工具箱来解决问题。 总之,错误使用 loadlibrary 的情况可能很复杂,但这些解决方法通常适用于绝大部分要出现的错误。如果你的问题不在上面列举的范畴内,你也可以查阅 MATLAB 的文档或者支持论坛以获得更详细的解决方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖墩会武术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值