C Matlab-Simulink编码器重定义误差

C Matlab-Simulink编码器重定义误差,c,matlab,header-files,simulink,redefinition,C,Matlab,Header Files,Simulink,Redefinition,我正在尝试集成一个我在Simulink中设计的模型,以便在我的S函数(C代码)中工作。为此,我使用Simulink代码生成(系统目标文件:err.tlc)来构建C代码 我用这种看似过于复杂的方式来做这件事,因为我的主要s函数是实现一个进化算法,这个Simulink模型是它如何评估每个个体的。(希望这是有道理的) 所以我刚刚生成了C代码,现在正试图在这个S函数C代码中实现它。 因为我对这一点比较陌生,所以使用生成的ert_main.c作为参考 #include <stdio.h>

我正在尝试集成一个我在Simulink中设计的模型,以便在我的S函数(C代码)中工作。为此,我使用Simulink代码生成(系统目标文件:err.tlc)来构建C代码

我用这种看似过于复杂的方式来做这件事,因为我的主要s函数是实现一个进化算法,这个Simulink模型是它如何评估每个个体的。(希望这是有道理的)

所以我刚刚生成了C代码,现在正试图在这个S函数C代码中实现它。 因为我对这一点比较陌生,所以使用生成的ert_main.c作为参考

#include <stdio.h>                     /* This ert_main.c example uses printf/fflush */
#include "Peltier_model.h"             /* Model's header file */
#include "rtwtypes.h"
#include "builtin_typeid_types.h"
#include "multiword_types.h"
#include "rt_logging.h"
#define QUOTE1(name)                   #name
#define QUOTE(name)                    QUOTE1(name)              /* need to expand name */
#ifndef SAVEFILE
# define MATFILE2(file)                #file ".mat"
# define MATFILE1(file)                MATFILE2(file)
# define MATFILE                       MATFILE1(MODEL)
#else
# define MATFILE                       QUOTE(SAVEFILE)
#endif
这就解决了那部分问题

现在的问题是,我包含的Peltier_model.h(生成的代码)包括rt_logging.h,其中包括rt_mxclassid.h(所有这些都是我用Matlab编写的,我没有接触过的),这会产生一个重新定义错误:

In file included from Peltier_model_ert_rtw/Peltier_model.h:28:
In file included from /Applications/MATLAB_R2013b.app/rtw/c/src/rt_logging.h:19:
/Applications/MATLAB_R2013b.app/rtw/c/src/rt_mxclassid.h:18:2: error: redefinition of     enumerator 'mxLOGICAL_CLASS'
    mxLOGICAL_CLASS,
    ^
/Applications/MATLAB_R2013b.app/extern/include/matrix.h:287:5: note: previous definition is here
mxLOGICAL_CLASS,
^
因此,我对先前在matrix.h中定义的枚举(从rt_mxclassid.h中)的重新定义有一个问题

在矩阵的该部分中定义的其他枚举也是如此。h

rt_classid.h:

/* $Revision: 1.1.6.1 $ */

#ifndef __rt_mxclassid_h__
#define __rt_mxclassid_h__

typedef enum {
mxUNKNOWN_CLASS = 0,
mxCELL_CLASS = 1,
mxSTRUCT_CLASS,
mxLOGICAL_CLASS,
mxCHAR_CLASS,
mxRESERVED5_CLASS, /* mxVOID_CLASS */
mxDOUBLE_CLASS,
mxSINGLE_CLASS,
mxINT8_CLASS,
mxUINT8_CLASS,
mxINT16_CLASS,
mxUINT16_CLASS,
mxINT32_CLASS,
mxUINT32_CLASS,
mxINT64_CLASS,      /* place holder - future enhancements */
mxUINT64_CLASS,     /* place holder - future enhancements */
mxRESERVED16_CLASS, /* mxFUNCTION_CLASS */
mxRESERVED17_CLASS, /* mxOPAQUE_CLASS */
mxOBJECT_CLASS
} mxClassID;

#endif /* __rt_mxclassid_h__ */
矩阵h的相关部分:

/**
 * Enumeration corresponding to all the valid mxArray types.
 */
typedef enum
{
mxUNKNOWN_CLASS = 0,
mxCELL_CLASS,
mxSTRUCT_CLASS,
mxLOGICAL_CLASS,
mxCHAR_CLASS,
mxVOID_CLASS,
mxDOUBLE_CLASS,
mxSINGLE_CLASS,
mxINT8_CLASS,
mxUINT8_CLASS,
mxINT16_CLASS,
mxUINT16_CLASS,
mxINT32_CLASS,
mxUINT32_CLASS,
mxINT64_CLASS,
mxUINT64_CLASS,
mxFUNCTION_CLASS,
mxOPAQUE_CLASS,
mxOBJECT_CLASS, /* keep the last real item in the list */
#if defined(_LP64) || defined(_WIN64)
mxINDEX_CLASS = mxUINT64_CLASS,
#else
mxINDEX_CLASS = mxUINT32_CLASS,
#endif
/* TEMPORARY AND NASTY HACK UNTIL mxSPARSE_CLASS IS COMPLETELY ELIMINATED */
mxSPARSE_CLASS = mxVOID_CLASS /* OBSOLETE! DO NOT USE */
}
mxClassID;
我完全不知道如何处理这个问题,因为任何有问题的文件都是我写的。任何帮助都将不胜感激


非常感谢

也许我没有抓住要点,但这似乎是一种非常复杂的做事方式。如果要将Simulink模型集成到另一个模型中,为什么不使用模型引用?这正是它的设计目的。如果确实必须从Simulink模型生成S函数,则将生成的S函数作为块包含在顶级模型中,而不是作为代码包含在另一个S函数中!!也许我应该指出,S函数是一种进化算法,它迭代了这个小型simulink模型的大量模拟。我的想法是,以这种方式集成模型将大大提高性能。此外,我的采样时间也会变得混乱,因为对于我的进化算法s-函数的每个控制输出,它必须检查大量的参数组合,以找到最好的。我只是在最初的问题中补充了这一澄清。我现在的问题是,为什么包含一个matlab提供的头文件(rt_logging.h)会导致这个重新定义的错误…我对这个很迷茫。。。谢谢你的帮助!我通过禁用Matlab信号日志来生成代码,解决了这个问题。有问题的头文件不再使用。谢谢
/**
 * Enumeration corresponding to all the valid mxArray types.
 */
typedef enum
{
mxUNKNOWN_CLASS = 0,
mxCELL_CLASS,
mxSTRUCT_CLASS,
mxLOGICAL_CLASS,
mxCHAR_CLASS,
mxVOID_CLASS,
mxDOUBLE_CLASS,
mxSINGLE_CLASS,
mxINT8_CLASS,
mxUINT8_CLASS,
mxINT16_CLASS,
mxUINT16_CLASS,
mxINT32_CLASS,
mxUINT32_CLASS,
mxINT64_CLASS,
mxUINT64_CLASS,
mxFUNCTION_CLASS,
mxOPAQUE_CLASS,
mxOBJECT_CLASS, /* keep the last real item in the list */
#if defined(_LP64) || defined(_WIN64)
mxINDEX_CLASS = mxUINT64_CLASS,
#else
mxINDEX_CLASS = mxUINT32_CLASS,
#endif
/* TEMPORARY AND NASTY HACK UNTIL mxSPARSE_CLASS IS COMPLETELY ELIMINATED */
mxSPARSE_CLASS = mxVOID_CLASS /* OBSOLETE! DO NOT USE */
}
mxClassID;