Visual Studio 编译 mexFunction(详细)

1. 创建项目

打开Visual Studio 2019, 新建控制台项目

  

2. 配置项目属性

       选择Debug模式或者Release模式,注意,模式不同后面配置也不同!平台一定选x64!

打开项目属性配置页,选择配置属性目录,然后分别进行如下操作:

配置类型选择dll动态库,即生成的文件为动态库。

VC++目录 -> 包含目录   

  1. 加入MATLAB的include路径 : .....\matlab\extern\include
  2. 加入opencv安装路径 : ......\opencv\build\include

VC++目录 -> 库目录      

  1. 加入MATLAB的库目录路径:.....\matlab\extern\lib\win64\microsoft
  2. 加入OPENCV的库目录路径:.....\opencv\build\x64\vc15\lib

链接器 -> 输入 -> 附加依赖项  

输入libmx.lib;libeng.lib;libmat.lib;libmex.lib;

Release模式: opencv_core2411.lib;opencv_highgui2411.lib; opencv_imgproc2411.lib;

Debug模式: opencv_core2411d.lib;opencv_highgui2411d.lib;opencv_imgproc2411d.lib

链接器 -> 常规 -> 启用增量链接 -> 选择否  

C/C++ -> 代码生成 -> 运行库

Release模式: 选择 多线程(/MT) 或 多线程DLL(/MD)

Debug模式: 选择 多线程调试(/MTd) 或 多线程调试DLL(/MDd) 

——注意模式要与前面的Release或Debug匹配,不然编译不通过。

       多线程(/MT) 或 多线程DLL(/MD)的区别是多线程(/MT)生成的文件把依赖的DLL文件也一起包含进来了,文件比较大,调用的时候不会出现找不到依赖DLL的情况,而多线程DLL(/MD)生成的文件没有把依赖的DLL文件包含进来,调用的时候再现加载,所以可能会出现找不到依赖项的情况,这时需要把依赖的DLL文件拷贝到程序运行的文件夹下。

缺少DLL依赖会报错:

查看DLL依赖项——下Dependency Walker程序(神器)

网站:Dependency Walker (depends.exe) Home Page    win10下这个!

解压后运行depends.exe,将.mexw64或.dll文件拖入空白处,例如下面这个.mexw64文件:

缺少4个依赖文件,分别找到这4个文件并拷贝到.mexw64的文件夹下。 

        再在matlab运行mexw64的函数就不会出现找不到函数模块的情况了。或者运行库直接设置成  多线程(/MT)  或  多线程调试(/MTd),这样生成的dll文件大一些,但不用再去找依赖dll。

3. 编辑mexFuction函数

matlab有两种方式写mexFuction函数:

1) C 矩阵 API 

#include "mex.h"

void mexFunction(int outputElementCount, mxArray *outputs[], int inputsElementCount, const mxArray *inputs[])

{

   .......  //具体的函数实现

}

这种形式需要在项目源文件中新建一个的. def文件。 在EXPORTS段加入mexFunction, 如:      

采用C矩阵API的模式要有.def文件,不然VS编译能通过,但是matlab调用函数的时候会提示找不到函数入口。

2) MATLAB 数据 API 

参考:https://ww2.mathworks.cn/help/matlab/matlab_external/c-mex-source-file.html

#include "mex.hpp"

#include "mexAdapter.hpp"

using namespace matlab::data;

using matlab::mex::ArgumentList;

class MexFunction : public matlab::mex::Function {

public:

    void operator()(ArgumentList outputs, ArgumentList inputs) {

....... //具体的函数实现

}};

       这种形式不需要def文件,可以直接生成matlab调用的入口函数。

       最后VS生成解决方案后在项目文件夹下的x64\Debug或x64\Release即可找到生成的.dll文件,将dll后缀改为.mexw64并拷入matlab相应程序下即可调用函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值