error: undefined reference to wgetch
-
Hallo
ich versuche mit getch von der tastatur einzulesen und habe die lncurses library installiert und verlinkt. ich bekomme aber trotzdem immer einen fehler und finde auch in anderen forenbeiträgen keine passende antwort dazu
deswegen hoffe ich dass mir einer helfen kann speziell bei meinem code:#include "ros/ros.h" #include "std_msgs/String.h" #include "signal.h" //necessary for the Custom SIGINT handler #include "stdio.h" //necessary for the Custom SIGINT handler #include "sstream" #include "iostream" #include <brics_actuator/JointVelocities.h> //#include <cob_srvs/Trigger.h> //#include <ros/node_handle.h> #include <curses.h> class talker { private: //! The node handle we'll be using ros::NodeHandle _n; public: //! ROS node initialization talker(ros::NodeHandle nh) { // nh_ = nh; //set up the publisher for the cmd_vel topic chatter_pub = nh.advertise<brics_actuator::JointVelocities>("/arm_controller/command_vel", 10); } //! Loop forever while sending drive commands based on keyboard input bool driveKeyboard() { std::cout << "Type a command and then press enter. \n" "First select an Axis: x, y or z \n" "Then use '+' to go in positive direction\n" "And the '-' to go in negative direction. (example: x-)\n" "Type 's' to stop and '.' to exit.\n"; bool esc = false; while(_n.ok() && esc == false) { //--------------------------------------------------------------------------------------------- //TATI try to read without enter SetVelZero(); char c,d; /* use system call to make terminal send all keystrokes directly to stdin */ // system ("/bin/stty raw"); // puts ("Enter text. Include a dot ('.') in a sentence to exit:"); do { // c = getchar(); c = getch(); if(c == '.') { esc = true; // ROS_INFO("true"); } if(c =='x') //Set velocity for X-axis { SetVelZero(); std::cout << "X-AXIS\n"; d = getchar(); if(d == '+') { std::cout << "forwards\n"; msg.velocities[0].value = 10; } else if(d =='-') { msg.velocities[0].value = -10; std::cout << "backwards\n"; } else{continue;} chatter_pub.publish(msg); }
-
Hallo,
handelt es sich um einen Kompilierfehler, um einen Linkerfehler oder um einen Laufzeitfehler?Ups, Titel nicht gelesen, peinlich...
-
täddes schrieb:
error: undefined reference to wgetch
Als Linkerfehler wäre das ganz typisch, wenn die lib eben nicht zu Deinem Programm dazugelinkt werden würde.
täddes schrieb:
ich versuche mit getch von der tastatur einzulesen und habe die lncurses library installiert und verlinkt.
Wie haste eingestellt, daß diese lib zu Deinem Programm gelinkt wird?
-
Ich hab mal so eine Verständnisfrage: Was ist der Unterschied zu cin.get()? Das erscheint mit irgendwie einfacher und ist in der stdlib.
-
hardware schrieb:
Ich hab mal so eine Verständnisfrage: Was ist der Unterschied zu cin.get()? Das erscheint mit irgendwie einfacher und ist in der stdlib.
Sehr große Unterschiede. Hast du mal die Doku gelesen?
wgetch arbeitet auf einer Tastatur, nicht auf stdin. wgetch zielt auf ein "Fenster". wgetch hat einen nicht-blockierenden Modus. wgetch hat ein optionales(!) echo. wgetch auf Wunsch entweder das getippte Zeichen oder die gedrückten Tasten.
Besonders der erste Punkt ist der entscheidende Unterschied, der Rest ist mehr oder weniger Konsequenz daraus. wgetch ist eben die Tastenabfrage einer Konsolenbibliothek, cin.get() ist ein Zeichenextraktor auf einem abstrakten Zeichenstrom (im Fall von cin ist das stdin). Standard-C++ kennt keine Tastaturen, Fenster, Konsolen, und so weiter. Standard-C++ läuft in einem schwarzen Kasten wo ein Laufband mit Zeichen drauf reingeht und zwei bedruckte Bänder wieder rausgehen. Entsprechend beschränkt (und portabel!) sind die Möglichkeiten.
-
Also vielen Dank erstmal, die Frage ist mir grad auch aufgekommen weil in vielen Forenbeiträgen steht man soll es doch einfach mit cin machen. Aber für miene Zwecke liege ich mit getch schon richtig?
Ich habe die library mit
gcc -static my_publisher.cpp -o curses -lncurses
nochmal verlinkt, weil ich mir nicht mehr sicher war. Jedenfalls bekomme ich immer noch den gleichen fehler
..?stimmt was mit der verlinkung nicht?
-
täddes schrieb:
Also vielen Dank erstmal, die Frage ist mir grad auch aufgekommen weil in vielen Forenbeiträgen steht man soll es doch einfach mit cin machen. Aber für miene Zwecke liege ich mit getch schon richtig?
Ich habe die library mit
gcc -static my_publisher.cpp -o curses -lncurses
nochmal verlinkt, weil ich mir nicht mehr sicher war. Jedenfalls bekomme ich jetzt nur den Fehler:
getch() was not declared in this scope
..?Das klingt danach, als hättest Du zwischenzeitlich zum Testen in der my_publisher.cpp das
#include <curses.h>auskommentiert.
-
täddes schrieb:
in vielen Forenbeiträgen steht man soll es doch einfach mit cin machen. Aber für miene Zwecke liege ich mit getch schon richtig?
Ja, denke schon. Mit cin würdest Du nur was geschickt bekommen, wenn der User enter drückt.
Scheint mir nicht zu
schleife{ if(d == '+') { std::cout << "forwards\n"; msg.velocities[0].value = 10; }zu passen.
-
täddes schrieb:
Ich habe die library mit
gcc -static my_publisher.cpp -o curses -lncurses
nochmal verlinkt, weil ich mir nicht mehr sicher war. Jedenfalls bekomme ich immer noch den gleichen fehler
..?stimmt was mit der verlinkung nicht?
Jetzt kanns nicht gehen, weil Du cout benutzt und nur gcc statt g++.
Falls es weiter nicht klappt, schreib bei der Farge bitte nochmal zusammen einen möglichst kleinen testfähigen Code, den Compileraufruf und die Fehlermeldung.
Bei mir wäre das:
Datei my_publisher.cpp#include <curses.h> #include <iostream> using namespace std; int main(){ for(;;){ int x=getch(); if(x!=-1) cout<<x<<' '<<flush; } }Aufruf:
g++ -static my_publisher.cpp -o curses -l cursesFehlermeldung:
/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.3/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lcurses collect2: error: ld returned 1 exit status
-
Also gut, habe die library wie folgt verlinkt:
g++ -static my_publisher.cpp -o curses -l cursesDer Code in Kurzzusammenfassung sieht so aus:
#include "iostream" #include <curses.h> char c,d; c = getch();Das ist der ganze Zauber.
Und er gibt mir immer noch undefined reference
-
Warum eigentlich static? Liegt denn ncurses als static-library vor?
-
Hast du 32/64 Bit vermischt?
Hilftg++ -m32 -static my_publisher.cpp -o curses -l cursesWas liefert
nm <Lib mit Pfadname> | grep wgetch
-
Hey sorry
ich bin ganz frisch mit linux ://
ich hab keine Ahnung wo die library hin installiert wurde. wie finde ich das heraus?
-
g++ -static my_publisher.cpp -o curses -l curses -Wl,--verbosesollte dir auch eine Übersicht über die Libs ausspucken.
Wenn du allerdings glaubst, auf dir gestellte Fragen nicht weiter eingehen zu müssen, wirst du wohl keine weitere Hilfe bekommen.
-
SeppJ schrieb:
hardware schrieb:
Ich hab mal so eine Verständnisfrage: Was ist der Unterschied zu cin.get()? Das erscheint mit irgendwie einfacher und ist in der stdlib.
Sehr große Unterschiede. Hast du mal die Doku gelesen?
wgetch arbeitet auf einer Tastatur, nicht auf stdin. wgetch zielt auf ein "Fenster". wgetch hat einen nicht-blockierenden Modus. wgetch hat ein optionales(!) echo. wgetch auf Wunsch entweder das getippte Zeichen oder die gedrückten Tasten.
Besonders der erste Punkt ist der entscheidende Unterschied, der Rest ist mehr oder weniger Konsequenz daraus. wgetch ist eben die Tastenabfrage einer Konsolenbibliothek, cin.get() ist ein Zeichenextraktor auf einem abstrakten Zeichenstrom (im Fall von cin ist das stdin). Standard-C++ kennt keine Tastaturen, Fenster, Konsolen, und so weiter. Standard-C++ läuft in einem schwarzen Kasten wo ein Laufband mit Zeichen drauf reingeht und zwei bedruckte Bänder wieder rausgehen. Entsprechend beschränkt (und portabel!) sind die Möglichkeiten.
Vielen Dank für deine sehr ausführliche Erklärung, mir vieles klarer geworden.
-
manni66 schrieb:
Was liefert
nm <Lib mit Pfadname> | grep wgetchtut mir leid ich hab vergessen drauf zu antworten.
das liefert: bash: Syntaxfehler beim unerwarteten Wort »|«ich wurde jetzt an einen neuen pc gesetzt und habe dort direkt
g++ -m32 -static my_publisher.cpp -o curses -l cursesins terminal eingegeben und ich bekomme aber
/usr/include/features.h:324:26: schwerwiegender Fehler: bits/predefs.h: Datei oder Verzeichnis nicht gefunden Kompilierung beendet.manni66 schrieb:
g++ -static my_publisher.cpp -o curses -l curses -Wl,--verbosesollte dir auch eine Übersicht über die Libs ausspucken.
die übersicht über die libs ist für terminal neulinge echt nicht so leicht zu analysieren aber ich hab zumindest nichts von libncurses gefunden.
vielen dank für die antworten auch wenn es vielleicht noch nicht gelöst ist, hoffe ich dass der ein oder andere noch nicht aufgibt

-
Oder weiss jemand ein ähnliches Problem das im Forum besprochen wurde?
Ich komme alleine nicht weiter und habe auch nichts passendes im forum gefunden.
Danke ((:
-
Was erwartest du denn hier noch?
- Warum du static verwendest hast du nicht beantwortet.
- Das nm kopierst du ohne Sinn und Verstand einfach in die Konsole, ohne den Pfad anzugeben und wunderst dich über die Fehlermeldung der Bash.
- Bei der Suche nach der Lib fühlst du dich als Neuling überfordert.Zaubern kann hier keiner.
-
Was liefert
nm <Lib mit Pfadname> | grep wgetchAH! wenn ich
|weggelassen habe aht es funtioniert und es stand dran:
nm: 'wgetch': No such filehilft das weiter?
-
täddes schrieb:
Was liefert
nm <Lib mit Pfadname> | grep wgetchAH! wenn ich
|weggelassen habe aht es funtioniert und es stand dran:
nm: 'wgetch': No such filehilft das weiter?
Nein, das ist einfach nur Unsinn.
Da mit wir ganz sicher auf einer Linie sind: Du hast nicht wirklich wortwörtlich "<Lib mit Pfadname>" geschrieben, sondern da schon den Namen und Pfad der Bibliothek eingesetzt (ohne die <>!)?