(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;

你可能感兴趣的:(经验分享,matlab)