2015年6月15日月曜日

AVR makefile変更 複数ファイルにソースを分割 memo

AVR:ATmega168p  を使用。
開発環境:Xcode version6.2
main.c だけにプログラムを書いてたけど、長くなってきていやになったので、複数ファイルに分けることにした。
main.c、servo.c、servo.h
の3つ。(とりあえずサーボの関数だけ他の所に移そうと思った。)
まず、サイドバー?のプロジェクト直下のfirmwareを右クリック、servo.cを作成する。
同時に、servo.hも作成するか聞かれたので、作っとく。
main.cで
#include "servo.h"
を追加。
servo.hで、必要な関数(servo.cに書くやつ)の名前と引数を追加。
servo.cで、
#include "servo.h"
を追加し、必要な関数、引数を記述。
ここまでは普通。
参照:「c言語 ファイル 分割 関数」とかでググれば出てくる。
http://c-lang.sevendays-study.com/day7.html
http://bituse.info/c/21
http://homepage3.nifty.com/mmgames/c_guide/20-02.html

ビルドしてみる。
"Command + b"をぽち。
エラー発生!はい?
collect2: error: ld returned 1 exit status make: *** [main.elf] Error 1
とか
Unidentified reference ・・・
とか出てくる。
で、servo.c に書いた関数がずらっと並んで、こんなのねーよと怒られる。

makefile を書き換える必要があるらしい。
これは、main.c、servo.c、servo.hがちゃんとリンクされていないから出るっぽい。
しかし、makefileほとんどいじったことないし、いじったからといって解消されるとも限らない。
で、いろんなページみて、解消出来なくて、紆余曲折あって、結論から言うと、file targets が怪しいと。
初期状態では、

# file targets:
main.elf: $(OBJECTS)
$(COMPILE) -o main.elf $(OBJECTS)

となってる。
これに、servo.cをくっつける。

# file targets:
main.elf: $(OBJECTS)
$(COMPILE) -o main.elf $(OBJECTS) servo.c

これで、これだけで、一応コンパイルは通った。
それまでにいろいろ適当に書いてはビルドしてを繰り返して、時間をかけたから、シンプルで若干ショック。
基本的過ぎて、誰も書いてない。(探し方が悪いだけ)
もしかしたら、コンパイル通ったのはたまたまかも知れんけど。

ちなみに、途中、他にもいろいろよくわからんエラーが出たわけやけど、
makefileでの設定?のさいしょ(上で言う"$(COMPILE)"の前)は必ずTabで、spaceはダメらしい。
Tabに見えても実はspace 8個とかになってたら、なんかエラー出る。
上とは違うエラーメッセージやけど。調べてみると吉。

あー。。。。