Как исправить ошибку «неизвестное имя типа» при связывании библиотеки GSL с Matlab MEX - PullRequest
1 голос
/ 26 марта 2019

В настоящее время я пытаюсь оптимизировать некоторый код, над которым работаю в MATLAB (версия R2019a).Чтобы вычислить мои результаты, MATLAB должен вычислять определенную функцию много раз, замедляя все.Из-за этого я подумал, что написание этой функции на C и ее импорт в MATLAB значительно ускорит процесс.К сожалению, я столкнулся с некоторыми проблемами, пытаясь скомпилировать C-код в MATLAB, используя MEX.

Я использовал C раньше, но, конечно, не эксперт.В любом случае, я протестировал код на C, и он работает, проблема заключается в попытке скомпилировать код в MATLAB.Я использую Научную библиотеку GNU (GSL) и поэтому должен включать библиотеки в компиляцию с MEX в MATLAB.

Ниже приведен минимальный рабочий пример, приводящий к тем же проблемам и ошибкам.C-код выглядит примерно так: он сохраняется в MWE.c

#include "mex.h" // The mex library
#include <gsl/gsl_sf_bessel.h> // GSL function

// Define some function, in my case this is somewhat more complicated
double bessel_fun (double *x)
{
    return gsl_sf_bessel_J0 (*x);
}

// MEX function needed for compiling in MATLAB
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    //declare variables
    mxArray *x_M, *y_M;
    double *x, *y;

    //associate inputs
    x_M = mxDuplicateArray(prhs[0]);

    //associate outputs
    y_M = plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL);

    // Access variables
    x = mxGetPr(x_M);
    y = mxGetPr(y_M);

    // Save the result in the output variable
    y[0]=bessel_fun(x);
}

. Затем я компилирую в MATLAB, используя

    mex -IC:/MinGW/include -LC:/MinGW/lib -lgsl -lgslcblas MWE.c

вместо компиляции (что работает, если я использую C-код без , включая любые библиотеки), MATLAB возвращает много ошибок, таких как:

Error using mex
In file included from
C:/ProgramData/MATLAB/SupportPackages/R2019a/3P.instrset/mingw_w64.instrset/x86_64-w64-mingw32/include/stddef.h:7:0,
                 from
C:/ProgramData/MATLAB/SupportPackages/R2019a/3P.instrset/mingw_w64.instrset/lib/gcc/x86_64-w64-mingw32/6.3.0/include/stddef.h:1,
                 from C:\MinGW\include/stdio.h:68,
                 from C:\Program Files\MATLAB\R2019a/extern/include/mex.h:38,
                 from C:\userpath\MWE.c:1:
C:/ProgramData/MATLAB/SupportPackages/R2019a/3P.instrset/mingw_w64.instrset/x86_64-w64-mingw32/include/crtdefs.h:35:19:
error: expected '=', ',', ';', 'asm' or '__attribute__' before 'typedef'
 __MINGW_EXTENSION typedef unsigned __int64 size_t;
                   ^~~~~~~
C:/ProgramData/MATLAB/SupportPackages/R2019a/3P.instrset/mingw_w64.instrset/x86_64-w64-mingw32/include/crtdefs.h:45:19:
error: expected '=', ',', ';', 'asm' or '__attribute__' before 'typedef'
 __MINGW_EXTENSION typedef __int64 ssize_t;
                   ^~~~~~~
C:/ProgramData/MATLAB/SupportPackages/R2019a/3P.instrset/mingw_w64.instrset/x86_64-w64-mingw32/include/crtdefs.h:52:9:
error: unknown type name 'size_t'
 typedef size_t rsize_t;

[...]

и одна и та же ошибка для разных имен типов.

У кого-нибудь есть идеи, как правильно включать библиотеки при компиляции с MEX в MATLAB?

1 Ответ

0 голосов
/ 27 марта 2019

Гоча. Не могли бы вы попробовать следующее, пожалуйста:

mex -U__MINGW_EXTENSION -IC:/MinGW/include -LC:/MinGW/lib -lgsl -lgslcblas MWE.c
...