Forum: Compiler & IDEs Fehlermeldung bei "Build" für lcd-routines.c:


von Viktor (Gast)


Lesenswert?

Hallo

Folgendes zu  Software:
Schreibe meine Programme mit AVR Studio 4.18 und verwende den C Compiler
WinAVR 20090313.
Ich habe gedacht schon Fertige Project testen.
Ich habe von 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung 
Dateien lcd-routines.h , lcd-routines.c runtergeladen.
Neues Projekt gemacht, alles einzurichten wie steht bei Beschreibung 
aber schon bei "Build" kommt Fehlermeldung; 
c:/winavr-20090313/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr51/cr 
tm128.o:(.init9+0x0):  undefined reference to `main'
make: *** [lcd-routines.elf] Error 1

Bei neues start AVR Studio nach Project Wizard/Recent projects/Load
in Fenster Message kommt ;
Loaded plugin AVR GCC
Loaded partfile: C:\Program Files\Atmel\AVR Tools\PartDescriptionFiles\
Error Code: -2147467259:

Wo liegt ein Fehler? Was habe ich falsch gemacht?
Wenn möglich, dann deutlich erzählen-wie für ein Einsteiger....

P.S. Bei anderen Projekten alles Einwanfrei funktioniren

von Klaus W. (mfgkw)


Lesenswert?

- beim Namen von main vertippt
- die Datei mit main vergessen, ins Projekt aufzunehmen
- main ganz vergessen
- main und dain verwechselt

von Michael (Gast)


Lesenswert?

Hallo Viktor,

stell doch einfach mal Dein ganzes Projekt hier rein.
Die beiden Dateien, die Du beschrieben hast, sind ja nur für die 
Ansteuerung des Displays zuständig. WAS aber geschickt wird (also welche 
Daten), dass musst Du ja noch bestimmen (und sowas läuft dann in einer 
von Dir zu erstellenden Datei, die eine main()-Funktion hat.
Also einfach die ganzen Dateien hier rein und dann schauen wir weiter.

von I. E. (anfaenger69)


Lesenswert?

Hallo Victor,

Du hast die Datei main.c vergessen. Diese steht auf der Webseite weiter 
unten mit folgendem Text:

"Ein Hauptprogramm, welches die Funktionen benutzt, sieht zb. so aus:"

#include <avr/io.h>
#include "lcd-routines.h"

int main(void)
{
    lcd_init();

    lcd_data('T');
    lcd_data('e');
    lcd_data('s');
    lcd_data('t');

    set_cursor(0,2);

    lcd_string("Hello World!");

    while(1)
    {
    }

    return 0;
}

von Viktor (Gast)


Lesenswert?

Danke.
Jetzt habe ich bemärkt, das Datei lcd-routines.c: hat kein "int 
main(void)". Bitte erklären Sie , wie beide Dateien zusammenbinden.Daten 
von
main.c in Datei lcd-routines.c "eifach" kopieren? Wo in text? Weil soll 
nur ein Datei mit *.c in ein Project sein.

von Klaus W. (mfgkw)


Lesenswert?

Vielleicht mal ein C-Buch lesen?

von Peter D. (peda)


Lesenswert?

Es ist unter C üblich, Objekte einzeln zu compilieren und danach zu 
linken.
Dazu gibt es 3 Möglichkeiten:
- ein Make zu benutzen, in dem alle benötigten C-Files angegeben werden
- eine IDE zu benutzen und die C-Files dem Build hinzufügen
- dem Compiler per Wildcard "*.c" alle Files im aktuellen Verzeichnis zu 
übergeben.

Genau ein Objekt muß das Main beinhalten.


Peter

von Klaus W. (mfgkw)


Lesenswert?

... oder 4. alles manuell angeben.
Das finde ich zumindest für den Anfang angemessen, weil man
erstens ein Gefühl dafür bekommt, was eigentlich passiert, und
es zweitens bei kleinen Programmen sinnvoll ist, und drittens
ab einer gewissen Programmgröße automatisch aufzeigt, wozu
make, IDE und Konsorten sinnvoll sein können.

Bevor man weiß, daß ein Programm main() braucht, sich schon
mit make herum zu plagen, finde ich nicht zielführend.

von I. E. (anfaenger69)


Lesenswert?

Kopier einfach das Fehlende main Zeug:

int main(void)
{
.
.
.
.
.
}

in die lcd_routines.c zwischen folgende zwei Zeilen:

"// sendet ein Datenbyte an das LCD"

und

"void lcd_data(unsigned char temp1)"


und lösche die doppellten includes heraus, falls Du sie mitkopiert hast:

#include <avr/io.h>
#include "lcd-routines.h"


Dann hat Der Compiler seinen gesuchten Einsprungspunkt, von wo das 
Programm eigentlich gestartet wird.

Es ist zwar nicht die feine Art, wie in C geschrieben wird, aber Du 
kommst schon mal zu Deinem Ziel.

In Zukunft heisst die erste Datei immer main.c und dort muss immer ein 
code

int main (void)
{
}

vorhanden sein. Dort wird beschrieben was der Prozessor alles als erstes 
macht. Alle anderen Dateien und Routinen werden dann aus dem main 
Programm aufgerufen. Lade Dir mal ein paar Beispielprojekte aus der 
Codesammlung herunter und Du wirst sehen wie die anderen Dateien 
zusammen hängen.

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.