www.mikrocontroller.net

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


Autor: Andre H. (andre01)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.
> "make.exe" all

-------- begin --------
avr-gcc (GCC) 4.2.2 (WinAVR 20071221)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

make.exe: *** No rule to make target `main.elf', needed by `elf'.  Stop.

> Process Exit Code: 2
> 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é

Autor: Andre H. (andre01)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier ist das main noch mal...

Autor: let (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Autor: Andre H. (andre01)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ändere im Makefile die Zeile

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

in die Zeile

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: Andre H. (andre01)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

int main(void)
{
  while(1);
}


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

//----------------------------------------------------------------------
// Titel     : LCD Test
//----------------------------------------------------------------------
// Funktion  : LCD Test
// Schaltung : LCD an Port D 
//----------------------------------------------------------------------
// Prozessor : ATmega8/48/88/168
// Takt      : 3.6864 MHz
// Sprache   : C
// Datum     : 
// Version   : 
// Autor     : 
// Name des Programmes in der Makefile : main.c
//
//----------------------------------------------------------------------
#include <stdlib.h>          // Standardlib
#include <avr/io.h>          // IO Belegung Mega8
#include "lcdlibrary/lcd.h"  // LCD                <=========
#include <inttypes.h>        // Interger

//#define F_CPU 3686400        // Frequenz Quarz

int main (void) 
{
  lcd_init (LCD_DISP_ON_CURSOR_BLINK);
  lcd_clrscr();
  lcd_puts (" Hallo Du ");
  
  for(;;) {}
}

Und im Makefile die Zeile mit dem SRC so:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe das Projekt jetzt so aufgesetzt und erhalte folgende 
Fehlermeldungen:

-------- begin --------
avr-gcc (GCC) 4.2.2 (WinAVR 20071221)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Compiling C: lcdlibrary/lcd.c
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
lcdlibrary/lcd.c: In function 'toggle_e':
lcdlibrary/lcd.c:120: error: 'PORTA' undeclared (first use in this function)
lcdlibrary/lcd.c:120: error: (Each undeclared identifier is reported only once
lcdlibrary/lcd.c:120: error: for each function it appears in.)
lcdlibrary/lcd.c: In function 'lcd_write':
lcdlibrary/lcd.c:141: error: 'PORTA' undeclared (first use in this function)
lcdlibrary/lcd.c: In function 'lcd_read':
lcdlibrary/lcd.c:222: error: 'PORTA' undeclared (first use in this function)
lcdlibrary/lcd.c: In function 'lcd_init':
lcdlibrary/lcd.c:528: error: 'PORTA' undeclared (first use in this function)
lcdlibrary/lcd.c:596:5: warning: "KS0073_4LINES_MODE" is not defined
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.

Autor: Andre H. (andre01)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:
Angehängte Dateien:

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

Autor: Andre H. (andre01)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ stefb:
Danke für den Anhang. Der funktioniert bei mir komischerweise.

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

Dieses main.c wurde zu erst mit Fehler compiliert ( wie im ersten 
Beitrag )
Habe dann Winavr deinstalliert. Nach der Neuinstallation ging es ohne 
Fehler !?!?
//----------------------------------------------------------------------
// Titel     : LCD Test
//----------------------------------------------------------------------
// Funktion  : LCD Test
// Schaltung : LCD an Port D 
//----------------------------------------------------------------------
// Prozessor : ATmega8/48/88/168
// Takt      : 3.6864 MHz
// Sprache   : C
// Datum     : 
// Version   : 
// Autor     : 
// Name des Programmes in der Makefile : main.c
//
//----------------------------------------------------------------------
#include <stdlib.h>          // Standardlib
#include <avr/io.h>          // IO Belegung Mega8
#include "lcdlibrary/lcd.h"  // LCD                <=========
#include <inttypes.h>        // Interger

//#define F_CPU 3686400        // Frequenz Quarz

int main (void) 
{
  lcd_init (LCD_DISP_ON_CURSOR_BLINK);
  lcd_clrscr();
  lcd_puts (" Hallo Du ");
  
  for(;;) {}
}


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é

Autor: Andre H. (andre01)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

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.