2009-04-30 9 views
9

Sto provando a iniziare a sviluppare un programma utilizzando ncurses su Linux. Non riesco nemmeno a compilare l'esempio di Hello World. Ecco il codice:Riferimento non definito quando si utilizzano ncurses su linux

#include <curses.h> 

int main() 
{   
     initscr(); 
     printw("Hello, world."); 
     refresh(); 
     getch(); 
     endwin(); 
     return 0; 
} 

Quando tento di compilare, ottengo:

hello.c:(.text+0x12): undefined reference to `initscr' 

Per ognuna di quelle funzioni chiamate.

ho installato ncurses tramite apt-get, e anche scaricando i sorgenti e la compilazione, l'installazione, ecc

Ho provato #include sia curses.h e ncurses.h.

Che cosa sta succedendo?

risposta

12

Avete utilizzato l'opzione -lcurses durante il collegamento?

L'inclusione dei file di intestazione consente di compilare il codice (poiché il compilatore sa come appare la chiamata di funzione dal file .h), ma il linker necessita del file di libreria per trovare il codice effettivo da collegare al programma.

11

Come ha affermato Greg Hewgill, è necessario passare in -lcurses o -lncurses per collegarsi alla libreria curses.

gcc -o hello hello.c -lncurses 

È inoltre probabilmente intendi utilizzare initscr() e getch(). Una volta apportate queste sostituzioni, le compilazioni di cui sopra sono per me.

+1

Perché '$ gcc -lncurses -o ciao ciao.c' non funziona ma' $ gcc -o ciao ciao.c -lncurses' fa? – rootkea

+0

@rootkea Poiché il linker opera sugli oggetti nell'ordine in cui compaiono nella riga di comando. Quando vede 'ciao' prima, ricorda tutti i simboli di cui ha bisogno, e poi quando vede la libreria' ncurses', risolve quei simboli usando ciò che trova. Se "ncurses" viene prima, vede un mucchio di simboli ma dice "Non ho bisogno di nessuno di quelli" e li scarto. Vedi la [documentazione] (https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html#index-l-1172) o [altre missioni SO] (http://stackoverflow.com/questions/45135/linker-order-gcc) per i dettagli. –

4

Per chiunque abbia problemi simili: -lx argomenti, dove x è la tua libreria, devono sempre seguire i file sorgente e oggetto.

+0

Questo risolve definitivamente il mio problema! – Richard

0

Avevo un problema simile e ho trovato una soluzione che mi ha aiutato, ma era leggermente diversa dalle altre risposte pubblicate qui. Stavo cercando di utilizzare la libreria pannelli con bestemmie e il mio comando di compilazione è stato:

$ gcc -o hello hello.c -lncurses -lpanel 

quando ho letto le altre risposte, ero sconcertato perché mi ero tra cui la bandiera -lncurses, ma ancora non stava compilando , e con errori di simile a quello che si stavano diventando:

$ gcc -o hello hello.c -lncurses -lpanel 
/usr/lib/gcc/i686-linux-gnu/4.7/../../../../lib/libpanel.a(p_new.o): In function `new_panel': 
p_new.c:(.text+0x18): undefined reference to `_nc_panelhook' 

ho finalmente trovato la mia risposta in the tldp:

"da usare biblioteca pannelli funzioni, devi includere panel.h e collegare il programma con la libreria dei pannelli, il flag -lpanel dovrebbe essere aggiunto insieme a -lncurses in questo ordine. "

Quindi, sembra che l'ordine sia importante quando si usano le bandiere di compilazione! Ho provato a cambiare l'ordine:

gcc -o hello hello.c -lpanel -lncurses 

Ciò ha permesso di compilare correttamente. So che hai già la tua risposta, quindi spero che questo aiuti qualcuno.