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;
}
書きましたが、この際なので、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;
}
- 関連記事
-
- Arduino IDE | Linux Arduino互換ライブラリをLinaro ARM Linux GCC 4.7でビルド→正常終了
- Arduino IDE | Linux Arduino互換ライブラリをUbuntu/Linaro x86 Linux GCCでビルド→途中でエラー
- Arduino IDE | Linux Arduino互換ライブラリをCygwin GCCでビルド→最初からエラー
- Arduino IDE | Intel Galileo Arduino IDEのマイコンボードメニューを冗談半分(?)に増やしてみた
- Arduino IDE | Intel Galileo Arduino IDEで作成した実行プログラムをLinuxから実行する時の引数
- Arduino IDE | Intel Galileo Arduino IDEでcppファイルをコンパイル
- Arduino IDE | Pleiades KeplerとIntel Galileo Arduino IDEでスケッチフォルダとビルドフォルダを共有
- Arduino IDE | Pleiades KeplerでLinux Arduino互換ライブラリをcppファイルから使用する
- Arduino IDE | Pleiades KeplerでLinux Arduinoスケッチのinoファイルをコンパイル
- Arduino IDE | Pleiades Kepler + VMware Player上のUbuntuでLinux Arduinoスケッチをデバッグ (2)
- Arduino IDE | Pleiades Kepler + VMware Player上のUbuntuでLinux Arduinoスケッチをデバッグ (1)
- Arduino IDE | Intel Galileo Arduino IDEのビルドフォルダを変更する
- Arduino IDE | Intel Galileo Arduino IDEで呼び出すGCCやオプションを変えてビルドする
- Arduino IDE | Intel Galileo Arduino IDEのGCCでビルドしたプログラムをUbuntuで実行してみた
- Arduino IDE | Intel Galileo Arduino IDEにGCCを呼び出す時のオプションを表示させる
2014/01/04 blog-entry-400 category: Arduino Lib & CrossGCC
| h o m e |