web-dev-qa-db-ja.com

MEXコンパイルエラー:不明な型名 'char16_t'

次のエラーのため、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コードをコンパイルするための修正はありますか?

[Apple LLVMバージョン5.1(clang-503.0.38)(LLVM 3.4svnベース)を使用してOS 10.9.2で実行]]

21
p0lAris

デフォルトでは、アップグレードされたClangはchar16_tを設定しません。これは、MATLABで必要です。

クイックフィックス

これはCまたはC++コードで機能しますが、各mexコマンドラインで実行する必要があります。

>> mex -Dchar16_t=uint16_t ...

以下の他のソリューションでは、この定義をmex構成に入れるか、C++ 11を有効にします。

永続的なソリューション

オプション:

  • Mex構成ファイルの-std=c++11CXXFLAGSに追加し、.cではなく.cppファイルをコンパイルします。 mex構成ファイルはmexopts.sh(R2014aより前)またはmex -setup(R2014a +)で示される.xmlファイルです。 これはOPで機能したものですが、次のオプションも機能します。システム全体のリファレンスではなく、必ずアクティブ/インストール済みの構成を編集してください。わからない場合は、次の解決策を試してください。
  • Mex.hをインクルードする前に、#defineまたはtypedefを使用してchar16_tを作成してください(以下の「その他の回避策」を参照)。
  • 今後のバージョンのMATLABでは、この問題は修正される予定です。 mex -setupを再実行して、MATLABに再構成して機能させる。 R2014aの時点では、これはうまくいきません。
  • 最後の手段として、MATLABのインストールをいつでも変更して、MATLABのtmwtypes.hをデニスが示唆するようにハッキングすることができますが、私は強く推奨します[〜#〜]ではない[〜#〜]変更MATLABインストール。

注:Cを使用していて、C++に変更できない、または変更したくない場合は、次の解決策に従ってください この他の回答 、OR以下の代替回避策を参照してください。


その他の回避策

何らかの理由でC++ 11標準を有効にできない場合は、プリプロセッサを使用してchar16_tを定義できます。 #define char16_t uint16_tbefore#include "mex.h"を置くか、コンパイラーのコマンドラインで設定します。

-Dchar16_t=uint16_t

または、mex.hを含むtypedefbeforeで再度使用します。

typedef uint16_t char16_t;

これらのソリューションが機能しない場合は、uint16_tUINT16_Tに変更してみてください。さらに、単にuchar.hをインクルードするだけで型が組み込まれると報告している人もいますが、そのヘッダーがない人もいます。

21
chappjc

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ファイルをコンパイルすることはできます。

8
Dennis

この方法が機能しない場合は、他の回答を参照してください。

Homebrewを使用して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によるアップデートでカバーされています!

2
p0lAris

自分の実験を追加するだけです(C++のみ)。の

#define char16_t uint16_t 

mexファイルの他の部分で問題が発生していました。実際、私のmexファイルに続いて、char16_tが適切に定義されました。インクルードのチェーンを追跡することにより、適切なタイプchar16_t__configという名前のファイルに設定されます。

typedef __char16_t char16_t;

これは、<algorithm>からインクルードされる最初のファイルでもあります。そのため、ハックはmex.hの前にalgorithmを含めることにあります。

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

そして、適切な設定が、マルチプラットフォームの方法で、ビルド構成の何も変更せずに実行されます。

2
Raffi

XCode 5.1.1の一部として、char16_ttypeinfoから呼び出される__configで定義されています。

あなたは付け加えられます

#include <typeinfo> 

#include "mex.h"

char16_tを定義します。

0
Navid

この投稿は役立つかもしれません: http://www.seaandsailor.com/matlab-xcode6.html

思ったより簡単でした。すべての10.xをOS Xバージョンに置き換え、-Dchar16_t=UINT16_TファイルのCLIBSmexopts.shを追加するだけです。

Xcode 6がインストールされたOS X 10.9 Mavericksで動作しました。

0
Palli Kominak

Mex.hをインクルードする前にuchar.hをインクルードしてください...また、上記の答え(-std = c ++ 11の追加)はc ++でのみ機能し、cでは機能しません。

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