www.mikrocontroller.net

Forum: Compiler & IDEs Linken zweier Objektdateien - 'undefined reference'


Autor: Christian S. (flinti)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
da mein Programm doch langsam etwas umfangreicher wird, wollte ich es in 
mehrere Dateien aufteilen: GCC will mich dabei nicht so recht 
unterstützen...

Die Dateien:

main.c
#include "spi.h"

int main()
{
  Test();
}

spi.h
const char *Test();

spi.c
#include "spi.h"
const char *Test()
{
  return "bla";
}

Ich verwende das Beispiel Makefile, habe nur spi.c zu SRC 
hinzugefügt, es wird auch kompiliert.

Linkeraufruf (auf mehrere Zeilen aufgeteilt...):
Linking: main.elf
avr-gcc -mmcu=atmega88 -I. -gdwarf-2 -DF_CPU=20000000UL -Os
 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall
 -Wundef -Wa,-adhlns=obj/main.o -I./include/ -std=gnu99 --combine 
-fwhole-program -Wundef -MD -MP -MF .dep/main.elf.d obj/main.o 
obj/spi.o --output main.elf -Wl,-Map=main.map,--cref    -lm

Er beschwert sich, dass Test undefiniert sei - Nun, ich habe sie doch in 
spi.c definiert? Muss ich GCC noch sagen, dass er Test exportieren soll? 
Habe schon mit avr-nm in spi.o nachgeschaut: Nichts?!
00000034 a __CCP__
0000003e a __SP_H__
0000003d a __SP_L__
0000003f a __SREG__
00000000 a __tmp_reg__
00000001 a __zero_reg__

Nun - hab ich einen entscheidenden Fehler gemacht? Bin ich blöd? XD
Ich steh vollkommen auf dem Schlauch.

MfG,
Flinti

EDIT: Etwas korrigiert hust

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt zeig uns mal bitte sämtliche Meldungen vom Compilieren,
einschließlich der Kommandozeilen -- am besten als Textdatei im
Anhang.

Wenn ich nämlich dein spi.c compiliere:
j@uriah 108% cat > foo.c
const char *Test()
{
  return "bla";
}
^D
j@uriah 109% avr-gcc -Os -c foo.c
j@uriah 110% avr-nm foo.o
00000000 T Test
00000034 a __CCP__
0000003e a __SP_H__
0000003d a __SP_L__
0000003f a __SREG__
         U __do_copy_data
00000000 a __tmp_reg__
00000001 a __zero_reg__
...dann ist da sehr wohl ein Symbol "Test" drin.

Autor: Christian S. (flinti)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier ist die Ausgabe...wenn ich avr-gcc -c spi.c Ausführe geht's 
tatsächlich...also bin ich wohl blöd oO

Hätte wohl auch etwas mehr testen sollen...

Autor: Christian S. (flinti)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So - Problem gelöst!

-fwhole-program macht wohl das Problem - Es ist wohl ungeschickt, das 
auf eine einzelne Datei anzuwenden...

Danke, dass du mich auf die Befehlszeile gebracht hast. Werd demnächst 
wohl öfter hier vorbeischauen, spätestens, wenn mir mal ein Bauteil 
abraucht :|

MfG,
Flinti :)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klar, wenn du dem Compiler für jeden einzelne Datei vorgibst, er
solle davon ausgehen, dass es sich bei dieser Datei um das gesamte
Programm handelt (-fwhole-program), dann brauchst du dich nicht
zu wundern.  Dann stellt er nämlich glücklich fest, dass die
Funktion Test() ja von keinem weiter gerufen wird und wirft sie
raus...

-fwhole-program hat nur dann Sinn, wenn man "in einem Rutsch"
alles zusammen compilieren lässt:

avr-gcc -mmcu=atmega88 -fwhole-program -Os -o main.elf main.c spi.c

(Edit: hast du zeitgleich selbst bemerkt, Pluspunkt. ;-)

Autor: Christian S. (flinti)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
War ja klar. Ich find den Fehler wieder selber :D

Trotzdem danke für deine Hilfe - man "sieht" sich.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.