www.mikrocontroller.net

Forum: Compiler & IDEs "undefined reference to" mit Makefile


Autor: Khan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

ich fange grad mein erstes Projekt an. Allergins habe ich den bekannten 
linker Fehlermeldung "undefined reference to " bekommen.

Ausschnitt:
Linking: obj/main.elf
avr-gcc -mmcu=atmega32 -I. -gdwarf-2 -DF_CPU=8000000UL -Os 
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-en
ums -Wall -Wstrict-prototypes -Wa,-adhlns=obj/main.o  -std=gnu99 -MMD 
-MP -MF .dep/main.elf.d obj/main.o obj/uart.o obj/
TWImaster.o --output obj/main.elf -Wl,-Map=obj/main.map,--cref     -lm
obj/main.o: In function `main':
C:\work\MyRobo/main.c:22: undefined reference to `uart_init'
C:\work\MyRobo/main.c:26: undefined reference to `uart_putc'
make: *** [obj/main.elf] Error 1

obwohl ich glaube richtig zu machen, denn unter AVRstudio funktioniert 
Kompilieren und linken.
Aber mit AVRDUDE nicht.

Habe über 6Stunden für diese Sache eingesetzt, jetzt brauche ich Hilfe.
Ich vermute dass ich in Makefile was falsch mache, aber was ;-)

Grüße und dank im voraus
Khan

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn deine Source aus main.c, uart.c, und TWImaster.c bestehen, und 
diese alle im selben Verzeichnis liegen, dann sollte folgendes im 
makefile stehen:

# Target file name (without extension).
TARGET = main


# Object files directory
#     To put object files in current directory, use a dot (.), do NOT 
make
#     this an empty or blank macro!
OBJDIR = .


# List C source files here. (C dependencies are automatically 
generated.)
SRC = $(TARGET).c uart.c TWIMaster.c

Oliver

Autor: Khan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielendank, für so schnelle Antwort! ;-)

ich möchte ein OBJ Verzeichnis haben, damit ich überblich habe und 
gewisse Verzeichnisstruktur.

wie kann ich dem Makefile beibringen dass er die *.o Dateien in OBJ 
suchen soll?

grüße
Khan

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
# Object files directory
#     To put object files in current directory, use a dot (.), do NOT
make
#     this an empty or blank macro!
OBJDIR = ./obj

Wobei das alles bei dir ja zu funktionieren scheint, sonst gäbe es eine 
"file not found" - Meldung.

Der Fehler liegt woanders. Zip doch mal alle Dateien (Sourcen und 
makefile) zusammen, und stell die hier ein.

Oliver

Autor: Khan (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ok mache ich,

habe noch ein weinig Ordnung(Verzeichnisstrucktur) gebracht.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uart.c hat aber ziemlich wenig Inhalt :-) Da sind dir wohl Dateien 
durcheinandergekommen.

Oliver

Autor: Khan (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
oh so ein miss geschick ;-) sorry.

hier das richtige Datei

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Compiling C: main.c
avr-gcc -c -mmcu=atmega32 -I. -gdwarf-2 -DF_CPU=8000000UL -Os 
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall 
-Wstrict-prototypes -Wa,-adhlns=../obj/main.lst -I../inc -std=c99 -MMD 
-MP -MF .dep/main.o.d main.c -o ../obj/main.o
In file included from main.c:5:
c:/winavr-20071221/bin/../avr/include/avr/signal.h:36:2: warning: 
#warning "This header file is obsolete.  Use <avr/interrupt.h>."
main.c: In function 'main':
main.c:22: warning: implicit declaration of function 'uart_init'
main.c:26: warning: implicit declaration of function 'uart_putc'

Compiling C: uart.c
avr-gcc -c -mmcu=atmega32 -I. -gdwarf-2 -DF_CPU=8000000UL -Os 
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall 
-Wstrict-prototypes -Wa,-adhlns=../obj/uart.lst -I../inc -std=c99 -MMD 
-MP -MF .dep/uart.o.d uart.c -o ../obj/uart.o
uart.c: In function 'uart_init':
uart.c:18: warning: integer overflow in expression

Compiling C: TWImaster.c
avr-gcc -c -mmcu=atmega32 -I. -gdwarf-2 -DF_CPU=8000000UL -Os 
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall 
-Wstrict-prototypes -Wa,-adhlns=../obj/TWImaster.lst -I../inc -std=c99 
-MMD -MP -MF .dep/TWImaster.o.d TWImaster.c -o ../obj/TWImaster.o
TWImaster.c: In function 'i2c_Start':
TWImaster.c:73: warning: control reaches end of non-void function

Linking: ../obj/main.elf
avr-gcc -mmcu=atmega32 -I. -gdwarf-2 -DF_CPU=8000000UL -Os 
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall 
-Wstrict-prototypes -Wa,-adhlns=../obj/main.o -I../inc -std=c99 -MMD -MP 
-MF .dep/main.elf.d ../obj/main.o ../obj/uart.o ../obj/TWImaster.o 
--output ../obj/main.elf -Wl,-Map=../obj/main.map,--cref     -lm
../obj/main.o: In function `main':
C:\Dokumente und Einstellungen\Schulzo\Desktop\ttt/main.c:26: undefined 
reference to `uart_putc'
make.exe: *** [../obj/main.elf] Error 1

> Process Exit Code: 2
> Time Taken: 00:01

Fazit:

In uart.c fehlt immer noch uart_putc(), und uart.h ist auch leer.

Dein o.a. Fehler
>C:\work\MyRobo/main.c:22: undefined reference to `uart_init'

kommt nicht, das ist auch richtig so.

Oliver

Autor: Khan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also dass ist mir ein RIESEN Rätsel!!!
ich obwohl ich die ganze Nacht programmiert habe sind sie nicht da!
Du hast vollkommen recht!
Echt komisch! Muss wohl aus versehen in ein anderes Pfad gelandet sein!

So ein blöder Fehler!!!

Wie kann den so was passieren?

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.