Xcode MEX编译错误:未知类型名称';char16_t';
由于以下错误,我无法编译任何MATLAB MEX代码: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
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
永久解决方案
选项:
- 将
添加到mex配置文件中的-std=c++11
,并编译.cpp文件而不是.c。mex配置文件是mexopts.sh(R2014a之前)或由cxflags
(R2014a+)指示的.xml文件这对OP有效,但下一个选项也有效。确保编辑活动/安装的配置,而不是系统范围的参考。如果你不知道,试试下一个解决方案mex-setup
- 在包含mex.h之前,使用
或#define
创建typedef
(请参阅下面的“其他解决方法”)char16\u t
- 在MATLAB的未来版本中,这一问题将得到解决。重新运行
,让MATLAB为您重新配置它,它就可以工作了。从R2014a开始,这并不起作用mex-setup
- 作为最后的手段,您可以随时修改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"