#
一般的に
- Gearsの場合は CbCで書いたファイルをPerlスクリプトで変換して、変換後のファイルがコンパイルされる
- そのために自分が書いた.cbcなファイルと、生成された.cファイル、ヘッダファイルを見てエラーを考える必要がある
- 他にはCファイルの問題もある
#
個別
#
Gearef(cbc_context,char)
#
原因 1
- CodeGearの引数を実装しているInteface/Interfaceの実装に無いフィールドを参照しているときに起こる
- Gearefの第2引数はDataGear(context.hの中のunion Dataにかかれている構造体)でないとだめだが、charは無いので
#
解決方法
char* hoge
などを引数で渡していると考えられるので、これをInteface/InterfaceImplのfieldに追加する
#
原因 2
#interface "hoge.h"
しているhoge.h
がgenerate_stub.pl
側から参照できない
- generate_stub中でPerlの
if (-f $filename)
でファイルを判定している為
#
解決方法
#interface
以降のファイル名をmakeしているディレクトリからの相対パスで書く
- ビルドしている.cbcと同じディレクトリの場合は省略可能
#
Gearef
の第2引数が空白になっている
#
原因
- generate_stubで上手く生成できていない
- generate_stubは現在実装しているinterfaceの名前をコンストラクタの関数名でキャプチャしている
Interface* createInterfaceImpl()
- この
Interface*
に該当するものが、Intefaceの名前であり、 Gearefの第2引数になる
#
解決
- 該当するコンストラクタを書く
- 書かれたコンストラクタはextern.hに出力される
#
__code next(...)
が.cでも置換されてない/ stubで渡している変数の数が足りない
#
原因
- 引数の型名を
struct hoge* foo
ではなくて stuct hoge *foo
にしているのが原因
*
は必ず型名の方につける必要がある
#
解決
- 生成されたcのstubのコードを見ながらポインタの位置がずれてそうな箇所を探す
#
よくわからないGearefが生成されている
#
原因
- 現状のgenerate_stubは
//
はCのコメントに対応していない
// goto hoge()
みたいに書いてしまうと、コメントの外にGearefのマクロが出力されてしまう
#
対策