www.mikrocontroller.net

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


Autor: Jürgen Härig (jhaerig)
Datum:

Bewertung
0 lesenswert
nicht 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:
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:
rm -rf main.o function.o  main.elf dep/* main.hex main.eep
Build succeeded with 0 Warnings...
avr-gcc.exe  -mmcu=atmega16 -Wall -gdwarf-2 -O0 -MD -MP -MT main.o -MF dep/main.o.d  -c  ../main.c
avr-gcc.exe  -mmcu=atmega16 -Wall -gdwarf-2 -O0 -MD -MP -MT function.o -MF dep/function.o.d  -c  ../function.c
avr-gcc.exe -mmcu=atmega16  main.o function.o     -o main.elf
function.o: In function `test':
../function.c:4: multiple definition of `test'
main.o:../function.c:4: first defined here
make: *** [main.elf] Error 1
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
#include "function.c"
#include <inttypes.h>


int main(void)
{
uint16_t adwert;
  while(1)
  {
    adwert++;          // Zähler aufaddieren

    adwert = test(adwert);    // Funktion aufrufen
  }

}

function.c
#include "header.h"

extern uint16_t test (uint16_t zahl)    // Funktion die einen 16 Bit Wert zurück gibt
{                      // nachdem ein 16 Bit Wert empfangen wurde

  if(zahl > 1024)              // Zähler vergleichen und bei 1025
    zahl=0;                // auf 0 zurück setzen.

  return zahl;
}

header.h
#include <inttypes.h>

extern uint16_t test(uint16_t);

Autor: OliverSo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jürgen Härig (jhaerig)
Datum:

Bewertung
0 lesenswert
nicht 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! :)

Autor: OliverSo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.