gcc /usr/bin/ld: Fehler: kann -lncurses nicht finden
Lesezeit: 4 Minuten
Ich verwende Ubuntu 12.04 und arbeite derzeit an einem Projekt mit C, OpenGL, einer Teekanne und Eingabemethoden.
Das Problem begann, als ich mich entschied, Pfeiltasten als Eingabe zu haben. Ich habe nach den Tastencodes für Pfeiltasten gesucht, aber alle Pfeile geben 0 zurück. Ich habe nachgeschlagen, wie man das zum Laufen bringt, und ich habe conio.h gefunden. Leider ist es ein alter DOS-Header, der für Linux nicht verfügbar ist. Dann fand ich einen Ersatz namens ncurses.
Nachdem ich die erforderlichen Bibliotheken installiert hatte, indem ich die Build-Anweisungen genau befolgte, #included curses.h in meine main.c-Quelle. Als ich zum ersten Mal versuchte, mit gcc zu kompilieren, bekam ich die folgenden Fehler:
main.o:main.c:function _Key: error: undefined reference to 'stdscr'
main.o:main.c:function _Key: error: undefined reference to 'wgetch'
main.o:main.c:function _Key: error: undefined reference to 'stdscr'
main.o:main.c:function _Key: error: undefined reference to 'wgetch'
Ich habe eine Lösung gefunden, indem ich -lncurses wie folgt zum Makefile hinzugefügt habe:
Ich habe die letzten 2 Tage damit verbracht, sowohl die Ubuntu-Foren als auch StackOverFlow zu durchsuchen. Jede Hilfe wäre willkommen.
PS Ich weiß nicht, ob das wichtig ist, aber wenn ich versuche, /usr/bin/ld auszuführen, erhalte ich diesen Fehler:
ld: fatal error: no input files
apt-get install libncurses5-dev?
– Trojaner
19. Januar 2013 um 16:54 Uhr
warum müssen diese Kommentare so klein sein -_- Ich habe deinen Kommentar vorher nicht gesehen, aber das war die Lösung. Keine Ahnung warum, aber anscheinend habe ich eine Art inoffizielle Version installiert, die der Compiler nicht erkannt hat. Danke an alle!
– Jahr10
19. Januar 2013 um 18:24 Uhr
Für alle mit dem gleichen Problem wie ich: Mir fehlten die 32-Bit-Bibliotheken; Ich habe 32 Bit auf einem 64-Bit-Server kompiliert, auf dem das Paket lib32ncurses5-dev fehlte.
Auf Ubuntu habe ich einfach ausgeführt:
sudo apt-get install lib32ncurses5-dev
Ich konnte Gnureadline nicht über Pip, Python 2.7 installieren und dies löste mein Problem.
– Aufruhr
30. September 2015 um 13:20 Uhr
Zunächst einmal sollten Sie die Bibliotheken ablegen nach die Objektdatei beim Linken. Und haben sie überhaupt nicht in der Zusammenstellung der Quelldatei.
Danach müssen Sie, wenn ncurses nicht in einem Standard-Suchordner installiert ist, dem Linker mitteilen, wo es sich befindet, dies geschieht mit dem -L Befehlszeilenoption:
gcc main.o -o main -L/location/of/ncurses -lm -lGL -lGLU -lglut -lncurses
fragenmish
Versuchen Sie, die zu installieren ncurses-static Paket auch, wenn du nur das hast ncurses-devel Paket, das in Ihrem Ubuntu-Betriebssystem installiert ist.
Wenn das Ihr Problem löst und Sie die Kompilierungsanweisungen von @Joachim hinzufügen, haben Sie einen guten Start.
gcc main.o -o main -L/location/of/ncurses -lm -lGL -lGLU -lglut -lncurses
Der Linker kann Ihre gemeinsam genutzte Bibliothek nicht in seinem Suchpfad finden. Wenn Sie das Verzeichnis hinzufügen, in dem sich Ihre gemeinsam genutzte Bibliothek befindet, zur LD_LIBRARY_PATH Umgebungsvariable sollte der Linker sie finden und darauf verlinken können. In diesem Fall könntest du das weglassen -L Option zu gcc:
gcc main.o -o main -lm -lGL -lGLU -lglut -lncurses
Und es sollte gut kompilieren.
EDIT: Gut das zu wissen apt-get install libncurses5-dev behebt dein Problem.
FYI. Das LD_LIBRARY_PATH Die Umgebungsvariable enthält eine durch Doppelpunkte getrennte Liste von Pfaden, die der Linker verwendet, um Bibliotheksabhängigkeiten zur Laufzeit aufzulösen. Diese Pfade haben Vorrang vor den Standardbibliothekspfaden /lib und /usr/lib. Die Standardpfade werden weiterhin durchsucht, aber nur nach der Liste der Pfade in LD_LIBRARY_PATH ist erschöpft.
Die beste Art zu verwenden LD_LIBRARY_PATH ist, es unmittelbar vor der Ausführung des Programms auf der Befehlszeile oder im Skript festzulegen. Auf diese Weise können Sie das Neue behalten LD_LIBRARY_PATH isoliert vom Rest Ihres Systems, dh lokal für die aktuell ausgeführte Instanz der Shell.
Noch mehr Probleme :/ 1. Ich habe nur libncurses.so.5 und libncurses.so.5.9, die beide nicht erkannt werden. 2. Wo findet man die Variable LD_LIBRARY_PATH
– Jahr10
19. Januar 2013 um 17:52 Uhr
Sie möchten nicht verwenden $LD_LIBRARY_PATH; Wenn Sie nicht standardmäßige Ladepfade konfigurieren müssen, erstellen Sie eine Datei in /etc/ld.so.conf.d.
– Trojaner
19. Januar 2013 um 18:02 Uhr
Jetzt bin ich verwirrt. Ich habe mir die Dateien in /etc/ld.so.conf.d angesehen und die ncurses-Bibliotheken befinden sich in diesen Verzeichnissen: lib/i386-linux-gnu und usr/lib/i386-linux-gnu
– Jahr10
19. Januar 2013 um 18:10 Uhr
13849100cookie-checkgcc /usr/bin/ld: Fehler: kann -lncurses nicht findenyes
apt-get install libncurses5-dev
?– Trojaner
19. Januar 2013 um 16:54 Uhr
warum müssen diese Kommentare so klein sein -_- Ich habe deinen Kommentar vorher nicht gesehen, aber das war die Lösung. Keine Ahnung warum, aber anscheinend habe ich eine Art inoffizielle Version installiert, die der Compiler nicht erkannt hat. Danke an alle!
– Jahr10
19. Januar 2013 um 18:24 Uhr