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


von Khan (Gast)


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

von Oliver (Gast)


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

von Khan (Gast)


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

von Oliver (Gast)


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

von Khan (Gast)


Angehängte Dateien:

Lesenswert?

Ok mache ich,

habe noch ein weinig Ordnung(Verzeichnisstrucktur) gebracht.

von Oliver (Gast)


Lesenswert?

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

Oliver

von Khan (Gast)


Angehängte Dateien:

Lesenswert?

oh so ein miss geschick ;-) sorry.

hier das richtige Datei

von Oliver (Gast)


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

von Khan (Gast)


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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.