Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.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
Xcode MEX编译错误:未知类型名称';char16_t';_Xcode_Matlab_C++11_Compiler Errors_Mex - Fatal编程技术网

Xcode MEX编译错误:未知类型名称';char16_t';

Xcode MEX编译错误:未知类型名称';char16_t';,xcode,matlab,c++11,compiler-errors,mex,Xcode,Matlab,C++11,Compiler Errors,Mex,由于以下错误,我无法编译任何MATLAB MEX代码: In file included from /Applications/MATLAB_R2013a.app/extern/include/mex.h:58: In file included from /Applications/MATLAB_R2013a.app/extern/include/matrix.h:294: /Applications/MATLAB_R2013a.app/extern/include/tmwtypes.h:81

由于以下错误,我无法编译任何MATLAB MEX代码:

In file included from /Applications/MATLAB_R2013a.app/extern/include/mex.h:58:
In file included from /Applications/MATLAB_R2013a.app/extern/include/matrix.h:294:
/Applications/MATLAB_R2013a.app/extern/include/tmwtypes.h:819:9: error: unknown type name 'char16_t'
typedef char16_t CHAR16_T;
就我记忆所及,在我的机器上唯一改变的是Xcode被更新为5.1版(5B130a)

目前在MATLAB中编译MEX代码有什么改进吗


[在苹果LLVM版本5.1(clang-503.0.38)(基于LLVM 3.4svn)的操作系统10.9.2上运行]

默认情况下,升级的clang不会设置MATLAB所需的
char16\u t

快速修复 这是C或C++代码,但需要在每个<代码> MEX < /C>命令行上完成。
>> mex -Dchar16_t=uint16_t ...
下面的其他解决方案将此定义放入mex配置或启用C++11

永久解决方案 选项:

  • -std=c++11
    添加到mex配置文件中的
    cxflags
    ,并编译.cpp文件而不是.c。mex配置文件是mexopts.sh(R2014a之前)或由
    mex-setup
    (R2014a+)指示的.xml文件这对OP有效,但下一个选项也有效。确保编辑活动/安装的配置,而不是系统范围的参考。如果你不知道,试试下一个解决方案
  • 在包含mex.h之前,使用
    #define
    typedef
    创建
    char16\u t
    (请参阅下面的“其他解决方法”)
  • 在MATLAB的未来版本中,这一问题将得到解决。重新运行
    mex-setup
    ,让MATLAB为您重新配置它,它就可以工作了。从R2014a开始,这并不起作用
  • 作为最后的手段,您可以随时修改MATLAB安装,如Dennis所建议的那样,修改MATLAB的tmwtypes.h,但我强烈建议不要修改MATLAB安装

注意:如果您使用C,并且不能或不想更改为C++,请按照解决方案,或查看下面的替代工作。


其他解决方法

如果由于某种原因无法启用C++11标准,可以使用预处理器定义
char16\t
。将
#define char16_t uint16_t
放在
之前#包括“mex.h”
,或使用编译器命令行进行设置:

-Dchar16_t=uint16_t
或者,在包含mex.h之前,再次使用
typedef

typedef uint16_t char16_t;

如果这些解决方案不起作用,请尝试将
uint16\u t
更改为
uint16\u t
。此外,还有一些人报告说,只需包含uchar.h就可以引入该类型,但其他人没有该标头。

我也在升级到Xcode 5.1之后直接遇到了相同的错误

导致错误的文件tmwtypes.h中的相关行(818-824)为:

#如果已定义(u STDC_UTF_16_uu)| |(已定义(_拥有_CHAR16_T_语言支持)&&&&(u拥有_CHAR16_T_语言支持)
typedef char16_t char16_t;
#elif已定义(\u MSC\u VER)
typedef wchar\u t CHAR16\u t;
#否则
类型定义UINT16\u T字符16\u T;
#恩迪夫
一个解决办法是简单地改变路线

typedef char16_t CHAR16_T;
进入


A必须承认,我不知道这是否会影响mex文件的任何功能或行为,但至少我能够使用mex再次编译我的c文件。

如果此方法不起作用,请查看其他答案

我使用自制软件将gcc/g++编译器升级到4.8版-->
gcc-4.8
g++-4.8

之后,我更改了mexopts.sh文件中的以下行:

CXXFLAGS="-fno-common -fexceptions -arch $ARCHS -isysroot $MW_SDKROOT -mmacosx-version-min=$MACOSX_DEPLOYMENT_TARGET -std=c++11"
在我的mexopts.sh中,这是第150行。我只添加了
-std=c++11
标志,我猜这就是chappjc的意思


编辑:chappjc的更新中介绍了这一点

在包含mex.h之前包含uchar.h…效果很好。此外,上面的回答(添加STD=C++ 11)只适用于C++,而不是C.<
#include <uchar.h>
#include "mex.h"
#包括
#包括“mex.h”

我只是添加了我自己的实验(仅限C++)。

导致mex文件的其他部分出现问题。事实上,在我的mex文件之后,
char16\t
被正确定义。通过跟踪包含链,在名为
\u\u config
的文件中设置正确的类型
char16\t

typedef __char16_t char16_t;
这也是
中包含的第一个文件。因此,黑客包括
算法
mex.h
之前

#include <algorithm>
#include "mex.h"
#包括
#包括“mex.h”

并且仍然以多平台的方式执行正确的设置,并且不改变构建配置中的任何内容。

作为XCode 5.1.1的一部分,char16\u t在
\u config
中定义,它是从
typeinfo
调用的

你可以加上

#include <typeinfo> 
定义
char16\t

这篇文章可能会有帮助:

这比我想象的要容易。只需用OSX版本替换所有10.x,并将
-Dchar16\u t=UINT16\u t
添加到
mexopts.sh
文件中的
CLIBS


它在安装了Xcode 6的OS X 10.9 Mavericks上运行。

您应该更改CXXFLAGS,而不是CFLAGS,否则您将得到一个
错误:无效参数'-std=c++11'不允许与'c/ObjC'一起使用。
@flippex17查看它在更改CXXFLAGS时是否有效,正如雅皮安网络所指出的那样。我不会修改twmtypes.h文件。很抱歉,我不能说修复软件本身的最佳方法是什么。对我来说,这在更改CXXFLAGS时有效,但我的代码最初是C代码。我必须把它改成C++(改名为<代码> .CPP<代码> >,然后在Matlab中使用相关函数之前添加<代码>外部C”/代码>。另外,你可以强制CLAN编译为C++,而不改变扩展名,使用< Calth-CLAN-XC++文件> C<代码>。谢谢帮助。但我只是做了不同的事情,为了在Xcode中调试我的MEX代码,我不得不这样做。谢谢你+是的,这就是我的意思。谢谢你的接受,也请随意投票我认为不修改MATLAB安装更明智,尽管显然大多数人不同意。讨论了一些只使用C语言的解决方案,包括这一个。这个解决方案对我有效!我试着按照cha的建议去做
#include <algorithm>
#include "mex.h"
#include <typeinfo> 
#include "mex.h"