MATLAB 2015a编译mex文件遇C1083错误:无法打开mex.hpp
解决MATLAB 2015a编译MEX文件时找不到'mex.hpp'的问题
问题背景
使用MATLAB 2015a + Microsoft Visual C++ 2012专业版,执行命令mex mex_example0.cpp编译以下代码时,出现致命错误C1083:无法打开包含文件'mex.hpp'。
mex_example0.cpp
#include "mex.hpp" #include "mexAdapter.hpp" #include <iostream> using namespace matlab::data; using matlab::mex::ArgumentList; class MexFunction : public matlab::mex::Function { public: void operator()(ArgumentList outputs, ArgumentList inputs) { ArrayFactory factory; TypedArray<double> x = std:: move(inputs[0]); for (auto& i: x){ i += 5; } outputs[0] = x; std::cout<<"Hello MEX"<<std::endl; } };
错误信息
Building with 'Microsoft Visual C++ 2012'. Error using mex mex_example0.cpp C:\Users\iisermbionap\Downloads\mex_example0.cpp(1) : fatal error C1083: Cannot open include file: 'mex.hpp': No such file or directory
原因分析
mex.hpp、mexAdapter.hpp以及matlab::data、matlab::mex命名空间是MATLAB R2018a版本才引入的现代C++ MEX接口,MATLAB 2015a完全不支持这套新接口,因此编译器无法找到对应的头文件。
解决方案
有两种可行的解决方式:
方式1:升级MATLAB版本
将MATLAB升级到R2018a或更高版本,就能直接支持你当前使用的现代C++ MEX代码结构。
方式2:修改代码为传统MEX接口
如果无法升级MATLAB,需要将代码修改为MATLAB 2015a支持的传统C MEX接口(兼容C++编译),以下是等价功能的代码示例:
#include "mex.h" #include <iostream> void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { // 校验输入输出参数数量 if (nrhs != 1 || nlhs != 1) { mexErrMsgIdAndTxt("MyToolbox:arrayAdd:nrhs", "需要且仅需要1个输入和1个输出参数。"); } // 校验输入是否为非复数双精度数组 if (!mxIsDouble(prhs[0]) || mxIsComplex(prhs[0])) { mexErrMsgIdAndTxt("MyToolbox:arrayAdd:notDouble", "输入必须为非复数双精度数组。"); } // 获取输入数组的元素数量和数据指针 mwSize numElements = mxGetNumberOfElements(prhs[0]); double *x = mxGetPr(prhs[0]); // 创建与输入维度一致的输出数组 plhs[0] = mxCreateDoubleMatrix(mxGetM(prhs[0]), mxGetN(prhs[0]), mxREAL); double *y = mxGetPr(plhs[0]); // 执行数组元素加5操作 for (mwSize i = 0; i < numElements; i++) { y[i] = x[i] + 5; } // 输出信息到MATLAB命令行 mexPrintf("Hello MEX\n"); }
编译修改后的代码,仍然使用mex mex_example0.cpp命令即可。
内容的提问来源于stack exchange,提问作者Gagandeep Singh
相关产品推荐
相关产品推荐

