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?
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
readline.h stand vor stdio.h. Habs geändert, Fehler bleibt. Das hier irritert mich halt: (use decltype instead) Jemand ne andere Idee?
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
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.
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.
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.
>>Was musst du da noch bohren? Autor: Bastler_1 (Gast), 09:39 >readline.h stand vor stdio.h. Habs geändert, Fehler bleibt.
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.
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.
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$
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
Installieren ist gut und schön, dazu linken wäre aber besser... Oha. Und wie mach ich das? Im Makefile?
>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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.