为啥我收到错误“无效的 MEX 文件”,而文件位于当前文件夹中?

Posted

技术标签:

【中文标题】为啥我收到错误“无效的 MEX 文件”,而文件位于当前文件夹中?【英文标题】:why am I getting the error "Invalid MEX-file", while the file is in the current folder?为什么我收到错误“无效的 MEX 文件”,而文件位于当前文件夹中? 【发布时间】:2017-01-03 15:29:46 【问题描述】:

这是我当前的文件夹: 这里是写在mx_minimum_power.cpp文件中的网关函数:

#include <math.h>
#include <complex>
#include <iostream>
#include "mex.h"
#include "matrix.h"
#include "armaMex.hpp"

using std::complex;
using std::cout;
using std::endl;


/* The gateway function */
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

    double *arraysizePtr = NULL;
    arraysizePtr = mxGetPr(prhs[9]);
    const int arraysize = (int)*arraysizePtr;
    const int matrixDimention = 3;
    float *inMatrixA11 = (float *)mxGetPr(prhs[0]);
    float *inMatrixA12_real = (float *)mxGetPr(prhs[1]);
    float *inMatrixA12_imag = (float *)mxGetPr(prhs[2]);
    float *inMatrixA13_real = (float *)mxGetPr(prhs[3]);
    float *inMatrixA13_imag = (float *)mxGetPr(prhs[4]);
    float *inMatrixA22 = (float *)mxGetPr(prhs[5]);
    float *inMatrixA23_real = (float *)mxGetPr(prhs[6]);
    float *inMatrixA23_imag = (float *)mxGetPr(prhs[7]);
    float *inMatrixA33 = (float *)mxGetPr(prhs[8]);
    Mat <complex<float>> A(matrixDimention, matrixDimention);
    Mat <complex<float>> EigenVectors(matrixDimention, matrixDimention);
    Col <float> Eigenvalues(matrixDimention);
    int i = 0;
    for (i = 0; i < arraysize; i++)
    
        A.at(0, 0) = complex<float>(inMatrixA11[i],0);
        A.at(1, 1) = complex<float>(inMatrixA22[i],0);
        A.at(2, 2) = complex<float>(inMatrixA33[i], 0);
        A.at(0, 1) = complex<float>(inMatrixA12_real[i], inMatrixA12_imag[0]);
        A.at(1, 0) = complex<float>(inMatrixA12_real[i], -inMatrixA12_imag[0]);
        A.at(0, 2) = complex<float>(inMatrixA13_real[i], inMatrixA13_imag[0]);
        A.at(2, 0) = complex<float>(inMatrixA13_real[i], -inMatrixA13_imag[0]);
        A.at(1, 2) = complex<float>(inMatrixA23_real[i], inMatrixA23_imag[0]);
        A.at(2, 1) = complex<float>(inMatrixA23_real[i], -inMatrixA23_imag[0]);
        eig_sym(Eigenvalues, EigenVectors, A);
    

我已经通过以下代码构建了mx_minimum_power.mexw64 文件:

mex -g mx_minimum_power.cpp blas_win64_MT.lib lapack_win64_MT.lib
Building with 'Microsoft Visual C++ 2013 Professional'.
MEX completed successfully.  

如您所见,Arii2011_modified.mmx_minimum_power.mexw64 的所有文件都在当前目录中。 但是当我运行以下函数时:

[Ps,Pd,Pv,ThetaMean,Variance] = Arii2011_Modified(MMA.Data.C11,MMA.Data.C12_imag,MMA.Data.C12_real,MMA.Data.C13_imag,MMA.Data.C13_real,MMA.Data.C22,MMA.Data.C23_imag,MMA.Data.C23_real,MMA.Data.C33);  

在命令窗口中,我收到错误:

Invalid MEX-file 'D:\thesis library.Data\ALOS-PALSAR 12x2\San Francisco L
12x2\mx_minimum_power.mexw64': The specified module could not be found.  

我猜这个错误与armadillo有关,因为如果我将mx_minimum.cpp的第29-45行转换为cmets然后重建mx_minimum_power.mexw64,我不会得到这样的错误并且MEX文件被识别


这是我通过检查依赖walker 中的mx_minimum_power.mexw64 文件发现的。

【问题讨论】:

您是否检查了您的依赖项并确保可以使用 the mathworks 建议的依赖项遍历器访问它们 @Suever 我会的。但我真的很累。如果您查看我最近的帖子,您会发现这是我正在尝试的第三个库。我在 [cvm][cvmlib.com/] 上浪费了很多时间,检查了依赖关系,通过F11 运行代码,最后我无法克服the problem,然后我切换到 Eigen 广告它有自己的问题。现在犰狳面临这样的错误,距离项目提交的截止日期仅剩一天。你会建议哪个线性代数编程库对 mex 文件没有任何问题? @Suever mx_minimum_power 只是一个简单的函数。计算一个厄密矩阵的特征值和特征向量,然后计算特征向量外积的第13相元素 问题不在于库,问题在于您对链接外部库如何工作的期望。 确保您拥有 mex 文件的正确权限。 【参考方案1】:

我将文件blas_win64_MT.dlllapack_win64_MT.dll 添加到当前文件夹,问题得到解决 感谢@suever 的评论

【讨论】:

以上是关于为啥我收到错误“无效的 MEX 文件”,而文件位于当前文件夹中?的主要内容,如果未能解决你的问题,请参考以下文章

无效的 mex 文件错误(libstd++ 版本)

MATLAB 无效的 MEX 文件错误:缺少符号 invalid_argument

无效的 MEX 文件错误 CascadeClassifier_.mexmaci64、libopencv_ocl.2.4.dylib

Mex 文件执行中的错误,Matlab 窗口

更新的包,现在用 -O0 编译的 Mex 文件是“无效的 mex 文件”?

Matlab 缺少依赖项 MEX 文件