Forum: Compiler & IDEs Problem mit Linker, Einbindung C-Code


von Roman S. (kadege)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

... obj/main.o obj/file.o obj/fat.o obj/mmc.o --output main.elf

Dem Linker werden die Objektdateien mitgeteilt, insofern scheint das 
Makefile korrekt zu sein.

Nun wäre zu prüfen, welche Symbole in den Objektdateien enthalten sind.

Das müsste mit

  nm -g mmc.o

oder

  objdump -t mmc.o

funktionieren.

von Roman S. (kadege)


Lesenswert?

Hi Rufus,
danke; sind das avrdude-parameter?


Roman

von uiipsdof (Gast)


Lesenswert?

> ffileExsists

Fipptehler?

von uiipsdof (Gast)


Lesenswert?

>danke; sind das avrdude-parameter?

Ja, klar. avrdude hat ja auch was mit dem Linken zu tun....

von Roman S. (kadege)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das bedeutet, daß die von Dir erwarteten Funktionen nicht in der 
Objektdatei enthalten sind.

Könnte es sein, daß die durch bedingte Compilation entfallen sind? Oder 
könnte es sein, daß Du sie aus irgendwelchen Gründen als static 
deklariert hast?

von Roman S. (kadege)


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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Roman S. schrieb:
> Wenn natürlich MMC_FILE_EXSISTS oder TRUE nicht bekannt sind, sind die
> Funktionen gar nicht deklariert.

Das dürfte die Wurzel der Ursache, äh, des Problems sein.

von Roman S. (kadege)


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?

von Lutz H. (luhe)


Lesenswert?

Hi,

Ich hatte dass Problem, dass eine Library erst eingebunden wurde, als 
der Dateiname mit lib begann.

Gruß Lutz

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Vermutlich wird -fwhole-program nicht nur beim Linken angegeben -- wo es 
ohne LTO sinnfrei ist -- sondern auch beim Compilieren.  Dadurch sind 
dann alle Funktionen statisch und können weggeworfen werden, weil der 
Compiler nicht das ganze Programm sieht.

von Dirk K. (d-k)


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.

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.