2013-01-19 13 views
25

Używam Ubuntu 12.04 i obecnie pracuję nad projektem obejmującym C, OpenGL, czajniczek i metody wprowadzania.gcc/usr/bin/ld: błąd: nie można znaleźć -lncurses

Problem zaczął się, gdy zdecydowałem się użyć klawiszy strzałek jako danych wejściowych. Sprawdziłem, aby zobaczyć kluczowe kody klawiszy strzałek, ale wszystkie strzałki zwracają 0. Sprawdziłem, jak uruchomić to i znalazłem conio.h. Niestety jest to stary nagłówek DOS, który nie jest dostępny dla systemu Linux. Potem znalazłem substytut o nazwie ncurses.

Po zainstalowaniu niezbędnych bibliotek, dokładnie postępując zgodnie z instrukcjami kompilacji, I #included curses.h w moim źródle main.c. Kiedy po raz pierwszy próbował skompilować za pomocą gcc, mam następujące błędy:

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' 

znalazłem poprawkę dodając -lncurses do makefile tak:

SOURCES=main.c 

main: main.o 
    gcc -lm -lGL -lGLU -lglut -lncurses main.o -o main 

main.o: main.c 
    gcc -lm -lGL -lGLU -lglut -c main.c 

Ale byłem witany przez innego błędu :

/usr/bin/ld: error: cannot find -lncurses 

Tak jak poprzednie błędy.

Ostatnie 2 dni spędziłem na przeszukiwaniu zarówno forów Ubuntu, jak i StackOverFlow. Każda pomoc będzie doceniona.

P.S. Nie wiem, czy to ważne, ale gdy próbuję uruchomić/usr/bin/ld otrzymuję ten błąd:

ld: fatal error: no input files 
+20

'apt-get install libncurses5-dev'? – trojanfoe

+0

dlaczego te komentarze muszą być tak małe -_- Nie widziałem Twojego komentarza wcześniej, ale to była poprawka. Nie wiem dlaczego, ale wydaje mi się, że zainstalowałem coś w rodzaju nieoficjalnej wersji, której kompilator nie rozpoznał. Dziękuję wszystkim! – Yrrej10

Odpowiedz

2

Po pierwsze, należy umieścić bibliotek po plik obiektowy podczas łączenia. I nie ma ich wcale w kompilacji pliku źródłowego.

Po tym, jeśli ncurses nie jest zainstalowany w standardowym folderze wyszukiwania trzeba zwrócić uwagę na łącznik, gdzie jest, to odbywa się z linii poleceń opcji -L:

gcc main.o -o main -L/location/of/ncurses -lm -lGL -lGLU -lglut -lncurses 
1

Spróbuj instalowania ncurses-static również, jeśli w systemie Ubuntu masz zainstalowany tylko pakiet ncurses-devel.

Jeśli to rozwiąże problem, a także, jeśli dodasz instrukcje kompilacji @ Joachim, rozpoczniesz dobry początek.

gcc main.o -o main -L/location/of/ncurses -lm -lGL -lGLU -lglut -lncurses 

Łącznik nie może znaleźć Twojej udostępnionej biblioteki w swojej ścieżce wyszukiwania. Jeśli dodasz katalog, w którym twoja udostępniona biblioteka jest do zmiennej środowiskowej LD_LIBRARY_PATH, linker powinien ją znaleźć i mieć możliwość połączenia z nią. W takim przypadku można pominąć opcję -L do gcc:

gcc main.o -o main -lm -lGL -lGLU -lglut -lncurses 

I powinien skompilować grzywny.

EDYCJA: Dobrze wiedzieć, że apt-get install libncurses5-dev rozwiązuje problem.

FYI. Zmienna środowiskowa LD_LIBRARY_PATH zawiera listę ścieżek rozdzielanych dwukropkami używanych przez linker do rozwiązywania zależności bibliotek w czasie wykonywania. Ścieżki te będą miały priorytet nad standardowymi ścieżkami biblioteki /lib i /usr/lib.Ścieżki standardowe będą nadal wyszukiwane, ale dopiero po wyczerpaniu listy ścieżek w LD_LIBRARY_PATH.

Najlepszym sposobem użycia LD_LIBRARY_PATH jest ustawienie go w wierszu polecenia lub skrypcie bezpośrednio przed wykonaniem programu. W ten sposób możesz utrzymać nowy LD_LIBRARY_PATH odizolowany od reszty systemu, tj. Lokalny, do bieżącej działającej instancji powłoki.

$ export LD_LIBRARY_PATH="/path/to/libncurses/library/directory/:$LD_LIBRARY_PATH" 
$ gcc main.o -o main -lm -lGL -lGLU -lglut -lncurses 
+0

Jeszcze więcej problemów:/ 1. Mam tylko libncurses.so.5 i libncurses.so.5.9, z których oba nie są reconginowane 2. Gdzie można znaleźć zmienną LD_LIBRARY_PATH – Yrrej10

+0

Nie chcesz używać '$ LD_LIBRARY_PATH'; jeśli potrzebujesz skonfigurować niestandardowe ścieżki ładujące, utwórz plik w katalogu '/ etc/ld.so.conf.d'. – trojanfoe

+0

Teraz jestem zdezorientowany. Spojrzałem na pliki w /etc/ld.so.conf.d, a biblioteki ncurses znajdują się w tych katalogach: lib/i386-linux-gnu i usr/lib/i386-linux-gnu – Yrrej10

39

Dla każdego z tym samym problemem miałem: brakowało 32-bitowych bibliotek; Kompilowałem 32-bitową wersję na serwerze 64-bitowym, w którym brakowało pakietu lib32ncurses5-dev.

Na Ubuntu po prostu zabrakło:

sudo apt-get install lib32ncurses5-dev 
+7

Nie mogłem zainstalować gnureadline przez pip, python 2.7 i to rozwiązało mój problem. – rioted

Powiązane problemy