ページ 11

インクルードファイルでの再定義エラー

Posted: 2013年11月12日(火) 11:27
by タリック
ARTK_MMD(ARToolKit)をベースにして、kinectでスケルトンを読み込んでPMDを動かしたいんですが、
VecMatQuat.h(ar側)とNuiSensor.h(kinect側)にあるVector4の構造体の記述が重複しているようです。 エラーの内容は次の通りです。
1>C:\Program Files\Microsoft SDKs\Kinect\v1.6\inc\NuiSensor.h(126): error C2371: 'Vector4' : 再定義されています。異なる基本型です。
1> c:\artk_mmd_src_no_bullet\artk_mmd_src\src\mmd\VecMatQuat.h(19) : 'Vector4' の宣言を確認してください。
VecMatQuat.hでは
struct Vector4
{
float x, y, z, w;
};
NuiSensor.hでは
#ifndef _Vector4_
#define _Vector4_
typedef struct _Vector4
{
FLOAT x;
FLOAT y;
FLOAT z;
FLOAT w;
} Vector4;
#endif _Vector4_
となっています。

名前領域を設定してみたりしてみましたが、nuiskeleton.hの方で参照エラーがでてうまくいきません。
1,ヘッダーファイルは書き換えない
2,両方の構造体を区別して利用する
できればこの2つを方針として何か解決策はないでしょうか?よろしくお願いします。

Re: インクルードファイルでの再定義エラー

Posted: 2013年11月12日(火) 12:39
by h2so5
自分だったら、struct Vec4 { float x, y, z, w } のような共通の型を新たに定義し、ARTK_MMDとkinectで翻訳単位を分けてラップして、
ラッパーのインターフェイスにはVec4を使用して相互に利用できるようにすると思います。

つまりARTK_MMDとkinectのAPIを同時に利用する箇所では直接ライブラリのヘッダーをインクルードせずに、
ラッパーを利用することで衝突を回避します。


すこし強引ですがヘッダーファイルは書き換えずにオブジェクトファイルを書き換えるという方法もあります。
(ヘッダーの方の名前はインクルード先の#defineで書き換え)

Re: インクルードファイルでの再定義エラー

Posted: 2013年11月13日(水) 14:10
by タリック
返信ありがとうございます。
ラップと二重定義について解説しているサイトがあったので、
そちらを参考にしながら前者の方法で試していこうと思います。