typedef und weitere Fehler

Gast #3413515
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?
Gast #3413529
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
Gast #3413671
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
Moderator #3413815
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.
Gast #3414455
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.
Moderator Persönliche Seite #3414557
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.
Gast #3414658
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.
Gast #3414701
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$
Gast #3414827
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren