私のディレクトリにはいくつかのカスタム ソース ファイルがあり、私のsrc
ディレクトリには Arduino プロジェクトからのいくつかのソース ファイルがありますsrc/base
。
obj
次の make ルールを使用して、すべてのソース ファイルをオブジェクトにコンパイルし、ディレクトリに格納します。
PATHOBJ := obj/
PATHSRC := src/
PATHBIN := bin/
PATHLIB := lib/
PATHTMP := tmp/
PATHARDUINO = $(PATHSRC)base/
enter code here
$(PATHOBJ)core_%.o : $(PATHARDUINO)%.c
@mkdir -p $(dir $@)
$(GCC) $(ALL_CORE_CFLAGS) -c $< -o $@
$(PATHOBJ)bot_%.o : $(PATHSRC)%.c
@mkdir -p $(dir $@)
$(GCC) $(CFLAGS)-c $< -o $@
ご覧のとおり、 および にコンパイルさsrc/tacho.c
れます。obj/bot_tacho.o
src/base/wiring_analog.c
obj/core_wiring_analog.o
私のメイクファイルでは、すべてのソース ファイルを問題なくコンパイルできます。これらのファイルの 1 つ (つまりsrc/tacho.c
) に、次のインクルードを追加しまし
#include "base/wiring.h"
たanalogRead
。
面白いことwiring.h
に、'analogRead' 関数のプロトタイプしか含まれていません。実際に関数を定義するファイルを含めることさえ気にしませんが、いろいろ調べてみると、関数の定義が にあることがわかりましたsrc/base/wiring_analog.c
。
関数を宣言するファイルをコンパイルし、それを他の必要なすべての Arduino オブジェクト ファイルと一緒に 1 つのライブラリにリンクするだけで十分だと思いました。勝手に名付けましたlib/core.a
。lib/core.a
以下を実行して作成しました。
avr-ar rcs lib/core.a obj/core_wiring.o \
obj/core_wiring_analog.o \
obj/core_wiring_digital.o \
obj/core_wiring_pulse.o \
obj/core_wiring_shift.o
言うまでもなく、最初にこの make ルールの前提条件が整っていることを確認しました。
問題なく動作しました。ただし、問題は、バイナリを生成しようとすると、「未定義の参照」エラーが発生することです。
avr-g++ lib/core.a \
obj/bot_life.o \
obj/bot_port.o \
obj/bot_serial.o \
obj/bot_time.o \
obj/bot_tacho.o \
obj/bot_main.o \
-o bin/bot.elf
/home/david/src/botPMA/src/tacho.c:13: undefined reference to `analogRead'
/home/david/src/botPMA/src/tacho.c:14: undefined reference to `analogRead'
make[1]: *** [bin/bot.elf] Error 1
make[1]: Leaving directory `/home/david/src/botPMA'
make: *** [all] Error 2
core_%.o
オブジェクトの objdump を実行したところcore_wiring_analog.o
、analogRead
. 私が思っていた方法が正しかった場合、 core.a
which contains にcore_wiring_analog.o
は の定義が含まれている必要がありますanalogRead
。src/tacho.c
関数を使用するコンパイルに戻り、analogRead
試行するたびに問題なくコンパイルされました(プリプロセッサは、インクルードについて文句を言う必要性を認識しませんでした)。問題を引き起こしているのはリンクだと思います。
私はオンラインでたくさんのことを読みましたが、それでも自分でこれを理解することはできないようです. おそらくばかげた間違いですが、私はそれを見ることができません。どうすればこの問題を解決できますか?
完全を期すために、プロジェクト全体をここにドロップしました: プロジェクトの googlecode リポジトリ