Problem mit Linker, Einbindung C-Code

#3493672
Lesenswert?

Hi,
es gelingt mir nicht, den Code aus diesem Link

http://www.mikrocontroller.net/articles/AVR_FAT32#Der_Code

einzubinden. Es werden hier drei .c-Files mitgeliefert, die ich dort
abgelegt habe, wo auch mein main.c liegt (in C:\WinAVR-20100110\sample).
Im makefile habe ich folgendes eingetragen:
1
# Target file name (without extension).
2
TARGET = main
3

4
# Object files directory
5
OBJDIR = obj
6

7
# List C source files here. (C dependencies are automatically generated.)
8
SRC = $(TARGET).c file.c fat.c mmc.c


Die Fehlermeldung lautet:

Linking: main.elf
avr-gcc -mmcu=atmega328p -I. -gdwarf-2 -DF_CPU=16000000UL -Os
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall
-Wstrict-prototypes -Wundef -Wa,-adhlns=obj/main.o  -std=gnu99 --combine
-fwhole-program -Wundef -MD -MP -MF .dep/main.elf.d obj/main.o
obj/file.o obj/fat.o obj/mmc.o --output main.elf
-Wl,-Map=main.map,--cref    -lm
obj/main.o: In function `main':
C:\WinAVR-20100110\sample/main.c:28: undefined reference to `mmc_init'
C:\WinAVR-20100110\sample/main.c:37: undefined reference to
`fat_loadFatData'
C:\WinAVR-20100110\sample/main.c:52: undefined reference to
`ffileExsists'


Die "mmc_init()" befindet sich in "mmc.c". Auch nach Kopieren des 
c-file-Inhalts in "main.c" gibt es weitere Fehlermeldungen, die mit 
nicht gefundenen Referenzen zu tun haben.


Hat jemand eine Idee? Danke im Voraus.

Roman
#3493758
Lesenswert?

@ uiipsdof
Fipptehler ja, ist aber konsistent mit dem Inhalt der c-sources.

@Rufus
Folgendes habe ich jetzt rausgefunden; hilft das weiter, Rufus?


C:\WinAVR-20100110\bin>avr-objdump -t 
C:/winavr-20100110/sample/obj/mmc.o

C:/winavr-20100110/sample/obj/mmc.o:     file format elf32-avr

SYMBOL TABLE:
00000000 l    df ABS  00000000 mmc.c
00000000 l    d  .text  00000000 .text
00000000 l    d  .data  00000000 .data
00000000 l    d  .bss   00000000 .bss
0000003f l       ABS  00000000 _SREG_
0000003e l       ABS  00000000 _SP_H_
0000003d l       ABS  00000000 _SP_L_
00000034 l       ABS  00000000 _CCP_
00000000 l       ABS  00000000 _tmp_reg_
00000001 l       ABS  00000000 _zero_reg_
00000000 l    d  .debug_abbrev  00000000 .debug_abbrev
00000000 l    d  .debug_info    00000000 .debug_info
00000000 l    d  .debug_line    00000000 .debug_line
00000000 l    d  .debug_str     00000000 .debug_str
#3493775
Lesenswert?

static sind sie offenbar nicht; exemplarische Auszüge aus mmc.c und 
file.c:

1
// **********************************************************************************************************************************
2
uint8_t mmc_init (void){
3

4
  uint8_t cmd, ty, ocr[4];
5
  uint16_t n, j;
6

7
  spi_init();
8
  mmc_disable();
9

10

11

12

13

14

15

16

17
#if (MMC_FILE_EXSISTS==TRUE)
18
// *******************************************************************************************************************************
19
// prueft ob es die datei im aktuellen verzeichnis gibt.
20
// ffopen wuerde die datei direkt anlegen, falls es sie noch nicht gibt!
21
// *******************************************************************************************************************************
22
uint8_t ffileExsists ( uint8_t name[]){
23
  return fat_loadFileDataFromDir(name);
24
}
25
#endif

Wenn natürlich MMC_FILE_EXSISTS oder TRUE nicht bekannt sind, sind die 
Funktionen gar nicht deklariert.
#3493819
Lesenswert?

Ich habe in einer der includes explizit drinstehen

#define MMC_FILE_EXSISTS  TRUE

damit muß der Compiler das doch checken? Kommt es beim referenzieren der 
includes auf die Reihenfolge an?

Oder ist an

#if (MMC_FILE_EXSISTS==TRUE)

in einem anderen file irgendwas falsch?

Gibt es irgendwelche Compileroptionen, mit denen man versehentlich 
#ifndef, #if u.s.w deàktivieren kann?
#3493882
Lesenswert?

Roman S. schrieb:
> Ich habe in einer der includes explizit drinstehen
>
> #define MMC_FILE_EXSISTS  TRUE
>
> damit muß der Compiler das doch checken? Kommt es beim referenzieren der
> includes auf die Reihenfolge an?

Ja, kommt es definitiv. Wenn du erst ein headerfile einbindest das 
MMC_FILE_EXSISTS checkt und dann das headerfile das es definiert geht 
das schief.

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