typedef und weitere Fehler

Gast #3413515
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
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
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
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
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
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
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
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
>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

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.