なんとかなるさね

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


Arduino IDE | Intel Galileo Arduino IDEでcppファイルをコンパイル 

以前のエントリで、日本語化e2studio V.2(大昔の版)にArduino eclipse pluginをインストールしたことを
書きましたが、まだPleiades 4.3 Keplerにはインストールしていませんでしたので、最新版の情報を確認
しようと思い、Arduino eclipse pluginのウェブサイトを見直していたところ、以下の文に気付きました。
どうやら、Arduino IDEでも、(inoファイルが最低1つ必要になるものの)cppファイルを扱うことが出来る
ということのようです。そこで、試しに、Intel Galileo Arduino IDEでcppファイルをコンパイルしてみま
した。(ちなみに、以下のページは、Eclipseでinoファイルを扱う方法について書かれたページです。)

http://www.baeyens.it/eclipse/IDECompatibility.html

The arduino IDE can handle C++ files but needs at least one ino/PDE file (for amongst others) to
identify the classpath.

あれこれ試してみたところ、以下のことが分かりました。

* 中身は無くて良いので<スケッチ名>.inoというファイルが必要
* cppファイルは普通に1つ1つGCCでコンパイルされる
* 普通にGCCでコンパイルされてリンクされるので、ヘッダファイル内の変数定義がリンク時にシンボル
重複エラーになることがあり、回避策としてリンクオプションに--allow-multiple-definitionが必要

ちなみに、inoファイルについては、以前のエントリで試してみた通り、以下のように扱われるようです。

* inoファイルは<スケッチ名>.cppという1つのファイルに結合されてGCCでコンパイルされる
* ファイルが結合される時、自動的にプロトタイプ宣言も補われる

ビルド結果は以下の通りでした。

BuildLog.txt



試したソースコードは、以下の通りです。

ファイル: sketch_jan08a.ino

// This is a dummy file for Arduino C/C++ based sketch.
#if 0
// Any comments such as release note, change log and todo list can be put here.
#endif /* #if 0 */


ファイル: 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.cpp

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


ファイル: 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__ */


ファイル: stdafx.h

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


なお、Arduino IDEがビルドフォルダでinoファイルを結合したsketch_jan08a.cppは、以下の通りでした。

ファイル: sketch_jan08a.cpp

#line 1 "sketch_jan08a.ino"
// This is a dummy file for Arduino C/C++ based sketch.
#if 0
// Any comments such as release note, change log and todo list can be put here.
#endif /* #if 0 */

#include "Arduino.h"
#line 6




追記 : メモ

Intel Galileo Arduino IDEでリンクオプションに--allow-multiple-definitionを追加しなかった場合には、
以下のようにリンク時にシンボル重複エラーになりました。

sketch_dec28a_add.cpp.o: In function `undecl(char const*)':
E:\tools\micom\Intel\sketchbook\build/sketch_dec28a_add.cpp:3: multiple definition of `globvar'
sketch_dec28a.cpp.o:(.bss.globvar+0x0): first defined here
collect2.exe: error: ld returned 1 exit status


リンクオプションは、Intel Galileo Arduino IDEが呼び出すGCCやオプションを定義している以下の環境
設定ファイルを書き換えることで追加しました。

ファイル: E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\platform.win.txt

書き換えた箇所(赤字の箇所)

name=Arduino X86 Boards
# compiler.path TBD
compiler.path={runtime.ide.path}/hardware/tools/x86/i686-pokysdk-mingw32/usr/bin/i586-poky-linux-uclibc/
compiler.c.cmd=i586-poky-linux-uclibc-gcc
compiler.c.flags= -m32 -march=i586 --sysroot={runtime.ide.path}/hardware/tools/x86/i586-poky-linux-uclibc -c -g -Os -w -ffunction-sections -fdata-sections -MMD
#compiler.c.elf.flags=-m32 -march=i586 --sysroot={runtime.ide.path}/hardware/tools/x86/i586-poky-linux-uclibc -Os -Wl,--gc-sections
compiler.c.elf.flags=-m32 -march=i586 --sysroot={runtime.ide.path}/hardware/tools/x86/i586-poky-linux-uclibc -Os -Wl,--gc-sections,--allow-multiple-definition
compiler.c.elf.cmd=i586-poky-linux-uclibc-g++
compiler.S.flags=-c -g -assembler-with-cpp
compiler.cpp.cmd=i586-poky-linux-uclibc-g++
compiler.cpp.flags= -m32 -march=i586 --sysroot={runtime.ide.path}/hardware/tools/x86/i586-poky-linux-uclibc -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -MMD
compiler.ar.cmd=i586-poky-linux-uclibc-ar
compiler.ar.flags=rcs
compiler.objcopy.cmd=i586-poky-linux-uclibc-objcopy
compiler.objcopy.eep.flags=-O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0
compiler.elf2hex.flags=-O ihex -R .eeprom
compiler.elf2hex.cmd=i586-poky-linux-uclibc-objcopy
compiler.ldflags=
compiler.size.cmd=i586-poky-linux-uclibc-size
#compiler.strip.cmd=i586-poky-linux-uclibc-strip
compiler.strip.cmd=i586-poky-linux-uclibc-strip.bat
# this can be overriden in boards.txt
build.extra_flags=

追記 : 雑感

まだ試してはいませんが、Pleades 4.3 Keplerの場合、Linux Arduino互換ライブラリを呼び出すような
Linuxの共有ライブラリも作成出来そうな気はしています。今回、Intel Galileo Arduino IDEの環境設定
ファイルでリンクオプションを書き換えているうちに、やろうと思えば、Intel Galileo Arduino IDEでも、
そのような共有ライブラリを作成出来そうな気もしてきました。(ただ、実行ファイルを作成する場合と
共有ライブラリを作成する場合とで、どうやってオプションを切り替えるのが良いか思い付いていません。
環境設定ファイルをその都度書き換えるのは面倒そうです。)

関連記事

2014/01/08   blog-entry-402   category: Arduino Lib & CrossGCC

go page top