次のエラーのため、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で実行]]
デフォルトでは、アップグレードされたClangはchar16_t
を設定しません。これは、MATLABで必要です。
これはCまたはC++コードで機能しますが、各mex
コマンドラインで実行する必要があります。
>> mex -Dchar16_t=uint16_t ...
以下の他のソリューションでは、この定義をmex構成に入れるか、C++ 11を有効にします。
オプション:
-std=c++11
をCXXFLAGS
に追加し、.cではなく.cppファイルをコンパイルします。 mex構成ファイルはmexopts.sh(R2014aより前)またはmex -setup
(R2014a +)で示される.xmlファイルです。 これはOPで機能したものですが、次のオプションも機能します。システム全体のリファレンスではなく、必ずアクティブ/インストール済みの構成を編集してください。わからない場合は、次の解決策を試してください。#define
またはtypedef
を使用してchar16_t
を作成してください(以下の「その他の回避策」を参照)。mex -setup
を再実行して、MATLABに再構成して機能させる。 R2014aの時点では、これはうまくいきません。注:Cを使用していて、C++に変更できない、または変更したくない場合は、次の解決策に従ってください この他の回答 、OR以下の代替回避策を参照してください。
その他の回避策
何らかの理由でC++ 11標準を有効にできない場合は、プリプロセッサを使用してchar16_t
を定義できます。 #define char16_t uint16_t
before#include "mex.h"
を置くか、コンパイラーのコマンドラインで設定します。
-Dchar16_t=uint16_t
または、mex.hを含むtypedef
をbeforeで再度使用します。
typedef uint16_t char16_t;
これらのソリューションが機能しない場合は、uint16_t
をUINT16_T
に変更してみてください。さらに、単にuchar.hをインクルードするだけで型が組み込まれると報告している人もいますが、そのヘッダーがない人もいます。
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ファイルをコンパイルすることはできます。
この方法が機能しない場合は、他の回答を参照してください。
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によるアップデートでカバーされています!
自分の実験を追加するだけです(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"
そして、適切な設定が、マルチプラットフォームの方法で、ビルド構成の何も変更せずに実行されます。
XCode 5.1.1の一部として、char16_t
はtypeinfo
から呼び出される__config
で定義されています。
あなたは付け加えられます
#include <typeinfo>
前
#include "mex.h"
char16_t
を定義します。
この投稿は役立つかもしれません: http://www.seaandsailor.com/matlab-xcode6.html
思ったより簡単でした。すべての10.xをOS Xバージョンに置き換え、-Dchar16_t=UINT16_T
ファイルのCLIBS
にmexopts.sh
を追加するだけです。
Xcode 6がインストールされたOS X 10.9 Mavericksで動作しました。
Mex.hをインクルードする前にuchar.hをインクルードしてください...また、上記の答え(-std = c ++ 11の追加)はc ++でのみ機能し、cでは機能しません。
#include <uchar.h>
#include "mex.h"