なんとかなるさね

マイコンをネタにブログを始めてみました


Arduino IDE | Pleiades KeplerでLinux Arduino互換ライブラリをcppファイルから使用する 

1つ前のエントリで、Linux ArduinoスケッチのinoファイルをEclipse上でそのままコンパイル出来たことを
書きましたが、この際なので、cppファイルからLinux Arduino互換ライブラリを呼び出したいところです。
もっとも、1つ前のエントリに書いたやり方の場合、inoファイルに対しても、EclipseのC/C++プログラム
編集支援機能が使用出来るようですので、inoファイルとcppファイルの使い分けは、かなり気分的なものに
なりそうです。実際的にも、inoファイルとcppファイルの差は、以下の違いぐらいしか無さそうです。

(1) ソースファイルの拡張子を.inoでは無く.cppにする
(2) ソースファイル(.cpp)の先頭に#include "stdafx.h"を書く

これと合わせて、Eclipseのプロジェクトのプロパティの[C/C++ビルド]→[設定]→[ツール設定]で、以下を
変更するのが本来のやり方なのでしょうが、変更しなくても特に差し支えは無いような気がします。

(1') [Cross G++ Compiler]→[その他]→[その他のフラグ]から'-xc++'の指定を削除する
(2') [Cross G++ Compiler]→[インクルード]→[インクルードファイル]から'stdafx.h'の指定を削除する

ただ、1つ前のエントリに書いたように、ちょっと手抜きをして、Linux Arduino互換ライブラリ本体とも
言えるcore.aを自前ではビルドせずに、Intel Galileo Arduino IDEでビルドした時のcore.aをそのまま使用
していますので、その点が不便そうです。(それから、Eclipseだけでやろうとした場合、ボードへのダウン
ロード機能と実行機能をGDBSERVERか何かで何とかしないと、その点でも不便になりそうです。あるいは、
Intel Galileo Arduino IDEのダウンロード/実行ツールをEclipse上から呼び出すようなことも出来るかな?)

追記 : メモ

(1') [Cross G++ Compiler]→[その他]→[その他のフラグ]から'-xc++'の指定を削除する



(2') [Cross G++ Compiler]→[インクルード]→[インクルードファイル]から'stdafx.h'の指定を削除する



追記 : メモ

あと、Arduinoスケッチでは警告レベルが大甘になっていますので、C++では元に戻した方が良さそうです。



ちなみに、警告レベルを元に戻したところ、以下の警告が表示されるようになりました。

deprecated conversion from string constant to 'char*' [-Wwrite-strings]


そういえば、'char*'型の引数に文字列定数を渡すことは良くないですので、引数の型を'conar char*'とする
ことにしました。また、この際ですので、undecl()関数のプロトタイプ宣言は、stdafx.hではなく、C/C++
ソースコードで普段やるようにsketch_dec28add.hに書くことにして、今回は、以下のように修正しました。

ファイル: sketch_dec28a.cpp

#include "stdafx.h"
#include "sketch_dec28a_add.h"
void setup() {
  printf("Hello app!!\n");
  globvar = 1;
  undecl("test undecl\n");
  exit(0);
}
void loop() {
}


ファイル: sketch_dec28a_add.h

#ifndef __SKETCH_DEC28A_ADD_H__
#define __SKETCH_DEC28A_ADD_H__
int globvar = 0;
void undecl(const char *str);
#endif /* __SKETCH_DEC28A_ADD_H__ */


ファイル: sketch_dec28a_add.cpp

#include "stdafx.h"
#include "sketch_dec28a_add.h"
void undecl(const char *str) {
  printf(str);
  globvar = 0;
}


ファイル: stdafx.h

#ifndef __STDAFX_H__
#define __STDAFX_H__
#include "Arduino.h"
void setup();
void loop();
#endif /* __STDAFX_H__ */


このソースコードは、拡張子がcppでもinoでもコンパイルエラー無くビルド出来ました。(なお、拡張子が
inoの場合、上の(1')で削除した'-xc++'の指定を復活させておく必要があります。)


BuildLog_cpp.txt


BuildLog_ino.txt

追記 : メモ

いつものように、ちょっと好奇心から、上のソースコードで拡張子をcpp→inoに変更して、Intel Galileo
Arduino IDEでビルドしたところ、コンパイルエラー無くビルド出来ました。



ちなみに、以前のエントリで試してみた通り、Arduino IDEはビルドフォルダで、inoファイルを結合して
プロトタイプ宣言を補ってcppファイルを生成するのですが、生成されたcppファイルは以下の通りでした。

ファイル: sketch_dec28a.cpp

#line 1 "sketch_dec28a.ino"
#include "stdafx.h"
#include "sketch_dec28a_add.h"
#include "Arduino.h"
void setup();
void loop();
void undecl(const char *str);
#line 3
void setup() {
  printf("Hello app!!\n");
  fflush(stdout);
  globvar = 1;
  undecl("test undecl\n");
  exit(0);
}
void loop() {
}
#line 1 "sketch_dec28a_add.ino"
#include "stdafx.h"
#include "sketch_dec28a_add.h"
void undecl(const char *str) {
  printf(str);
  fflush(stdout);
  globvar = 0;
}


関連記事

2014/01/04   blog-entry-400   category: Arduino Lib & CrossGCC

go page top