GR-SAKURA
GR-KURUMI
GR-COTTON
GR-CITRUS
GR-PEACH
GR-KAEDE
GR-ADZUKI
GR-LYCHEE
GR-ROSE
GR-MANGO(*)
SNShield
Web Compiler
IDE for GR
TOPPERS関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
恐れ入ります。
本格的にarduinoから移行を進めており、判らない点がありお教えください。
arduinoでは、同じフォルダにpdeファイルを複数置くだけで、自動的にマージ>コンパイルが通りましたが、webコンパイラでcppファイルを複数置いた場合はマージしてくれません。リンカファイルとその設定をおしえてください。
またProject rootで新規作成でフォルダを作成した場合、使い方が判りません。(新規作成フォルダへのパスは?)
宜しくお願いいたします。
ここら辺のドキュメント整備が不十分ですみません。
Webコンパイラではルートも含めてすべてのフォルダに対して、
・コンパイル用ソース.cpp, .cを検索してソースとして追加します。複数のcppを置いてもコンパイルの対象になります。
・アセンブル用ソース.s, .asmも同様に検索してソースとして追加します。
・ヘッダファイルの.hも検索してコンパイラのインクルード対象にします。
新規にフォルダを作った場合でも同様に作用しますので、記載されている動作についてはコンパイル対象になるはずです。
もう少し「マージ」に関して詳しく教えていただきたいのですが、以下のような例で教えていただけないでしょうか?
お手数をおかけしますが宜しくお願いいたします。
-----一例------
1.ルートフォルダに「test.cpp」を追加
2.test.cppに下記ソース記載
void func(){
while(digitalRead(5)){}
}
3.gr_sketch.cppに下記ソース記載
extern void func(void);
(略)
void loop(){
func();
4.ビルドするとfunc()が見つからずエラーになる。
まさしく上記の例の場合を「マージ」と記載しました。
上記の例の通り、ビルドするとfunc()が見つからずエラーが発生しております。
複数のcppファイルを同じルートに置いてもコンパイルの対象にならないと思っております。
設定が悪いのでしょうか。#include "等の構文が必要でしょうか。
エラーの内容を教えていただいても宜しいですか?
実験しました所、上記の例での extern void func(void);
が抜けておりました。arduinoでは使っておりませんでした。(使わなくともビルドできたので)
ありがとうございました。
なるほど、ご連絡ありがとうございます。そうなんです、その辺りはCそのものを継承しています。互換性のイマイチな点でご面倒をおかけしてすみませんが、ご理解宜しくお願いいたします。
恐れ入ります。もう一点あります。外部変数の取り扱いです。
1.gr_sketch.cppに下記ソース記載
int a;
byte b;
boolean c= false;
a++;
b++;
c=true;
この場合、test.cppファイルのvoid func()の前に以下の外部変数参照を加えるとエラーが発生します。
extern int a; ----->エラーなし
extern byte b; ----->error: 'byte' does not name a type
extern boolean c; ----->error: 'boolean' does not name a type
よろしくお願いいたします。(ちなみにarduinoでは外部変数参照も不要です)
GR-SAKURA だか KURUMI だか分かりませんが、test.cpp の先頭のほうに
#include <rxduino.h>
だか
#include <RLduino78.h>
は書かれてますか?
#include <rxduino.h>を入れたら解決しました。
早めにマニュアル希望します(T_T)
さらにこんなエラーが出ました。
gr_common/lowlevel.c:128:3: warning: overflow in implicit constant conversion [-Woverflow]
gr_common/lowlevel.c:129:3: warning: large integer implicitly truncated to unsigned type [-Woverflow]
gr_common/lowlevel.c:134:3: warning: overflow in implicit constant conversion [-Woverflow]
lowlevel.cの解説をもらえるとありがたいです。
エラーでなく警告なので気にしなくて良いです。fstat() に不正な引数を与えた際に書き込まれる出鱈目な値っぽいので、気になるなら代入してる定数を0とかに書き換えれば警告は出なくなります。
たびたび恐れ入ります。
xxxのコンパイルが完了しました
コンパイルに失敗しました
との表示が出ます。
また拡張子が.oの変なファイルが作られます。(たとえばMaaaaa_Move.oとか。Maaaaa_Move.cppは私の作ったプログラムです)
以下ビルドの際のメッセージです
rx-elf-ld ./gr_common/gstart.o ./gr_sketch.o ./Maaaaa_Move.o ./_9DOM20111002.o ./gr_sakura_wire/InstWire.o ./gr_common/intvect.o ./gr_common/lowlevel.o ./gr_common/lib/libc.a ./gr_common/lib/libg.a ./gr_common/lib/libgcc.a ./gr_common/lib/libm.a ./gr_common/lib/librxduino.a ./gr_common/lib/libsim.a ./gr_common/lib/libstdc++.a ./gr_common/lib/libsupc++.a ./gr_common/lib/libtkdnhal.a ./gr_common/lib/libtkdnip.a ./gr_sakura_wire/libwire.a -Map ./gr_build/sketch.map -L./gr_common/lib/ -lrxduino -lstdc++ -lsupc++ -lc -lsim -lgcc -lm -ltkdnhal -nostartfiles --no-flag-mismatch-warnings -T ./gr_common/gr_sakura.gsi -o ./gr_build/sketch.x
./Maaaaa_Move.o:(D+0xc8): multiple definition of `MoFB'
./gr_sketch.o:(D+0xe4): first defined here
./Maaaaa_Move.o:(D+0x8): multiple definition of `Move_TU_table'
./gr_sketch.o:(D+0x24): first defined here
./Maaaaa_Move.o:(D+0x48): multiple definition of `Move_FB_table'
./gr_sketch.o:(D+0x64): first defined here
./Maaaaa_Move.o:(D+0x88): multiple definition of `Move_LR_table'
./gr_sketch.o:(D+0xa4): first defined here
./_9DOM20111002.o:(D+0x80): multiple definition of `Move_LR_table'
./_9DOM20111002.o:(D+0x40): multiple definition of `Move_FB_table'
./_9DOM20111002.o:(D+0x0): multiple definition of `Move_TU_table'
./_9DOM20111002.o:(D+0xc0): multiple definition of `MoFB'
rx-elf-ld: warning: section `.bss' type changed to PROGBITS
make: *** [rom] Error 1
よろしくお願いいたします。
変数の定義が複数個所で定義されていますね。例えばgr_sketch.cppとMaaaaa_Move.cppで同様にしてMove_TU_tableを定義していると思います。どちらかをexternで広域宣言すれば解決すると思います。
作成されて正常です。Arduinoと違い、オブジェクトファイルが見えるところに作成されます。
./Maaaaa_Move.o:(D+0xc8): multiple definition of `MoFB' ./gr_sketch.o:(D+0xe4): first defined here ./Maaaaa_Move.o:(D+0x8): multiple definition of `Move_TU_table' ./gr_sketch.o:(D+0x24): first defined here ./Maaaaa_Move.o:(D+0x48): multiple definition of `Move_FB_table' ./gr_sketch.o:(D+0x64): first defined here ./Maaaaa_Move.o:(D+0x88): multiple definition of `Move_LR_table' ./gr_sketch.o:(D+0xa4): first defined here ./_9DOM20111002.o:(D+0x80): multiple definition of `Move_LR_table' ./gr_sketch.o:(D+0xa4): first defined here ./_9DOM20111002.o:(D+0x40): multiple definition of `Move_FB_table' ./gr_sketch.o:(D+0x64): first defined here ./_9DOM20111002.o:(D+0x0): multiple definition of `Move_TU_table' ./gr_sketch.o:(D+0x24): first defined here ./_9DOM20111002.o:(D+0xc0): multiple definition of `MoFB' ./gr_sketch.o:(D+0xe4): first defined here
Maaaaa_Move.cpp と gr_sketch.cpp で、重複している外部シンボルがエラーとなっています。
ありがとうございます。
確かにMove_TU_tableの定義は、Maaaaa_data.hファイルにて宣言しておりました。
これを、それぞれのcppファイルの文頭(gr_sketch.cppやMaaaaa_Move.cpp)に
#include "Maaaaa_data.h"
と宣言しましたがこれが重複しており問題だったようです。
これもarduinoと比較すると.hファイルの使用方法が全く違うことが判りました。
.hファイルで変数の宣言を行うと重複してしまうため、GR-sakuraコンパイラにおいて、ユーザーが作る.hファイルは、#define文(マクロも?)を宣言するくらいしか使い道が無いと考えますが合ってますでしょうか。
GR-sakuraコンパイラにおいて、ユーザーが作る.hファイルは、#define文(マクロも?)を宣言するくらいしか使い道が無いと考えますが合ってますでしょうか。
ヘッダファイルをインクルードする .cpp ファイルがひとつならば何書いても問題ありませんし、変数や関数の宣言、マクロやクラスの定義等、実体を伴わないものであれば普通に書けます。また、変数の定義等、実体を伴うものであっても、名前空間で区別すれば複数ファイルからインクルードされてもエラーにはなりません。要は使い方次第です。