Forum: Mikrocontroller und Digitale Elektronik undefined reference to


von Markus W. (kornbanane)


Lesenswert?

Hallo Leute,

ist mir ja fast schon peinlich wieder so ein Thread mit undefined 
reference to xxx aufzumachen, aber ich seh vor lauter Bäumen den Wald 
nicht mehr :(

Also ich verwende WinAvr (Programmers Notepad), um meinen Atmega16 zu 
programmieren. Hab mir jetzt ein völlig neues Projekt angelegt mit 
folgenden Dateien:

main.c
main.h
uart.c
uart.h
defines.h

Wie zu erkennen ist, gibt es zu jeder *.c Datei eines *.h Datei (außer 
bei defines.h)

Das sieht nun so aus (wie gesagt noch total Leer)

main.c
1
#include <main.h>        // Headerdatei von main.c
2
3
int main(void){
4
5
/////////////////////////
6
/////////////////////////
7
/////////////////////////
8
/// Initialisierungen der Ports
9
10
DDRA = 0x00;        // Port A als Eingang
11
PORTA = 0xFF;        // interne Pull-ups für Port A aktivieren
12
13
DDRB = 0x00;        // Port A als Eingang
14
PORTB = 0xFF;        // interne Pull-ups für Port A aktivieren
15
16
DDRC = 0x00;        // Port A als Eingang
17
PORTC = 0xFF;        // interne Pull-ups für Port A aktivieren
18
19
DDRD = 0xFF;         // Gesamter Port C als Ausgang
20
PORTD = 0xFF;         // Port C auf 1 setzten, damit LED's an sind 
21
22
Inituart();          // Die UART Schnittstelle initialisieren
23
24
  while (1)
25
  {
26
27
  }
28
}

main.h
1
#ifndef DEF_main_H
2
 #define DEF_main_H
3
4
#include <defines.h>
5
6
/ Main Funktion
7
int main(void);
8
9
// Initialisiert die UART Schnittstelle
10
void Inituart(void);
11
12
#endif

uart.c
1
#include <uart.h>        // Headerdatei von uart.c
2
3
//---------------------------------------------------------------------------
4
// InitUART
5
//
6
// functiondescription:  Initialisiert die UART Schnittstelle
7
//
8
// hand over:
9
//  - input parameters: nothing
10
// returns:
11
//  - return parameter: nothing
12
//---------------------------------------------------------------------------
13
14
15
void Inituart(void)
16
{
17
  UCSRB=0x6C;          // 8N1, RX und TX Enable, RX und TX Interrupt
18
  UCSRC=0x86;          // 8N1; Asynchron; kein Paritätsbit  
19
  UBRRH = 0;          // Für 9600Baud@16Khz
20
  UBRRL = 103;        // Für 9600Baud@16Khz
21
}

uart.h
1
#ifndef DEF_uart_H
2
 #define DEF_uart_H
3
4
#include <defines.h>
5
6
// Initialisiert die UART Schnittstelle
7
void Inituart(void);
8
9
#endif

und defines.h
1
#ifndef DEF_defines_H
2
 #define DEF_defines_H
3
4
#include <avr/io.h>        // Zugriff auf die I/O's des Controllers
5
6
#endif

Die Datein sind auch alle in dem Projekt in Programmers Notepad 
eingebunden, aber jetzt bekomme ich doch tatsächlich die Fehlermeldung 
"/main.c:62: undefined reference to `Inituart'"

Ich weiß was die Meldung bedeuten soll, deshalb versteh ich hier echt 
nicht wo das Problem liegt ?

Danke schon mal

von Peter II (Gast)


Lesenswert?

mit welchen Objekten wird denn der Linker aufgerufen?

Poste mal alle build Ausgaben.

von Lötlackl *. (pappnase) Benutzerseite


Lesenswert?

Markus Wi*** schrieb:
> // Initialisiert die UART Schnittstelle
> void Inituart(void);

Das steht einmal in der main.h (ohne Auswirkung) und einmal in der 
uart.h
Wenn Du in der main.c folgendes ergänzt
1
#include <uart.h>
sollte es klappen.

von Peter II (Gast)


Lesenswert?

** Lötlackl schrieb:
> Wenn Du in der main.c folgendes ergänzt#include <uart.h>sollte es
> klappen.

nein, weil bei ihm eine Fehlermeldung vom Linker kommt und nicht vom 
Compiler.

von Markus W. (kornbanane)


Lesenswert?

Jetzt wo du es mit den Objekten sagst ist es mir auch aufgefallen ..

hier der Build Log
1
   
2
3
avr-gcc (WinAVR 20100110) 4.3.3
4
Copyright (C) 2008 Free Software Foundation, Inc.
5
This is free software; see the source for copying conditions.  There is NO
6
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
7
8
9
Linking: main.elf
10
avr-gcc -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.o  -std=gnu99 -MMD -MP -MF .dep/main.elf.d main.o --output main.elf -Wl,-Map=main.map,--cref     -lm
11
main.o: In function `main':
12
e:\dropbox\elektronik\avr\c_programme\rncontroll_spielerrei/main.c:62: undefined reference to `Inituart'
13
make.exe: *** [main.elf] Error 1
14
15
> Process Exit Code: 2
16
> Time Taken: 00:00

Klar, das er die Funktion nicht kennt, wenn er die uart.o nicht 
generiert ...

Aber wieso macht er es nicht, weil die uart.c ist doch auch in dem 
Projekt eingebunden. Muss ich jetzt etwar beim Makefile jede *.c Datei 
unter $Target= xxx angeben ? Wohl eher weniger ? Oder hat es was mit 
einer Art Buildreihenfolge der c Datein zu tun ? Weiß aber nicht wie ich 
diese verändern kann ...

von Peter II (Gast)


Lesenswert?

Markus Wi*** schrieb:
> Aber wieso macht er es nicht, weil die uart.c ist doch auch in dem
> Projekt eingebunden.

erzeugt denn deine IDE ein makefile, wenn ja sollte sie es 
reinschreiben, wenn nein musst du es machen. Dann spielt die Einstellung 
in einem projekt keine rolle.

 Muss ich jetzt etwar beim Makefile jede *.c Datei
> unter $Target= xxx angeben ? Wohl eher weniger ?
es muss dort drin stehe, die frage ist nur wer es reinschreibt.

> Oder hat es was mit
> einer Art Buildreihenfolge der c Datein zu tun ? Weiß aber nicht wie ich
> diese verändern kann ...
nein bestimmt nicht.

von Paul (Gast)


Lesenswert?

** Lötlackl schrieb:
> #include <uart.h>

lieber

#include "uart.h"

von Markus W. (kornbanane)


Lesenswert?

So jetzt gehts endlich, wie Peter II schon gesagt hat lags am Makefile.

Mit
1
  SRC = $(TARGET).c uart.c
 geht es :)

Kann man nicht im Makefile festlegen das alle *.c Dateien die im 
gleichen Ordner wie die Makefile liegen einbezogen werden ?

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.