Forum: Compiler & IDEs typedef und weitere Fehler


von Bastler_1 (Gast)


Lesenswert?

Moin,

ich möchte rigol-ds2000-shell.cc
von http://svn.clifford.at/handicraft/2013/rigol-ds2000-shell/ 
compilieren. Dazu wird die GNU readline library benötigt.

In Zeile 64 von rltypedefs.h steht:
typedef int rl_getc_func_t PARAMS((FILE *));


Dabei kommt es zu folgenden Fehlern:

user_1@Ubuntu-Box:~/librevisa/rigol$ make
g++    -c -o rigol-ds2000-shell.o rigol-ds2000-shell.cc
In file included from /usr/local/include/readline/readline.h:36:0,
                 from rigol-ds2000-shell.cc:22:
/usr/local/include/readline/rltypedefs.h:64:28: error: typedef 
‘rl_getc_func_t’ is initialized (use decltype instead)
/usr/local/include/readline/rltypedefs.h:64:28: error: ‘FILE’ was not 
declared in this scope
/usr/local/include/readline/rltypedefs.h:64:28: error: expected 
primary-expression before ‘)’ token
In file included from rigol-ds2000-shell.cc:22:0:
/usr/local/include/readline/readline.h:419:20: error: ‘FILE’ was not 
declared in this scope
/usr/local/include/readline/readline.h:419:20: error: expected 
primary-expression before ‘)’ token
/usr/local/include/readline/readline.h:542:8: error: ‘FILE’ does not 
name a type
/usr/local/include/readline/readline.h:543:8: error: ‘FILE’ does not 
name a type
/usr/local/include/readline/readline.h:565:8: error: ‘rl_getc_func_t’ 
does not name a type
/usr/local/include/readline/readline.h:867:3: error: ‘FILE’ does not 
name a type
/usr/local/include/readline/readline.h:868:3: error: ‘FILE’ does not 
name a type
make: *** [rigol-ds2000-shell.o] Error 1

Falscher Compiler? Falsche Einstellungen?

von Oliver (Gast)


Lesenswert?

Hm.

FILE ist ja nun etwas, was es wohl schon in der allerersten C-Version 
gab. Das wird kaum was compilerspezifisches sein.

Da fehlt halt irgendwo an der richtigen Stelle ein includiertes stdio.

Oliver

von Bastler_1 (Gast)


Lesenswert?

readline.h stand vor stdio.h. Habs geändert, Fehler bleibt.

Das hier irritert mich halt: (use decltype instead)

Jemand ne andere Idee?

von Oliver (Gast)


Lesenswert?

Eine sehr empfehlenswerte Idee ist es immer, die Fehlermeldung mal 
google vorzusetzen. Denn auch wenn man es kaum glauben mag, die 
allermeisten Fehler haben andere auch schon mal gehabt, und ausserdem 
gibts da draussen auch noch jede Menge Doku.

Die Fehlermeldung besagt, daß du da im typedef gleichzeitig eine 
Initialiserung machen möchtest, was halt nicht geht. Das ist allerdings 
im gezeigten Code nicht offensichtlich erkennbar, also solltest du dir 
mal ansschauen, was sich hinter PARAMS verbirgt.

Oliver

von (prx) A. K. (prx)


Lesenswert?

Präprozessor-Output erzeugen (-E) und nachsehen was dort drinsteht.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Bei mir kompiliert der Code, wenn ich stdio.h vor readline/readline.h
include.

Bastler_1 schrieb:
> Das hier irritert mich halt: (use decltype instead)

Das hier ist die fragliche Zeile (nach Expansion des PARAMS-makros), in
der ein Funktionstyp getypedeft wird:
1
typedef int rl_getc_func_t(FILE *);

Hier ist noch einmal die Fehlermeldung:
1
/usr/include/readline/rltypedefs.h:64:28: error: typedef ‘rl_getc_func_t’ is initialized (use decltype instead)

Wenn FILE unbekannt ist, denkt der C++-Compiler, in der Klammer stünde
eine Objektinitialisierung, die von der Syntax her ähnlich aussieht,
aber an dieser Stelle keinen Sinn hat. Er meint dann, man könne das
Problem vielleicht mit dem decltype-Operator beheben, der zu einer
Variable den zugehörigen Typ liefert. Dieser Vorschlag hilft hier aber
nicht weiter, da der Compiler das eigentliche Problem (nämlich die
fehlende Deklaration von FILE) nicht erkannt hat.

In C ist diese Fehlinterpretation als Objektinitialisierung nicht
möglich, deswegen nennt dort gleich die erste Fehlermeldung das Problem:
1
/usr/include/readline/rltypedefs.h:64:28: error: unknown type name ‘FILE’

Das ganze Problem wäre übrigens nicht entstanden, wenn die
readline-Entwickler – so wie es sich gehört – die Header-Files aller
benötigten Deklarationen (in diesem Fall also stdio.h) selber includet
hätten.

von Bastler_1 (Gast)


Lesenswert?

Autor: Oliver (Gast) schrieb:
>Eine sehr empfehlenswerte Idee ist es immer, die Fehlermeldung mal
google vorzusetzen.
Yep, hab ich gemacht - half mir aber nicht wirklich weiter. Und Yalu hat 
ja auch schön erklärt, daß in diesem Fall hinter dem typedef mehr als 
nur ein simples 'typedef unsigned char Byte' steckt.

Jedenfalls werd ich mit dem neu hinzugekommenem Wissen erstmal ein Stück 
weiterbohren.
Danke an alle Beteiigten.

von Karl H. (kbuchegg)


Lesenswert?

Was musst du da noch bohren?
Yalu hat doch schon die Lösung implizit genannt:

Hau in das bewusste include File am Anfang einen
1
#include <stdio.h>
rein und das Problem sollte weg sein.

von Bastler_1 (Gast)


Lesenswert?

>>Was musst du da noch bohren?

Autor: Bastler_1 (Gast), 09:39
>readline.h stand vor stdio.h. Habs geändert, Fehler bleibt.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wenn du dir alles aus der Nase ziehen lässt, kann man dir wohl auch
nicht helfen.

Der Fehler, dass "FILE" nicht definiert ist, muss durch Inkludieren
von <stdio.h> verschwinden.  Wenn nicht, dann reden wir über was
anderes als die Sprache C hier (und sind im falschen Forum).

Dann mach Nägel mit Köpfen, und poste ein komplettes Beispiel.

von Bastler_1 (Gast)


Lesenswert?

Asche auf mein Haupt. Ich hatte zuerst stdio.h nur im File 
rigol-ds2000-shell.cc vor readline.h gesetzt. Das hat wie erwähnt nichts 
gebracht. Nun ist stio auch in rltypedefs.h, der Fehler ist jetzt weg. 
Allerdings bekomm ich jetzt:

user_1@Ubuntu-Box:~/librevisa/rigol$ make
g++    -c -o rigol-ds2000-shell.o rigol-ds2000-shell.cc
gcc   rigol-ds2000-shell.o  -lvisa -lreadline -lstdc++ -o 
rigol-ds2000-shell
/usr/local/lib/libreadline.so: undefined reference to `PC'
/usr/local/lib/libreadline.so: undefined reference to `tgetflag'
/usr/local/lib/libreadline.so: undefined reference to `tgetent'
/usr/local/lib/libreadline.so: undefined reference to `UP'
/usr/local/lib/libreadline.so: undefined reference to `tputs'
/usr/local/lib/libreadline.so: undefined reference to `tgoto'
/usr/local/lib/libreadline.so: undefined reference to `tgetnum'
/usr/local/lib/libreadline.so: undefined reference to `BC'
/usr/local/lib/libreadline.so: undefined reference to `tgetstr'
collect2: ld returned 1 exit status
make: *** [rigol-ds2000-shell] Error 1

Hmm. Da scheint noch mehr zu fehlen.

von Sven P. (Gast)


Lesenswert?

Ich denke, da fehlt die Termcap-Bibliothek beim Linken.

von Bastler_1 (Gast)


Lesenswert?

termcap-1.3.1 hab ich installiert. Die Fehlermeldungen bleiben aber 
gleich.


cd .; /usr/bin/install -c -m 644 termcap.h /usr/local/include/termcap.h
cd .; test -z "/usr/include" || \
    /usr/bin/install -c -m 644 termcap.h /usr/include/termcap.h
cd .; for f in termcap.info*; \
  do /usr/bin/install -c -m 644 $f /usr/local/info/$f; done
root@Ubuntu-Box:/home/user_1/librevisa/Termcap/termcap-1.3.1# exit
exit
user_1@Ubuntu-Box:~/librevisa/Termcap/termcap-1.3.1$ cd ..
user_1@Ubuntu-Box:~/librevisa/Termcap$ cd ..
user_1@Ubuntu-Box:~/librevisa$ ls -l
total 2620
drwxr-xr-x 6 user_1 user_1    4096 Nov 18 20:34 librevisa-0.0.20130412
-rw------- 1 user_1 user_1  382286 Nov 18 16:57 
librevisa-0.0.20130412.tar.gz
drwxrwxr-x 6 user_1 user_1    4096 Nov 22 03:04 readline-6.2
-rw------- 1 user_1 user_1 2277926 Nov 21 21:25 readline-6.2.tar.gz
drwxrwxr-x 2 user_1 user_1    4096 Nov 22 19:09 rigol
drwxrwxr-x 3 user_1 user_1    4096 Nov 22 19:32 Termcap
user_1@Ubuntu-Box:~/librevisa$ cd rigol
user_1@Ubuntu-Box:~/librevisa/rigol$ make
gcc   rigol-ds2000-shell.o  -lvisa -lreadline -lstdc++ -o 
rigol-ds2000-shell
/usr/local/lib/libreadline.so: undefined reference to `PC'
/usr/local/lib/libreadline.so: undefined reference to `tgetflag'
/usr/local/lib/libreadline.so: undefined reference to `tgetent'
/usr/local/lib/libreadline.so: undefined reference to `UP'
/usr/local/lib/libreadline.so: undefined reference to `tputs'
/usr/local/lib/libreadline.so: undefined reference to `tgoto'
/usr/local/lib/libreadline.so: undefined reference to `tgetnum'
/usr/local/lib/libreadline.so: undefined reference to `BC'
/usr/local/lib/libreadline.so: undefined reference to `tgetstr'
collect2: ld returned 1 exit status
make: *** [rigol-ds2000-shell] Error 1
user_1@Ubuntu-Box:~/librevisa/rigol$

von Oliver S. (oliverso)


Lesenswert?

Bastler_1 schrieb:
> termcap-1.3.1 hab ich installiert. Die Fehlermeldungen bleiben aber
> gleich.
...
> gcc   rigol-ds2000-shell.o  -lvisa -lreadline -lstdc++ -o
> rigol-ds2000-shell

Installieren ist gut und schön, dazu linken wäre aber besser...

Oliver

von Bastler_1 (Gast)


Lesenswert?

Installieren ist gut und schön, dazu linken wäre aber besser...
Oha. Und wie mach ich das? Im Makefile?

von Bastler_1 (Gast)


Lesenswert?

>Installieren ist gut und schön, dazu linken wäre aber besser...

Das war der Stolperstein in die richtige Richtung!
Eine Erweiterung im Makefile der Zeile
LDLIBS += -lvisa -lreadline -lstdc++
um den Eintrag -ltermcap
brachte die Lösung. Cool.


Danke an alle Beteiligten.

von Oliver S. (oliverso)


Lesenswert?

Bastler_1 schrieb:
>  Cool.

Tja, kaum macht man's richtig, schon funktionierts...

Oliver

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.