项目中遇到了一个情况,需要使用matlab来调用C++一个动态库,整理如下:
一、基本调用
1. 需要安装mingw编译器
2. matlab去编译一个C++的包装函数(转接函数)
3. 包装函数(转接函数)里面去调用真正需要调用的C++逻辑
参开代码:
mex编译
mex('package.cpp', ...
'CXXFLAGS -std=c++17',...
'-g',...
'-IF:\include',... % 需要包含的头文件路径
'-lopencv_world422d',... % 需要使用的库路径
);
C++实现:
#include "Test.h"
#include "mex.h"
#include <iostream>
#include <string.h>
void mexPackFun(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
{
// 具体的C++逻辑
}
2. 使用结构体传参
项目中如果希望直接将matlab的结构体传给C++接口,怎么处理?
matlab代码
clc;clear all;close all;
stu(1).name='aa';
stu(1).length=100;
stu(1).pix_dis=0.005;
DscFunction(stu);
C++适配代码
#include "mex.h"
#include "DscNew.h"
#include<cstdio>
#include <memory>
void mexFunction(int nlhs, mxArray* plhs[], int nrhs, mxArray* prhs[])
{
std::shared_ptr<DSCNew> sp_dsc_new = std::make_shared<DSCNew>("");
if (mxIsStruct(prhs[0]))
{
mxArray* str_name = mxGetField(prhs[0], i, "name");
if (str_name)
{
char* tmp = mxArrayToString(str_name);//convert mxArray to string
}
mxArray* length_ = mxGetField(prhs[0], i, "length");
if (length_)
{
auto length = *(length_);
}
}
}
3. 参数类型为matlab::mex::ArgumentList
void operator()(matlab::mex::ArgumentList outputs, matlab::mex::ArgumentList inputs)
{
//ArrayFactory factory;
StructArray matlabStructArray = inputs[0];
auto fields = matlabStructArray.getFieldNames();
std::vector<std::string> fieldNames(fields.begin(), fields.end());
matlab::data::TypedArrayRef<double> field1Reference = matlabStructArray[0][fieldNames[0]];
double field1Reference_v = field1Reference[0];
}