【问题标题】:MEX compile error: unknown type name 'char16_t'MEX 编译错误:未知类型名称“char16_t”
【发布时间】:2014-04-17 12:45:39
【问题描述】:

由于以下错误,我无法编译任何 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 代码有什么解决办法吗?

[在 OS 10.9.2 上运行 Apple LLVM 版本 5.1 (clang-503.0.38)(基于 LLVM 3.4svn)]

【问题讨论】:

    标签: xcode matlab c++11 compiler-errors mex


    【解决方案1】:

    默认情况下,升级后的 Clang 不设置 char16_t,这是 MATLAB 所要求的。

    快速修复

    这适用于 C 或 C++ 代码,但需要在每个 mex 命令行上完成。

    >> mex -Dchar16_t=uint16_t ...
    

    以下其他解决方案将此定义放入 mex 配置或启用 C++11。

    永久解决方案

    选项:

    • 在您的 mex 配置文件中添加 -std=c++11CXXFLAGS 并编译 .cpp 文件而不是 .c。 mex 配置文件是 mexopts.sh (pre-R2014a) 或 mex -setup (R2014a+) 指示的 .xml 文件。 这对 OP 有效,但下一个选项也有效。 请务必编辑活动/已安装的配置,而不是系统范围的参考。如果您无法判断,请尝试下一个解决方案。
    • 在包含 mex.h 之前使用 #definetypedef 创建 char16_t(请参阅下面的“其他解决方法”)。
    • 在未来的 MATLAB 版本中,该问题已得到修复。重新运行 mex -setup 让 MATLAB 为您重新配置它并且它可以工作。从 R2014a 开始,这并不能解决问题。
    • 作为最后的手段,您始终可以修改 MATLAB 安装,如 Dennis 建议的那样破解 MATLAB 的 tmwtypes.h,但我强烈建议不要修改 MATLAB 安装。

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


    其他解决方法

    如果由于某种原因您无法启用 C++11 标准,您可以使用预处理器来定义 char16_t。要么把#define char16_t uint16_t放在之前 #include "mex.h",要么用编译器命令行设置:

    -Dchar16_t=uint16_t
    

    或者,使用typedef,再次之前包括mex.h:

    typedef uint16_t char16_t;
    

    如果这些解决方案不起作用,请尝试将 uint16_t 更改为 UINT16_T。此外,其他人报告说简单地包含 uchar.h 会带来类型,但其他人没有该标题。

    【讨论】:

    • 你应该改变 CXXFLAGS,而不是 CFLAGS,否则你会得到一个error: invalid argument '-std=c++11' not allowed with 'C/ObjC'
    • @flippex17 正如 YuppieNetworking 所指出的,当 CXXFLAGS 被更改时,看看它是否有效。我不会修改 twmtypes.h 文件。抱歉,我不能说修复软件本身的最佳方法是什么。
    • 对我来说,这在更改 CXXFLAGS 时有效,但我的代码最初是 C 代码。我不得不将其更改为 C++(重命名为 .cpp 并在 matlab 中使用的相关函数之前添加 extern "C")。
    • @YuppieNetworking 很高兴听到它有效——我无法测试它。此外,您可以强制 clang 编译为 C++,而无需使用 clang -x c++ file.c 更改扩展名。
    【解决方案2】:

    我在升级到 Xcode 5.1 后也遇到了同样的错误。

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

    #if defined(__STDC_UTF_16__) || (defined(_HAS_CHAR16_T_LANGUAGE_SUPPORT) && _HAS_CHAR16_T_LANGUAGE_SUPPORT)
    typedef char16_t CHAR16_T;
    #elif defined(_MSC_VER)
    typedef wchar_t CHAR16_T;
    #else
    typedef UINT16_T CHAR16_T;
    #endif
    

    一个解决方案是简单地改变行

    typedef char16_t CHAR16_T;
    

    进入

    typedef UINT16_T CHAR16_T;
    

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

    【讨论】:

    • 感谢您的帮助。但我只是做了不同的事情。
    • 我必须这样做才能在 Xcode 中调试我的 MEX 代码。谢谢你。 +1
    【解决方案3】:

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

    我使用自制软件将我的 gcc/g++ 编译器升级到了 4.8 版 --> gcc-4.8g++-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 在更新中涵盖了这一点!

    【讨论】:

    • 是的,我就是这个意思。感谢您的接受,也请随时点赞。 ;) 我认为不修改 MATLAB 安装更为明智,尽管显然大多数人不同意。
    【解决方案4】:

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

    #define char16_t uint16_t 
    

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

    typedef __char16_t char16_t;
    

    这也是<algorithm> 中包含的第一个文件。所以黑客包括在mex.h之前包含algorithm

    #include <algorithm>
    #include "mex.h"
    

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

    【讨论】:

    • 这个修复对我有用!我尝试了 chappjc 的建议,但最初没有用....但是在我修改了 mexopts.sh 文件后,我忘记了通过mex -setup 重新设置 mex。一旦我这样做了,它终于起作用了,但是这个和 chappjc 的方法都可以正常工作
    【解决方案5】:

    在包含 mex.h 之前包含 uchar.h...可以正常工作。此外,上面的答案(添加 -std=c++11)仅适用于 c++,不适用于 c。

    #include <uchar.h>
    #include "mex.h"
    

    【讨论】:

    • here 讨论了一些仅限 C 的解决方案,包括这个解决方案。
    【解决方案6】:

    作为 XCode 5.1.1 的一部分,char16_t 定义在 __config 中,从 typeinfo 调用。

    你可以添加

    #include <typeinfo> 
    

    之前

    #include "mex.h"
    

    定义char16_t

    【讨论】:

      【解决方案7】:

      这篇文章可能会有所帮助:http://www.seaandsailor.com/matlab-xcode6.html

      这比我想象的要容易。只需将所有 10.x 替换为您的 OS X 版本,然后在 mexopts.sh 文件中将 -Dchar16_t=UINT16_T 添加到 CLIBS

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-12
        • 2015-10-20
        • 2017-04-04
        • 1970-01-01
        • 1970-01-01
        • 2012-02-20
        • 2016-06-14
        相关资源
        最近更新 更多