Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何修复';未知类型名称';将GSL库链接到Matlab MEX时出错_C_Matlab_Mex_Gsl - Fatal编程技术网

C 如何修复';未知类型名称';将GSL库链接到Matlab MEX时出错

C 如何修复';未知类型名称';将GSL库链接到Matlab MEX时出错,c,matlab,mex,gsl,C,Matlab,Mex,Gsl,我目前正在尝试优化我在MATLAB(R2019a版)中正在处理的一些代码。为了计算我的结果,MATLAB必须多次计算某个函数,这会减慢速度。正因为如此,我认为用C编写这个函数并将其导入MATLAB会大大加快速度。不幸的是,我在尝试使用MEX将C代码编译成MATLAB时遇到了一些麻烦 我以前用过C,但肯定不是专家。不管怎样,我已经用C语言测试了代码,它是有效的,问题在于试图用MATLAB编译代码。我正在使用GNU科学库(GSL),因此在使用MATLAB中的MEX进行编译时应该包括这些库 下面是一个

我目前正在尝试优化我在MATLAB(R2019a版)中正在处理的一些代码。为了计算我的结果,MATLAB必须多次计算某个函数,这会减慢速度。正因为如此,我认为用C编写这个函数并将其导入MATLAB会大大加快速度。不幸的是,我在尝试使用MEX将C代码编译成MATLAB时遇到了一些麻烦

我以前用过C,但肯定不是专家。不管怎样,我已经用C语言测试了代码,它是有效的,问题在于试图用MATLAB编译代码。我正在使用GNU科学库(GSL),因此在使用MATLAB中的MEX进行编译时应该包括这些库

下面是一个导致相同问题和错误的最小工作示例。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没有编译(如果我使用C代码而不包含任何库,则编译会起作用),而是返回大量错误,如下所示:

使用mex时出现
错误
在文件中包括从
C:/ProgramData/MATLAB/SupportPackages/R2019a/3P.instrset/mingw_w64.instrset/x86_64-w64-mingw32/include/stddef.h:7:0,
从…起
C:/ProgramData/MATLAB/SupportPackages/R2019a/3P.instrset/mingw_w64.instrset/lib/gcc/x86_64-w64-mingw32/6.3.0/include/stddef.h:1,
从C:\MinGW\include/stdio.h:68,
从C:\Program Files\MATLAB\R2019a/extern/include/mex.h:38,
从C:\userpath\MWE.C:1:
C:/ProgramData/MATLAB/SupportPackages/R2019a/3P.instrset/mingw_w64.instrset/x86_64-w64-mingw32/include/crtdefs.h:35:19:
错误:应为“=”、“、”、“;”、”“类型定义”之前的“asm”或“属性”
__MINGW_扩展名typedef unsigned_uuint64 size_t;
^~~~~~~
C:/ProgramData/MATLAB/SupportPackages/R2019a/3P.instrset/mingw_w64.instrset/x86_64-w64-mingw32/include/crtdefs.h:45:19:
错误:应为“=”、“、”、“;”、”“类型定义”之前的“asm”或“属性”
__MINGW_扩展类型def__int64 ssize_t;
^~~~~~~
C:/ProgramData/MATLAB/SupportPackages/R2019a/3P.instrset/mingw_w64.instrset/x86_64-w64-mingw32/include/crtdefs.h:52:9:
错误:未知类型名称“size\t”
typedef size\u t rsize\t;
[...]
在不同的类型名称上出现相同的错误


有人知道在MATLAB中使用MEX编译时如何正确地包含库吗?

明白了。你能试试下面的吗

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

明白了。你能试试下面的吗

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

您是如何在您的机器上获得gsl版本的?你自己造的吗?您是否考虑过使用二进制发行版vs 2.2.1?我下载了的最新版本,并按照找到的答案安装了它。如果我只是用gcc编译C代码,但不是在Matlab中,那么它工作得很好。安装了什么版本的MinGW?我使用最新的
MinGW.org gcc-8.2.0-3
编译C。Matlab使用MinGW-w64.org的
MinGW gcc 6.3
(根据研究,它可能与32位/64位版本有关吗?那么,如果我不包含任何GSL库,Matlab编译器可以工作。这就是我问的原因。你当然需要64位版本。大小是不确定的。你是如何在你的机器上获得GSL版本的?你自己构建的吗?你考虑过使用二进制发行版vs 2.2.1?我下载了的最新版本,并按照找到的答案安装了它。如果我只是用gcc编译C代码,但不是在Matlab中,它就可以完美工作。安装了什么版本的MinGW?我使用最新的
MinGW.org gcc-8.2.0-3
编译C。Matlab使用MinGW的
MinGW gcc 6.3-w64.org
(根据问题,它可能与32位/64位版本有关吗?那么,如果我不包含任何GSL库,Matlab编译器也可以工作。这就是我问的原因。你当然需要64位版本。大小是未定义的。谢谢你的回答。我试过了,我仍然会遇到未知类型名的相同错误。谢谢你。)或者答案。我试过了,但仍然会遇到未知类型名称的相同错误。