Forum: Compiler & IDEs Anfänger Problem mit dem Makefile


von Andre H. (andre01)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe da mal ein kleines Problem mit dem Makefile... Wahrscheinlich 
ist es ein tolles Anfängerproblem aber ich finde hier im Forum und im 
Netz auch nichts zur der Fehlermeldung.
Ich habe make all aus PN aufgerufen habe.
1
> "make.exe" all
2
3
-------- begin --------
4
avr-gcc (GCC) 4.2.2 (WinAVR 20071221)
5
Copyright (C) 2007 Free Software Foundation, Inc.
6
This is free software; see the source for copying conditions.  There is NO
7
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
8
9
make.exe: *** No rule to make target `main.elf', needed by `elf'.  Stop.
10
11
> Process Exit Code: 2
12
> Time Taken: 00:00

Habe oben mal das main.c und das makefile angefügt.
Das Makefile befindet sich im gleichen Verzeichnis wie das main.
Im Makefile habe ich noch versucht eine Sourcefile ( lcd.c  von P.Fleury 
) einzufügen die ich mit der lcd.h in der main includiert habe.

Kann mir vielleicht jemand sagen was ich da Falsch mache?
Habe sonst den ´51er in SDCC programmiert und versuche nun mit dem AVR 
warm zuwerden.

Gruß André

von Andre H. (andre01)


Angehängte Dateien:

Lesenswert?

Hier ist das main noch mal...

von let (Gast)


Lesenswert?

Hallo,

du hast zwar die lcd.c nicht aber die main.c im Makefile
eingetragen. Dann sollte es gehen.

von Andre H. (andre01)


Lesenswert?

Wenn ich das richtig verstanden habe muss ich die lcd.c in die makefile 
eintragen und die die lcd.h als include in die main.c. Das habe ich 
meiner Meinung nach getan.
Ich habe das noch mal versucht das ich das häkchen bei der Source File 
-Einbindung gesetzt und mal gelöscht habe. Aber hat auch nichts 
gebracht.

André

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ändere im Makefile die Zeile

SRC = ../avr/include/util/lcd.c

in die Zeile

SRC = $(TARGET).c ../avr/include/util/lcd.c

von Stefan B. (stefan) Benutzerseite


Lesenswert?

.c Dateien includiert man nicht in anderen .c Dateien. Mach deine 
Änderung wieder rückgängig. Das geänderte Makefile sorgt für das 
Übersetzen von main.c und lcd.c sowie für das Zusammenlinken zum 
main.elf

von Andre H. (andre01)


Lesenswert?

@stefanb:
ich habe das gerade mal versucht mit dem was du meintest. Aber bekomme 
immer noch die gleiche Meldung. Ist das denn vom Prinzip her richtig wie 
ich versuche die library von P.Fleury ein zubinden?
Wenn ich die lcd.c als Sourcefile rausnehme dann wird rum gemeckert über 
die lcd_ Funktionen.

André

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ich kann mir das mit der gleichen Meldung nicht erklären. Ich habe auch 
Probleme deinen Projektaufbau zu verstehen, d.h. wo befinden sich die 
lcd.c und die lcd.h von Peters Library bei dir?

Ich schlage vor, dass du zunächst dein Projekt in einen definierten 
Anfangszustand bringst.

1/ Kopiere main.c und Makefile in einen Backupordner.

2/ Erstelle ein neues main.c
1
int main(void)
2
{
3
  while(1);
4
}

3/ Ändere die SRC Zeile in Makefile so

SRC = $(TARGET).c

4/ Prüfe ob das fehlerfrei kompiliert wird. Wenn Fehler kommen, dann ein 
make clean machen und anschliessend ein make >& error.txt. Den Text 
error.txt bitte bei nächsten Fragen mit hochladen.

Nach dem erfolgreichen Kompilieren schlage ich vor, dass du in dem 
Verzeichnis in dem dein main.c steht einen Ordner lcdlibrary anlegst und 
alles von Peter Fleurys LCD-Library (insbes. lcd.c und lcd.h) dort 
hinein schreibst.

Dann änderst du main.c so
1
//----------------------------------------------------------------------
2
// Titel     : LCD Test
3
//----------------------------------------------------------------------
4
// Funktion  : LCD Test
5
// Schaltung : LCD an Port D 
6
//----------------------------------------------------------------------
7
// Prozessor : ATmega8/48/88/168
8
// Takt      : 3.6864 MHz
9
// Sprache   : C
10
// Datum     : 
11
// Version   : 
12
// Autor     : 
13
// Name des Programmes in der Makefile : main.c
14
//
15
//----------------------------------------------------------------------
16
#include <stdlib.h>          // Standardlib
17
#include <avr/io.h>          // IO Belegung Mega8
18
#include "lcdlibrary/lcd.h"  // LCD                <=========
19
#include <inttypes.h>        // Interger
20
21
//#define F_CPU 3686400        // Frequenz Quarz
22
23
int main (void) 
24
{
25
  lcd_init (LCD_DISP_ON_CURSOR_BLINK);
26
  lcd_clrscr();
27
  lcd_puts (" Hallo Du ");
28
  
29
  for(;;) {}
30
}

Und im Makefile die Zeile mit dem SRC so:

SRC = $(TARGET).c lcdlibrary/lcd.c

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ich habe das Projekt jetzt so aufgesetzt und erhalte folgende 
Fehlermeldungen:
1
-------- begin --------
2
avr-gcc (GCC) 4.2.2 (WinAVR 20071221)
3
Copyright (C) 2007 Free Software Foundation, Inc.
4
This is free software; see the source for copying conditions.  There is NO
5
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
6
7
8
Compiling C: lcdlibrary/lcd.c
9
avr-gcc -c -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./lcdlibrary/lcd.lst  -std=gnu99 -Wundef -MMD -MP -MF .dep/lcd.o.d lcdlibrary/lcd.c -o lcdlibrary/lcd.o
10
lcdlibrary/lcd.c: In function 'toggle_e':
11
lcdlibrary/lcd.c:120: error: 'PORTA' undeclared (first use in this function)
12
lcdlibrary/lcd.c:120: error: (Each undeclared identifier is reported only once
13
lcdlibrary/lcd.c:120: error: for each function it appears in.)
14
lcdlibrary/lcd.c: In function 'lcd_write':
15
lcdlibrary/lcd.c:141: error: 'PORTA' undeclared (first use in this function)
16
lcdlibrary/lcd.c: In function 'lcd_read':
17
lcdlibrary/lcd.c:222: error: 'PORTA' undeclared (first use in this function)
18
lcdlibrary/lcd.c: In function 'lcd_init':
19
lcdlibrary/lcd.c:528: error: 'PORTA' undeclared (first use in this function)
20
lcdlibrary/lcd.c:596:5: warning: "KS0073_4LINES_MODE" is not defined
21
MAKE.EXE: *** [lcdlibrary/lcd.o] Error 1

D.h. main.c wird sauber übersetzt, nur das lcd.c aus Peters Library 
nicht.

Die Fehlermeldungen sind berechtigt.

Der von dir eingestellte Atmega8 hat keinen PORTA. D.h. du müsstest in 
lcd.h die Voreinstellung der Leitungszuordnung ändern und die Leitungen 
des LCD auf einen anderen Port legen (z.B. PORTC, wenn ADC nicht 
gebraucht wird).

Die Warnung "lcdlibrary/lcd.c:596:5: warning: "KS0073_4LINES_MODE" is 
not defined" ist ebenfalls eine Einstellungssache in der lcd.h, die von 
dem LCD abhängt, das du einsetzen willst.

von Andre H. (andre01)


Lesenswert?

@stefan
Also habe das nun mal so gemacht wie du meintest.
Die erste Main nur mit der Endlosschleife wurde ohne murren Compiliert.
Die neu aufgesetzte main hat die gleichen Fehler gemacht wie zuvor.

Wo sollte man denn am besten die lcd.c und lcd.c hin kopieren?
Habe die im Winavr/avr/include/util gehabt und auch mal versucht wenn 
die im Verzeichnis sind wo die main war. Jedesmal das makefile geändert 
aber immer den gleichen Fehler

Gruß Andre

von Stefan B. (stefan) Benutzerseite


Angehängte Dateien:

Lesenswert?

Welche Fehler? Ich hatte dich gebeten, die Fehlermeldungen anzuhängen. 
Wie ich geschrieben habe erzeugt die ungeänderte LCD-Library mit 
deinem Atmega8 immer Fehler beim Kompilieren.

Ich hänge mein Testprojekt mit einer Änderung in lcd.h (PORTA => PORTC) 
an.

von Andre H. (andre01)


Lesenswert?

@ stefb:
Danke für den Anhang. Der funktioniert bei mir komischerweise.

Dieses main.c wird ohne Fehler compeliert
1
int main(void)
2
{
3
  while(1);
4
}

Dieses main.c wurde zu erst mit Fehler compiliert ( wie im ersten 
Beitrag )
Habe dann Winavr deinstalliert. Nach der Neuinstallation ging es ohne 
Fehler !?!?
1
//----------------------------------------------------------------------
2
// Titel     : LCD Test
3
//----------------------------------------------------------------------
4
// Funktion  : LCD Test
5
// Schaltung : LCD an Port D 
6
//----------------------------------------------------------------------
7
// Prozessor : ATmega8/48/88/168
8
// Takt      : 3.6864 MHz
9
// Sprache   : C
10
// Datum     : 
11
// Version   : 
12
// Autor     : 
13
// Name des Programmes in der Makefile : main.c
14
//
15
//----------------------------------------------------------------------
16
#include <stdlib.h>          // Standardlib
17
#include <avr/io.h>          // IO Belegung Mega8
18
#include "lcdlibrary/lcd.h"  // LCD                <=========
19
#include <inttypes.h>        // Interger
20
21
//#define F_CPU 3686400        // Frequenz Quarz
22
23
int main (void) 
24
{
25
  lcd_init (LCD_DISP_ON_CURSOR_BLINK);
26
  lcd_clrscr();
27
  lcd_puts (" Hallo Du ");
28
  
29
  for(;;) {}
30
}


Müssen die Librarys die man zu seinem Programm braucht in dem gleichen 
Verzeichnis oder in einem Unterverzeichnis sein in dem man auch sein 
main.c hat?

André

von Andre H. (andre01)


Lesenswert?

Herr Gott schei....

Ich glaube ich weiß woran es lag...
Mein Projektverzeichnis hieß ...\eigene Programme\..
Scheinbar darf man keine Leerzeichen in den Verzeichnisnamen haben die 
man mit WinAVR und makefile verwendet. Nachdem ich den Namen geändert 
habe ( ohne Leerzeichen) ging das Compilieren ohne Probleme.
Makefile mag wohl keine Leerzeichen...

Danke für die Hilfe

Gruß André

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Andre H. wrote:
> Müssen die Librarys die man zu seinem Programm braucht in dem gleichen
> Verzeichnis oder in einem Unterverzeichnis sein in dem man auch sein
> main.c hat?

Nein das ist nicht notwendig.

Grundsätzlich kannst du beim Include relative Pfade (lcdlibrary/lcd.h 
oder ../../irgendwo/lcd.h) angeben und auch absolute Pfade (i:\lcd.h).

Diese Pfade müssen aber in "" eingeschlossen werden. Das Einschliessen 
in <> Hängt ja den Pfad an den WiNAVR Installationspfad (bzw. dessen 
Includepfad) an.

In diesem Projekt macht es Sinn mindestens lcd.h als Kopie in der Nähe 
von main.c zu haben und nicht in dem allgemeinen Includeverzeichnis oder 
in einem gemeinsamen LCD-Library Verzeichnis für alle deine Projekte.

Du änderst ja in lcd.h die konkrete Leitungszuordnung und ggf. weiteres 
und das sollte eben beim Projekt sein/bleiben. Die Änderungen sollen ja 
nicht beim nächsten Projekt durch die dort notwendigen Änderungen alte 
Projekte zerfetzen.

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.