Die Lösung "undefined reference" Fehler in einer makefile

Habe ich ein paar custom-Quelldateien in meinem src Verzeichnis und ein paar source Dateien aus dem Arduino-Projekt in meiner src/base Verzeichnis.

Compiliere ich alle source-Dateien in Objekte, die gespeichert sind in meinem obj Verzeichnis mit der folgenden Regelungen zu treffen:

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 $@

Wie Sie sehen können, es würde kompilieren src/tacho.c zu obj/bot_tacho.o und src/base/wiring_analog.c zu obj/core_wiring_analog.o.

In meinem makefile compiliere ich alle meine source-files ohne Probleme. In einer dieser Dateien (nämlich src/tacho.c) habe ich die folgenden zählen:
#include "base/wiring.h" enthält der Prototyp analogRead.

Das lustige an der Sache ist, dass wiring.h nur enthält den Prototyp für die "analogRead" - Funktion. Es muss nicht einmal die Mühe, die Dateien, die tatsächlich die Funktion definiert, aber einige nosing around führte mich zu entdecken, dass die definition der Funktion zu finden war in src/base/wiring_analog.c.

Ich damit gerechnet es würde genügen, die Datei zu kompilieren, dass tut die Funktion deklarieren, und verbinden Sie es zusammen mit allen anderen notwendigen Arduino-Objekt-Dateien in eine einzige Bibliothek. Habe ich willkürlich gewählt, es zu benennen lib/core.a. Ich machte lib/core.a durch ausführen der folgenden:

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

Unnötig zu sagen, dass ich zuerst sicher, dass die Voraussetzungen für diese Regel in Ordnung waren.

Funktioniert ohne problem; das problem ist jedoch, dass der Versuch der Erstellung meiner binäre hinterlässt bei mir einen "undefined reference" Fehler.

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

Habe ich ein objdump der core_%.o Objekte, und ich habe bemerkt, dass core_wiring_analog.o erwähnt analogRead. Wenn die Art, wie ich dachte, es funktionierte, war richtig core.a enthält core_wiring_analog.o sollte daher enthalten die definition für analogRead.
Ich ging zurück zu kompilieren src/tacho.c verwendet die Funktion analogRead und kompiliert feinen jedes mal, wenn ich versuchte (der Präprozessor nicht die Notwendigkeit sehen, sich zu beschweren über meine enthalten). Es ist die Verknüpfung, die Probleme verursacht, nehme ich an.

Gelesen habe ich eine Menge Sachen online, aber ich kann immer noch nicht scheinen, um diese Figur ein von mir selbst. Wahrscheinlich ein blöder Fehler, aber ich kann es nicht sehen. Wie kann ich dieses problem lösen?

Der Vollständigkeit halber, habe ich gelöscht mein ganzes Projekt hier: googlecode-repository für mein Projekt

InformationsquelleAutor vidbina | 2011-06-02

Schreibe einen Kommentar