PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehler beim compilieren !??!



m&m
24.03.2007, 12:21
Hallo Leute,
um ein LCD anzusteuern habe ich mir die Libary von Peter Fleuy geholt. Sein Beispielprogramm kann ich ohne Probleme compilieren.

Nun benutze ich das Beispielprogramm von:

https://www.roboternetz.de/wissen/index.php/LCD-Modul_am_AVR

AVR-GCC Programm
Das Programm zur Ansteuerung des Displays im 4-Bit I/O Mode. Verwendet wird die lcdlibrary von Peter Fleury.




#include <stdlib.h>
#include <avr/io.h>
#include "lcd.h"

int main(void)
{

/* Initialisiere Display, Cursor aus */
lcd_init(LCD_DISP_ON);

/* loesche das LCD Display und Cursor auf 1 Zeile, 1 Spalte */
lcd_clrscr();

/* String auf Display anzeigen */
lcd_puts("Hello world.");
}


Ich erzeuge mir das passende makefile, kopiere alle includes in den Ordner von main.c dann versuche ich zu kompilieren. (make all)

Da tut sich dann der Fehler auf:


> "make.exe" all

-------- begin --------
avr-gcc (GCC) 4.1.1 (WinAVR 20070122)
Copyright (C) 2006 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.


Linking: main.elf
avr-gcc -mmcu=atmega128 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.o -std=gnu99 -Wundef -MMD -MP -MF .dep/main.elf.d main.o --output main.elf -Wl,-Map=main.map,--cref -lm
main.o: In function `main':
C:\Dokumente und Einstellungen\Marius\Desktop\RTCaC-Projekt\Code\LCD_Test_1/main.c:28: undefined reference to `lcd_init'
C:\Dokumente und Einstellungen\Marius\Desktop\RTCaC-Projekt\Code\LCD_Test_1/main.c:33: undefined reference to `lcd_clrscr'
C:\Dokumente und Einstellungen\Marius\Desktop\RTCaC-Projekt\Code\LCD_Test_1/main.c:36: undefined reference to `lcd_puts'
make.exe: *** [main.elf] Error 1

> Process Exit Code: 2

Selbst wenn ich #include "lcd.h" und die andern includes weglasse und den code in die main.c hineinkopiere ändert das nichts.

Was kann ich machen? Wo liegt der Fehler?

Warum schreibt man eigentlich hier #include "lcd.h" und nicht #include <lcd.h>?

Ich hoffe auf eure Hilfe!

Vielen dank .....

m&m

SIGINT
24.03.2007, 12:35
Hi M&M,
wenn ich das richig sehe, dann linkst du ja garnicht die LIB dazu. Dann kann der Linker ja nicht die Symbole finden... die befinden sich ja in der Fleury LIB.
Du musst die LIB seperat Übersetzen (nicht linken, also "-c") und das Object-File dann zu deinem Programm linken.

#inlcude "irgendwas" bedeutet, daß der Präprozessor die Datei im aktuellen Verzeichniss suchen soll.
Bei #include<irgendwas> wird zuerst in den standard Include-Path gesucht.

Gruß,
SIGINT

m&amp;m
24.03.2007, 12:54
Hi SIGINT,
danke erstmal für die Antwort. :-)

Ich bin noch nicht so fest in der Materie ... wie genau übersetzte ich die LIB? Was meinst du mit "-c"?

Gruß
m&m

AlKI
24.03.2007, 13:33
Hi M&M,
also ich bin zwar auch noch n fast-noob auf dem Bereich programmieren, aber ich glaub, er meint sowas:



//sämtliche header


#define loadlib

void lib_laden();
void lib_schliessen();

HINSTANCE hLib;
inpfuncPtr inp32; // das
oupfuncPtr oup32; //und das ist ein Befehl, der mit der inpout32.dll
//deklariert (sagt man das so?) wird (halt da drin steht, was der compiler
//damit anfangen soll)

void lib_laden ()
{
hLib = LoadLibrary("inpout32.dll");
inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32");
oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32");
if (hLib == NULL || inp32 == NULL || oup32 == NULL) { cout << " Fehler beim Laden von inpout32.dll " << '\n'; }/*** ERROR ***/
}

// auch alles nur n beispiel für inpout32.dll, des if{hlib ==....} hat zur
//funktion, das n error ausgegeben wird

int main()
{
//hauptprogramm

return0 //oder ähnliches
}

//evtl definitionen von Booleschen ausdrücken/...


void lib_schliessen()
{
FreeLibrary(hLib);
}


EDIT: achso, ja, ging ja um nen AVR-Controller, bei dem geht sowas leider net.......... schade

SIGINT
24.03.2007, 14:25
@AlKI:
Nein, das ist nur bei DLLs unter Windows einsetzbar...
hier geht es um eine LCD-Library für einen AVR Controller.

@m&m:
Ich übersetze meine Programme immer "von Hand", da ich mich noch nicht wirklich mit makefiles auskenne. Aber ich Glaube es reicht, wenn du im Makefile bei SRC noch lcd.c einträgst.
Dann sollte sowas da stehen:


SRC=lcd.c main.c


Gruß,
SIGINT

P.S.: Die Header-Dateien (*.h) dienen nur dazu dem Compiler alle Funktionen und Datentypen bekannt zu machen, bevor der eigentliche Programmtext übersetzt wird. Du müsstest also zusätzlich zur Headerdatei noch die eigentliche Implementierung (die *.c-Datei) der LCD-Lib in deinen Quelltext kopieren, damit du das Programm übersetzen kannst. Das ist aber nicht unproblematisch und zudem bei größeren Projekten sehr unpraktisch.

m&amp;m
24.03.2007, 17:33
@SIGINT:

alter schwede! :-) das war es! vielen dank!

@AIKI:

auch dir danke für die bemühungen! Hoffe, ich kann auch irgendwann euch mal aus der Patsche helfen! :-)

Ein schönes Wochenende euch und Prost! :-)

Greez
m&m

SIGINT
24.03.2007, 18:22
Gleichfalls ein schönes Wochenende....

Gruß,
SIGINT

AlKI
24.03.2007, 18:28
N'aaaaaaaabnd
Ich schließe mich an, schön, dass es funktioniert, auch wenn ich wohl keine große Hilfe war.........