Forum: Mikrocontroller und Digitale Elektronik Probleme beim Compilieren von C-Programm


von Chekker (Gast)


Lesenswert?

Hallo,

ich habe ein Problem. Und zwar möchte ich den Code dieser Seite nutzen:
http://www.daniel-papenfuss.de/2013/02/projektvorstellung-raspberry-pi-wecker-wip-schritt-1-2/

(Bau eines Weckers mit RaspberryPi). Ich habe den Aufbau 1:1 übernommen, 
alles richtig Angeschlossen. Dann unter Raspbian mit "nano" auf dem 
Desktop eine display.c-Datei erstellt, und den oben verlinkten Code 
reinkopiert. Nun möchte ich diese Datei noch Kompilieren:

- gcc -v -o display display.c

aber hier kommen auch schon die ersten Fehler:

root@Dieter-RaspberryPi ~/Desktop $ gcc -o display display.c
display.c: In function âmainâ:
display.c:25:18: error: âampâ undeclared (first use in this function)
display.c:25:18: note: each undeclared identifier is reported only once 
for each function it appears in
display.c:25:21: error: expected â)â before â;â token

Woran kann das liegen und was habe ich Falsch gemacht ? Ist eines meiner 
ersten C-Projekte.

MFG

von Peter II (Gast)


Lesenswert?

Chekker schrieb:
> Woran kann das liegen und was habe ich Falsch gemacht ? Ist eines meiner
> ersten C-Projekte.

du hast scheinbar UTF8 aus dem Netz kopiert. Das geht bei C aber nicht. 
Kopiere den Inhalt vorher in einen einfache Textdatei (Notepad) und dann 
erst zu dem Linux.

von Chekker (Gast)


Lesenswert?

Abend,

auch das vorherige Kopieren in eine Textdatei hat leider nichts 
gebracht. (Hätte ich mir auch denken können, da ich den Code per Hand 
abgeschrieben hatte!) Es kommt immer noch die Selbe Fehlermeldung..

von Peter II (Gast)


Lesenswert?

wie groß ist bei dir die Datei? Sie müsste 932byte sein.

von Thomas M. (thomil)


Lesenswert?

Entweder das was Peter gesagt hat, oder deine Fehlermeldung verwendet 
anstatt von Hochkomma das Zeichen â.

Egal was es ist, vergiss diesen Code. Wenn du gerade C lernst, verwende 
ihn nicht um davon irgendwas zu lernen.

Begründung:

- Der Code hat Strichpunkte hinter die #include Anweißung. Die gehören 
da nicht hin.

- Die maximale Länge der 'Uhrzeit' und 'Datum' arrays wird der Funktion 
strftime() mit 100 übergeben. In wirklichkeit sind beide arrays nur 80 
byte groß. Buffer overflow gefahr(zumindest prinzipiell, in diesem fall 
wird der String vermutlich nie länger als 80 Zeichen).

- sleep(0.25); sleep bekommt als parameter einen unsigned int, also eine 
ganz Zahl. Hier würde also 0.25 zu der Ganzzahl 0 gekürzt werden.

- Das '&' über das der Compiler hier stolpert soll nur ein '&' sein.

Das fällt mir so beim schnellern drüberschaun auf, vermutlich hat der 
Code noch mehr Probleme.

von Georg G. (df2au)


Lesenswert?

ein ";" zwischen Parametern im Funktionsaufruf ist ungewöhnlich. Ich 
hätte dort ein "," erwartet. Und die Definition von "amp" sehe ich auch 
nicht. Man könnte meinen, der Compiler hat recht mit seinen Meckereien.

Html und Text gemischt?

von Dauergast (Gast)


Lesenswert?

ptr = localtime(&TestZeit);

von Chekker (Gast)


Lesenswert?

Und wie behebe ich die Fehler?

Die "Strichpunkte" habe ich schon von alleine Entfernt, denn wenn die 
hinter der Include stehen, bekomme ich noch Fehler, die für jede 
include-"zeile" zutreffen.

Die größe der Datei beträgt "880 Bytes".

Es geht in diesem Projekt nicht vorrangig darum C zu lernen (fänd ich 
aber später ganz Interessant, vielleich im Winter ;-)) sonder meinem 
RaspberryPi eine nützliche funktion zuzuweisen, indem er meinen Defekten 
Wecker ablöst. Schade ist halt nur das das Programm nicht funktioniert, 
da der Hardwareaufbau schon Fertig ist..

von Chekker (Gast)


Lesenswert?

Nachdem ich das &amp (amp) entfernt habe, bekomme ich nur noch folgende 
Fehler:

display.c: In function âmainâ:
display.c:26:18: error: expected expression before â;â token

von Chekker (Gast)


Lesenswert?

Habe den Fehler gefunden,

es war ein überflüssiges "Semilikon" (";").

Nun kompiliert er ein paar Sekunden (Denke ich) und dann kommt folgende 
Ausgabe:

pi@Dieter-RaspberryPi ~/Desktop $ gcc -o display display.c
/tmp/ccKjoV0x.o: In function `main':
display.c:(.text+0xc): undefined reference to `wiringPiSetup'
display.c:(.text+0x94): undefined reference to `lcdInit'
display.c:(.text+0xf8): undefined reference to `lcdPosition'
display.c:(.text+0x108): undefined reference to `lcdPuts'
display.c:(.text+0x118): undefined reference to `lcdPosition'
display.c:(.text+0x128): undefined reference to `lcdPuts'
display.c:(.text+0x134): undefined reference to `pinMode'


Was genau soll mir das denn jetzt Sagen?

MFG

von Chekker (Gast)


Lesenswert?

Ich habe leider eine Zeile der Fehlermeldung übersehen:


collect2: ld returned 1 exit status


die hing noch ganz unten dran.

Leider komme ich ohne eure Hilfe absolut nicht mehr weiter..

von Marcel B. (marcel_b)


Lesenswert?

Du musst die wiringPi Lib hinzulinken. Sofern du die Lib installiert 
hast, übergebe deinem gcc einfach noch "-lwiringPi" und es sollte 
laufen!

von chekker (Gast)


Lesenswert?

Moin Marcel,

WiringPi ist installiert, damit steuerte ich immer die Ports. Wenn ich 
die Lib mit übergebe, (-> gcc -o display display.c -lwiringPi) dann 
entfallen wenigstens schoneinmal ein paar der Fehlermeldungen.

Nun kommen nur noch folgende:

pi@Dieter-RaspberryPi ~/Desktop $ gcc -o display display.c -lwiringPi
/tmp/ccqY4bmq.o: In function `main':
display.c:(.text+0x94): undefined reference to `lcdInit'
display.c:(.text+0xf8): undefined reference to `lcdPosition'
display.c:(.text+0x108): undefined reference to `lcdPuts'
display.c:(.text+0x118): undefined reference to `lcdPosition'
display.c:(.text+0x128): undefined reference to `lcdPuts'
collect2: ld returned 1 exit status


Bekommen wir die mit eurer Hilfe auch noch weg?

MFG

von Yalu X. (yalu) (Moderator)


Lesenswert?

Die LCD-Funktionen sollten eigentlich in der wiringPi-Bibliothek 
enthalten sein. Du kannst im Verzeichnis /usr/lib oder /lib (oder wo 
immer die Bibliothek) installiert ist, mit
1
nm libwiringPi.a

oder
1
nm -D libwiringPi.so

eine Liste der Symbole ausgeben, die in der Bibliothek definiert sind. 
Da sollten u.a. wiringPiSetup und lcdInit aufgelistet werden. Ist 
wiringPiSetup vorhanden, nicht aber lcdInit, dann ist aus 
irgendeinem Grund die Bibliothek unvollständig.

von chekker (Gast)


Lesenswert?

Mir ist gerade beim versuch die Bibliothek sicherheitshalber neu 
zuinstallieren folgendes am ende nachdem Build von WiringPi aufgefallen:

NOTE: This is wiringPi v2, and if you need to use the lcd, Piface,
  Gertboard, MaxDetext, etc. routines then you must change your
  compile scripts to add -lwiringPiDev

Hat denn das was damit zutun, denn schließlich möchte ich ja ein lcd 
nutzen..

von EGS_TI (Gast)


Lesenswert?

Ohne mich jetzt mit dem Raspberry Pi auszukennen würde ich vermuten, 
dass du "-lwiringPiDev" noch zusätzlich an gcc übergeben musst.

von Yalu X. (yalu) (Moderator)


Lesenswert?

EGS_TI schrieb:
> Ohne mich jetzt mit dem Raspberry Pi auszukennen würde ich vermuten,
> dass du "-lwiringPiDev" noch zusätzlich an gcc übergeben musst.

Ja, die Bibliothek scheint in der Version 2 zweigeteilt zu sein. Also 
beim Linken einfach beide angeben.

von chekker (Gast)


Lesenswert?

Hallo,

ich habe das Programm jetzt kompiliert, Fehlerfrei dank eurer Hilfe.

Wenn ich es jetzt ausführen möchte mit:

./display

dann passiert nichts mehr, also die Konsole sprint in die nächste Zeile, 
aber der Name und Pfad (pi@raspberry usw) kommt nicht mehr, d.H. die 
Zeile blibt leer und auf Befehle wird nicht mehr Reagiert. Auf dem 
Display wird auch noch nichts angezeigt.

Was ist denn jetzt schon wieder Falsch?

von Peter II (Gast)


Lesenswert?

chekker schrieb:
> Was ist denn jetzt schon wieder Falsch?

nichts, das Programm hat doch eine Entlosschleife. Das dauert also 
ziemlich lange bis es sich beendet.

von Chekker (Gast)


Lesenswert?

Hallo,

Das mit der Endlosschleife habe ich soweit verstanden, stand wohl 
irgendwie gerade auf dem Schlauch..

Nun ist es ja aber so das auf dem Display einfach nichts angezeigt wird, 
obwohl richtig verdrahtet, Kontrast richtig eingestellt und Display 
(eigentlich) Funktionsfähig.

Und der Code sollte soweit ich das beurteilen kann ja auch 
funktionieren..

von Peter D. (peda)


Lesenswert?

Chekker schrieb:
> Und der Code sollte soweit ich das beurteilen kann ja auch
> funktionieren..

Kannst Du ihn denn beurteilen?
Ich hab den Eindruck, Dein "soweit" bedeutet eigentlich "sokurz".
Du machst zuviele Baustellen gleichzeitig auf.

Vielleicht solltest Du doch erst mit ner Blink-LED anfangen.

von Chekker (Gast)


Lesenswert?

Hab ich schon. Mein einziges Problem ist, dass keine Uhrzeit+Datum auf 
dem Display erscheint, obwohl Aufbau und Software exakt wie vorgegeben 
ist.

Aber so läuft dass immer. Bei 20.000.000 Leuten geht's, und bei mir 
wieder nicht.

von Karl H. (kbuchegg)


Lesenswert?

Chekker schrieb:
> Hab ich schon. Mein einziges Problem ist, dass keine Uhrzeit+Datum auf
> dem Display erscheint, obwohl Aufbau und Software exakt wie vorgegeben
> ist.

Tja. Aber irgendwas ist eben anders. Sonst würde es funktionieren.

Genau deswegen sind mir die kleinen AVR lieber. Da gibt es kein 
Betriebssystem mit dem ich mich erst mal herumschlagen muss.

von Peter II (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Tja. Aber irgendwas ist eben anders. Sonst würde es funktionieren.
>
> Genau deswegen sind mir die kleinen AVR lieber. Da gibt es kein
> Betriebssystem mit dem ich mich erst mal herumschlagen muss.

ich glaube nicht das es am BS oder der Raspi liegt. Wenn das Programm 
compiliert und auch startet dann wird es auch das machen was es soll.

Prüfe mal lieber die Anschlüsse zum LCD.

von Peter II (Gast)


Lesenswert?

Nachtrag:

Es gibt 2 Versionen vom RasPi. Da hat sich auch etwas bei den 
IO-Connector geändert - schau mal ob du das beachten musst.

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.