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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich verbringe fast meinen gesamten Tag, um herauszufinden, dass ich übersehen die linker-parameter
-L. TARGET
. In meinem Fall meine Letzte Verlinkung routine endete auf der Suche etwas wie:Viel Zeit verbringen, scheinbar viele Verschwendete Stunden, aber eine wertvolle Lektion gelernt, so dass ich denke, es wurde für mich lohnen.
Detail, detail, Details...
InformationsquelleAutor vidbina
Schrieb ich dieses Makefile, ist es vielleicht von nutzen:
http://code.google.com/p/asadchev/source/browse/trunk/work/arduino/Makefile
grundsätzlich erstelle dir Struktur wie:
und versuchen machen/hochladen/etc
InformationsquelleAutor Anycorn