Невозможно построить мекс файл

1

Я следил за примером MATLAB для создания mex файла здесь https://uk.mathworks.com/help/matlab/matlab_external/standalone-example.html

Исходный код, который он производит, выглядит следующим образом

#include "mex.h"

/* The computational routine */
void arrayProduct(double x, double *y, double *z, mwSize n)
{
    mwSize i;
    /* multiply each element y by x */
    for (i=0; i<n; i++) {
        z[i] = x * y[i];
    }
}

/* The gateway function */
void mexFunction( int nlhs, mxArray *plhs[],
                  int nrhs, const mxArray *prhs[])
{
    double multiplier;              /* input scalar */
    double *inMatrix;               /* 1xN input matrix */
    size_t ncols;                   /* size of matrix */
    double *outMatrix;              /* output matrix */

    /* check for proper number of arguments */
    if(nrhs!=2) {
        mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nrhs","Two inputs required.");
    }
    if(nlhs!=1) {
        mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nlhs","One output required.");
    }
    /* make sure the first input argument is scalar */
    if( !mxIsDouble(prhs[0]) || 
         mxIsComplex(prhs[0]) ||
         mxGetNumberOfElements(prhs[0])!=1 ) {
        mexErrMsgIdAndTxt("MyToolbox:arrayProduct:notScalar","Input multiplier must be a scalar.");
    }

    /* make sure the second input argument is type double */
    if( !mxIsDouble(prhs[1]) || 
         mxIsComplex(prhs[1])) {
        mexErrMsgIdAndTxt("MyToolbox:arrayProduct:notDouble","Input matrix must be type double.");
    }

    /* check that number of rows in second input argument is 1 */
    if(mxGetM(prhs[1])!=1) {
        mexErrMsgIdAndTxt("MyToolbox:arrayProduct:notRowVector","Input must be a row vector.");
    }

    /* get the value of the scalar input  */
    multiplier = mxGetScalar(prhs[0]);

    /* create a pointer to the real data in the input matrix  */
    inMatrix = mxGetPr(prhs[1]);

    /* get dimensions of the input matrix */
    ncols = mxGetN(prhs[1]);

    /* create the output matrix */
    plhs[0] = mxCreateDoubleMatrix(1,(mwSize)ncols,mxREAL);

    /* get a pointer to the real data in the output matrix */
    outMatrix = mxGetPr(plhs[0]);

    /* call the computational routine */
    arrayProduct(multiplier,inMatrix,outMatrix,(mwSize)ncols);
}

Когда я запускаю команду mex arrayProduct.cpp (имя моего файла), я получаю следующую ошибку:

Создание с помощью Microsoft Visual C++ 2017 '. Ошибка при использовании mex LINK: ошибка LNK2001: неразрешенный внешний символ mexfilerequiredapiversion arrayProduct.lib: фатальная ошибка LNK1120: 1 нерешенные внешние

Я использую 32-разрядную версию MATLAB 2015b с компилятором Visual Studio 2017 C++. Есть ли предварительная настройка, необходимая для создания файлов mex которые не упоминаются в учебнике MATLAB?

  • 0
    Самый молодой поддерживаемый компилятор для MATLAB R2015b - MSVC Professional 2015 . Однако, даже если это является частью проблемы, ошибка ссылки, подобная той, которую вы получаете, не является ошибкой, которую я ожидаю ...
  • 0
    Ах. R2015b - последняя версия с 32-битной поддержкой . Ваш компилятор, вероятно, MSVC 2017, 64-битный.
Показать ещё 6 комментариев
Теги:

1 ответ

1
Лучший ответ

Самый младший поддерживаемый компилятор для MATLAB R2015b - это MSVC Professional 2015. Кроме того, R2015b - это последняя версия с 32-разрядной поддержкой. Возможно, ваш компилятор MSVC 2017, 64-разрядный.

Попробуйте установить.NET4 + SDK 7.1, выберите это в MATLAB и запустите команду mex. Это официально поддерживаемый компилятор для R2015b, и я ожидаю, что это решит вашу проблему.

Примечание. Для меня.NET4 отказался устанавливать, поскольку обнаружил ранее установленную инфраструктуру, но этот ответ разрешил эту проблему для меня.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню