2013-01-19 12 views
25

Sono in esecuzione su Ubuntu 12.04 e attualmente sto lavorando a un progetto che coinvolge C, OpenGL, una teiera e metodi di input.gcc/usr/bin/ld: errore: impossibile trovare -lncurses

Il problema è iniziato quando ho deciso di inserire i tasti freccia. Ho controllato per vedere i codici chiave per i tasti freccia, ma tutte le frecce restituiscono 0. Ho cercato come farlo funzionare e ho trovato conio.h. Sfortunatamente, è una vecchia intestazione DOS che non è disponibile per Linux. Poi ho trovato un sostituto chiamato ncurses.

Dopo aver installato le librerie necessarie, seguendo attentamente le istruzioni di compilazione, ho incluso # curses.h nella mia fonte main.c. Quando ho provato prima a compilare con gcc, ho ottenuto i seguenti errori:

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' 

ho trovato una soluzione con l'aggiunta -lncurses al makefile in questo modo:

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 

Ma sono stato accolto da un altro errore :

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

Così come gli errori precedenti.

Ho passato gli ultimi 2 giorni a cercare sia nei forum di Ubuntu che in StackOverFlow. Qualsiasi aiuto sarebbe apprezzato.

P.S. Non so se questo è importante, ma quando si tenta di eseguire/usr/bin/ld ottengo questo errore:

ld: fatal error: no input files 
+20

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

+0

perché questi commenti devono essere così piccoli -_- Non ho visto il tuo commento prima ma quella era la soluzione. Non so perché, ma sembra che ho installato una sorta di versione non ufficiale che il compilatore non ha riconosciuto. Grazie a tutti! – Yrrej10

risposta

2

Prima di tutto, si dovrebbe mettere le librerie dopo il file oggetto durante il collegamento. E non li hanno affatto nella compilazione del file sorgente.

Dopo di che, se ncurses non è installato in una cartella di ricerca standard è necessario far notare al linker dove si trova, questo è fatto con l'opzione della riga -L di comando:

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

Provare ad installare il ncurses-static pacchetto anche, se hai solo il pacchetto ncurses-devel installato nel tuo sistema operativo Ubuntu.

Se questo risolve il tuo problema, in più se aggiungi le istruzioni di compilazione di @ Joachim, sei partito alla grande.

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

Il linker non riesce a trovare la libreria condivisa nel suo percorso di ricerca. Se si aggiunge la directory in cui la lib condivisa è alla variabile di ambiente LD_LIBRARY_PATH, il linker dovrebbe trovarla e potervi collegare. In tal caso si potrebbe omettere l'opzione -L a gcc:

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

e dovrebbe compilare bene.

MODIFICA: Buono a sapersi che apt-get install libncurses5-dev risolve il problema.

FYI. La variabile di ambiente LD_LIBRARY_PATH contiene un elenco di percorsi separati da due punti che il programma di collegamento utilizza per risolvere le dipendenze della libreria in fase di esecuzione. A questi percorsi verrà data la priorità rispetto ai percorsi di libreria standard /lib e /usr/lib.I percorsi standard saranno ancora cercati, ma solo dopo che l'elenco dei percorsi in LD_LIBRARY_PATH è stato esaurito.

Il modo migliore per utilizzare LD_LIBRARY_PATH è impostarlo sulla riga di comando o sullo script immediatamente prima dell'esecuzione del programma. In questo modo puoi mantenere il nuovo LD_LIBRARY_PATH isolato dal resto del tuo sistema, cioè locale all'istanza di shell corrente in esecuzione.

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

Altri problemi ancora:/ 1. Ho solo libncurses.so.5 e libncurses.so.5.9 entrambi non sono stati modificati 2. Dove si trova la variabile LD_LIBRARY_PATH – Yrrej10

+0

Non si desidera utilizzare $ LD_LIBRARY_PATH'; se è necessario configurare percorsi di caricamento non standard, creare un file in '/ etc/ld.so.conf.d'. – trojanfoe

+0

Ora sono confuso. Ho guardato i file in /etc/ld.so.conf.d e le librerie ncurses sono in quelle directory: lib/i386-linux-gnu e usr/lib/i386-linux-gnu – Yrrej10

39

Per tutti gli utenti con lo stesso problema: mancavano le librerie a 32 bit; Stavo compilando 32 bit su un server a 64 bit che mancava il pacchetto lib32ncurses5-dev.

Su Ubuntu ho semplicemente corse:

sudo apt-get install lib32ncurses5-dev 
+7

Non ho potuto installare gnureadline via pip, python 2.7 e questo ha risolto il mio problema. – rioted

Problemi correlati