"undefined reference to" mit Makefile

Gast #875273
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
Gast #875286
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
Gast #875303
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
Gast #875356
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
Gast #875435
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
Gast #875485
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren