【问题标题】:Error C2371 when compiling C dll deployment MATLAB code编译 C dll 部署 MATLAB 代码时出现错误 C2371
【发布时间】:2014-07-14 03:10:57
【问题描述】:

我正在尝试使用 VS2010 和 MATLAB 2007b 编译 C dll。我收到此错误:

c:\program files\microsoft visual studio 10.0\vc\include\yvals.h(576): error C2371: 'char16_t' : redefinition; different basic types
c:\program files\matlab\r2007b\extern\include\matrix.h(336) : see declaration of 'char16_t'

代码如下:

#include <FLOAT.H>
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include "..\OpenCV_Lib.h"
//namespace mat{
#include "..\MATCVcomm.h"
//}
//#include "matrix.h"

//using namespace mat;

#define Out plhs[0]
#define Outlist plhs[1]
#define Ref prhs[0]
#define Para    prhs[1]
#define IMAGE_NUM   prhs[2]
/*
    Out:Cell Array m by n
        m:size of input array m
        n:number of member include the groupe + 1
        first member of each cell if indicate n
    ref:Input array
    para:parametor of grouping shown below
        [r num]
        r:radius of groupe
        num:The number of groups extracted by this function
        (in case by that there are a great many groups)
    IMAGE_NUM:Image Index List
*/
#include "groupe.h"


void mexFunction(
                 int nlhs,       mxArray *plhs[],
                 int nrhs, const mxArray *prhs[]
         )
{
    double min = DBL_MAX;
    int i, j;
    if( nrhs < 2 ){
        mexErrMsgTxt("groupe function requirs two input parametor for Matrix of point and [rad num]");
        return;
    }
    int param = mxGetM( Para );
    int Rn = mxGetN( Ref );
    int Rm = mxGetM( Ref );

    double * para = mxGetPr( Para );
    double * pref = mxGetPr( Ref );
    double rad = para[0];
    int gnum;
    if( param > 1 )
        gnum = (int)(para[1]);
    else
        gnum = 0;

    class memlist mem = groupe( pref, Rm, Rn, rad );
    if( nrhs >= 3 ){
        int imnn = mxGetM( IMAGE_NUM );
        if( imnn != Rm ){
            mexErrMsgTxt("Need that Number of ImageIndexList equal Number of KeyList.");
            return;
        }
        double * dimno = mxGetPr( IMAGE_NUM );
        int * imno = new int[imnn];
        for( i = 0; i < imnn; i ++ )
            imno[i] = (int)dimno[i];
        LookBigOrder( mem, imno, pref, Rm, Rn );
    }
    class memlist mem2 = LookBigOrder( mem, gnum );
    Rm = mem2.GetEntrysize()-1;
    if( nlhs >= 2 ){
        Outlist = mxCreateDoubleMatrix( Rm, 2, mxREAL );
        double * l = mxGetPr( Outlist );
        for( i = 0; i < Rm; i ++ )
            l[i] = mem2.GetSize( i );
        for( i = 0; i < Rm; i ++ )
            l[i+Rm] = mem2.GetIndex(mem2.GetSize( Rm ))[i];
    }
    Out = mxCreateCellMatrix( Rm, 1 );
    for( i = 0; i < Rm; i ++ ){
        mxArray * r = mxCreateDoubleMatrix( 1, mem2.GetSize( i ), mxREAL );
        double * l = mxGetPr( r );
        for( j = 0; j < mem2.GetSize( i ); j ++ )
            l[j] = mem2.GetIndex(i)[j];
        mxSetCell( Out, i, r );
    }
    mem.free();
    mem2.free();
}

我在寻找解决方案时尝试了几种方法,但我还没有找到解决这个问题的方法。

我该如何解决这个问题?

谢谢!

【问题讨论】:

  • 不要使用这样的定义:(

标签: c++ matlab compiler-errors function-prototypes redefinition


【解决方案1】:

可能 char16_t 是由 Matlab 和 C++ 标准库同时定义的。

当包含 C 库时,而不是

#include &lt;stdlib.h&gt;

使用

#include &lt;cstdlib&gt;

相反。即删除.h并在前面放一个c。

这应该将它们的内容放入std 命名空间,让您选择您想要的。

【讨论】:

  • 如你所说,我已经改变了。你有什么解决办法吗??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多