Forum: Compiler & IDEs AVR Studio - *.elf Problem mit Funktionen


von Jürgen H. (jhaerig)


Lesenswert?

Hallo,

zur Zeit bin ich dabei eine Projekt-Arbeit im AVR Studio zum laufen zu 
bekommen.
Seither nutzte ich das Programmers-Notepad, welches bei WinAVR dabei 
war.

Als ich nun dabei war, den Code in ein AVR Studio Projekt zu übertragen, 
stieß ich überraschenderweise auf ein Problem, welches ich mir in der 
Art nicht erklären kann.

Ich hab mir zur Fehlersuche ein Beispielprojekt gebaut, welches exakt 
diesen Fehler provoziert und so ziemlich dem fehlerhaften Teil in meinem 
echt Projekt entspricht.

Der Compiler des Studio's gibt mir im Message-Fenster die Meldung aus:
1
gcc plug-in: Error: Object file not found on expected location C:\Dokumente und Einstellungen\jh\Eigene Dateien\atmega128_code_samples\main\default\main.elf

Das Build-Fenster meldet:
1
rm -rf main.o function.o  main.elf dep/* main.hex main.eep
2
Build succeeded with 0 Warnings...
3
avr-gcc.exe  -mmcu=atmega16 -Wall -gdwarf-2 -O0 -MD -MP -MT main.o -MF dep/main.o.d  -c  ../main.c
4
avr-gcc.exe  -mmcu=atmega16 -Wall -gdwarf-2 -O0 -MD -MP -MT function.o -MF dep/function.o.d  -c  ../function.c
5
avr-gcc.exe -mmcu=atmega16  main.o function.o     -o main.elf
6
function.o: In function `test':
7
../function.c:4: multiple definition of `test'
8
main.o:../function.c:4: first defined here
9
make: *** [main.elf] Error 1
10
Build succeeded with 0 Warnings...

Ich lege als Anhang das gepackte Projekt noch bei und hoffe, dass mir 
jemand einen guten Tipp geben kann, wie ich das Problem lösen kann, ohne 
alle meine Funktionen in die main.c zu packen

Vielen Dank

Edit:

Da aus irgendeinem Grund der Datei Upload nicht funktioniert poste ich 
hier den Quelltext.

main.c
1
#include "function.c"
2
#include <inttypes.h>
3
4
5
int main(void)
6
{
7
uint16_t adwert;
8
  while(1)
9
  {
10
    adwert++;          // Zähler aufaddieren
11
12
    adwert = test(adwert);    // Funktion aufrufen
13
  }
14
15
}

function.c
1
#include "header.h"
2
3
extern uint16_t test (uint16_t zahl)    // Funktion die einen 16 Bit Wert zurück gibt
4
{                      // nachdem ein 16 Bit Wert empfangen wurde
5
6
  if(zahl > 1024)              // Zähler vergleichen und bei 1025
7
    zahl=0;                // auf 0 zurück setzen.
8
9
  return zahl;
10
}

header.h
1
#include <inttypes.h>
2
3
extern uint16_t test(uint16_t);

von OliverSo (Gast)


Lesenswert?

Hinsetzen und 1000 mal schreiben (auch wenn das schreckliches Deutsch 
ist):

Du sollst keine .c-Dateien includieren.

Du hast, was völlig richtig ist, deinem Projekt main.c und function.c 
hinzugefügt. Die werden auch schön ordentlich beide einzeln compiliert, 
und danach zusammengelinkt.

Nur includierst du in der main.c die funktion.c. Damit findet der linker 
die zweimal, und ist zu Recht verwirrt.

Vermutlich gabs bei dem reinen WinAVR-Projekt kein anständiges makefile.

Oliver

von Jürgen H. (jhaerig)


Lesenswert?

Ah, Okay.... ich glaube ich hab die ganze sache bisher etwas "anders" 
verstanden.

Den Source-Code den ich bisher immer als Tutorial oder Übungsmaterial 
nutzte, band C Dateien in die Main ein, was beim kompilieren im 
Programmers-Notepad des WinAVR's auch keine Probleme machte.
Dass die C Dateien seperat kompiliert und dann zusammen gelinkt werden, 
wusste ich nicht.

Ich dachte immer, dass das Projekt komplett zusammen kompiliert wird, 
und daher alle Querverweise (also c und h Dateien) dementsprechend via 
includes zusammengebracht werden müssen.

Hab vielen Dank, ich werde deinen Vorschlag umsetzen.

... das muss man ja auch erstmal wissen! :)

von OliverSo (Gast)


Lesenswert?

>... das muss man ja auch erstmal wissen! :)

Immerhin hast du ja das AVRStudio-Projekt mit mehr als einer 
Quellcodedatei richtig angelegt. Die meisten Einsteiger scheitern schon 
daran.

Wenn du irgendwann nochmal direkt mit WinAVR und makefile arbeiten 
möchtest, nutzt du am einfachsten das Programm MFile zur Erstellung des 
makefiles. Da kann man schön per Dateiauswahldialog alle benötigten 
.c-Dateien angeben. Damit funktioniert das dann auch mit make ohne 
includieren von .c-Files.

.h-Dateien müssen im übrigen immer includiert werden, in jedem !! 
.c-File. Das geht nicht "automatisch".

Viel Erfolg
Oliver

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.