にほんブログ村 その他趣味ブログ 電子工作へ

2010年09月20日

コンパイル関連その1

モッパーです。

Arduino のコンパイルに関する備忘録です。
結果的にはあちこちのサイトに情報があるものですが、少なくとも私は検索でヒットするために結構苦労したのでキーワードを付けて公開しておきます。
Arduino IDE はある種のプリプロセッサで、Arduino 言語を C++ のソースコードに変換してから gcc でコンパイルします。C や C++ になじんだ方にとって、文法の定義が曖昧な Arduino 言語から変換された C++ のソースコードを見たほうが分かりやすいこともあると思います。ただし、Arduino IDE 0018 は変換の結果を見るためにはちょっと普通では思いつかない手順が必要です。

  • \Documents and Settings\ユーザー名\Application Data\Arduino\preferences.txtを編集して build.path=build という行を追加します。
  • Arduino IDE をインストールしたフォルダに build というフォルダを作成します。
  • コンパイルすると build の下に .cpp や .o が作成されます。Arduino IDE を終了すると消えてしまいます。
本当は .s とかもみれればもっと安心出来るんですけど、Arduino IDE の make の理屈(どの makefile を使っているのか、オプション等の書き換え可能なのか...) がまだ分かりません。Arduino IDE でコンパイルする時に SHIFT キー押しながらやると詳細なコマンドが表示されますが、これを見て自分で makefile 作れということなのかな... どなたかご存知なら教えて下さい。(他力本願...)
posted by モッパー at 21:05| Comment(2) | TrackBack(0) | Arduino
この記事へのコメント
buildフォルダにはまいりましたね。前は全部残ってたのにどこに行ったのか?と思ってずいぶん探しましたから。

残念ながら自前でコンパイルオプション変えたり,makefile作ったりできるほどのスキルはありませんのでご期待に添えません。というか,C言語もコンピュータも素人です^^

Arduinoは,そういう難しいことを気にしないでなんとなく動く,というものなんでしょうね。

ただ,main関数の中に,
setup();
for(;;){
loop();
}
があり,setup関数より前に書いた関数とか,変数の宣言,setup,loop関数のプロトタイプ宣言が最初にコピーされているということだけ知ってると少し理解しやすいのかもしれませんね。

また,専門家の立場でいろいろわかったら教えてください。
Posted by Reverse父 at 2010年09月22日 00:53
Reverse 父様

モッパーです。

ヒントありがとうございます。私はソフト屋ではありますが、現役プログラマだったのは十数年前までなので既に技術が錆付いてます。

Arduino 言語というくらいなので、何かたいそうなソースコード変換をしてから gcc でコンパイルしているのかと思っていましたが、以下のことやっているだけで実は単純な C++ コンパイラだと思えば良いんですね。今頃気付くなということのようですみません(泣、汗)

(1) 各ソースコードのタブの名前にファイルエクステンションをつけないと Arduino IDE が自動的にソースコードを1つのファイルにまとめてしまって、#include "WProgram.h"と全ての関数のプロトタイプ宣言を冒頭に追加してコンパイル・リンクする。main 関数は以下の通り。init()の内容は wiring.c を見れば良い。
int main(void)
{
init();
setup();
for (;;)
loop();
return 0;
}
(2) タブの名前にファイルエクステンション(.cpp とか .h とか)をつけるとタブ毎にファイルを分けて素直にコンパイル・リンクしてくれる。従ってこの場合は #include "WProgram.h" とプロトタイプ宣言必須。このお作法だと単なる C++ コンパイラだと思えば良い。
(3) Arduino は文法が曖昧なわけではなく gcc の文法チェックが甘い設定なだけ。

N が悩んでいた変数のスコープがロボデザイナに比べると変わってしまっているらしいと言うのも上記で理解出来ました(グローバル変数なんか使うな!!! が本筋だと思いますが)。
私としては、これでかなりすっきり理解出来ました。(N に分かってもらうのは大変そうですが...)

ちなみに setup() と loop() の含まれているソースコードのタブ名を .cpp に変えようとすると「The main file can't use an extension. (It may be time for your to graduate to a "real" programming environment)」とサジェストしてくれて、とってもオチャメです(笑)。

>Arduinoは,そういう難しいことを気にしないでなんとなく動く,というものなんでしょうね。

その通りだと思います。こんなこと知らずに (1) の作法で とりあえずやってみたら動くというのが arduino の良いところであり、本来の使い方だと思います。ANSI C からの移行組である当方は (2) が可能なことを知らないまま (1) で始めてしまったので混乱してしまいました。当方のようなパターンは (2) の作法から始めたほうが理解が早いと思います。
Posted by モッパー at 2010年09月22日 23:41
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/40833314
※ブログオーナーが承認したトラックバックのみ表示されます。
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック
にほんブログ村 その他趣味ブログ 電子工作へ