2

私のディレクトリにはいくつかのカスタム ソース ファイルがあり、私の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.osrc/base/wiring_analog.cobj/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.alib/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.oanalogRead. 私が思っていた方法が正しかった場合、 core.awhich contains にcore_wiring_analog.oは の定義が含まれている必要がありますanalogReadsrc/tacho.c関数を使用するコンパイルに戻り、analogRead試行するたびに問題なくコンパイルされました(プリプロセッサは、インクルードについて文句を言う必要性を認識しませんでした)。問題を引き起こしているのはリンクだと思います。

私はオンラインでたくさんのことを読みましたが、それでも自分でこれを理解することはできないようです. おそらくばかげた間違いですが、私はそれを見ることができません。どうすればこの問題を解決できますか?

完全を期すために、プロジェクト全体をここにドロップしました: プロジェクトの googlecode リポジトリ

4

2 に答える 2

5

linker パラメータを見逃したことを理解するために、ほぼ 1 日を費やしました-L. TARGET。私の場合、最終的なリンク ルーチンは次のようになりました。

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 \
    -L. lib/core.a

多くの時間を費やし、一見多くの時間を無駄にしているように見えますが、貴重な教訓を学んだので、時間をかける価値があったと思います.

ディテール、ディテール、ディテール…

于 2011-06-02T20:10:51.990 に答える
-1

私はこのMakefileを書きました、あなたはそれが役に立つと思うかもしれません:

http://code.google.com/p/asadchev/source/browse/trunk/work/arduino/Makefile

基本的に次のようなdir構造を作成します。

sketch/sketch.pde
sketch/Makefile

make / make upload/etcを試してください

于 2011-06-03T05:19:40.730 に答える