2009-04-30 12 views
9

estoy tratando de empezar a desarrollar un programa usando ncurses en Linux. Ni siquiera puedo obtener el ejemplo Hello World para compilar. Aquí está el código:referencia indefinida al usar ncurses en Linux

#include <curses.h> 

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

Cuando intento compilar, obtengo:

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

Para cada una de esas llamadas funciones.

He instalado ncurses a través de apt-get, y también mediante la descarga de las fuentes y la compilación, instalación, etc.

He tratado #include tanto curses.h y ncurses.h.

¿Qué está pasando?

Respuesta

12

¿Ha utilizado la opción -lcurses al vincular?

Incluyendo los archivos de encabezado permiten compilar el código (porque el compilador sabe cómo se ve la llamada a la función desde el archivo .h), pero el enlazador necesita el archivo de la biblioteca para encontrar el código real para vincular a su programa.

11

Como dijo Greg Hewgill, debe pasar -lcurses o -lncurses para vincular a la biblioteca de curses.

gcc -o hello hello.c -lncurses 

También probablemente decir a utilizar initscr() y getch(). Una vez que hago esas sustituciones, lo anterior compila para mí.

+1

¿Por qué '$ gcc -o hola -lncurses hello.c' no funciona, pero' $ gcc -o hola -lncurses' hola.c hace? – rootkea

+0

@rootkea Porque el enlazador opera en objetos en el orden en que aparecen en la línea de comando. Cuando ve 'hello' primero, recuerda todos los símbolos que necesita, y luego cuando ve la biblioteca 'ncurses', resuelve esos símbolos usando lo que encuentra. Si 'ncurses' aparece primero, ve un montón de símbolos pero dice" No los necesito "y los descarta. Consulte la [documentación] (https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html#index-l-1172) u [otras preguntas de SO] (http://stackoverflow.com/questions/45135/linker-order-gcc) para más detalles. –

4

Para cualquier persona que tenga problemas similares: argumentos -LX, donde x es la biblioteca, debe seguir siempre la fuente y los ficheros objeto.

+0

Esto definitivamente resolvió mi problema! – Richard

0

que estaba teniendo un problema similar y encontré una solución que me ayudó, pero fue un poco diferente de las otras respuestas publicadas aquí. Yo estaba tratando de usar la biblioteca de paneles con maldiciones y mi mandato de compilación era:

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

cuando leí las otras respuestas, yo estaba desconcertado porque yo estaba incluyendo la bandera -lncurses, pero todavía no estaba compilando y con errores similares a lo que estaban haciendo:

$ 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' 

finalmente encontré mi respuesta en the tldp:

"Para utilizar la biblioteca de paneles funciones, debe incluir panel.h y para vincular el programa con la biblioteca de paneles, se debe agregar el flag -lpanel junto con -lncurses en ese orden ".

¡Parece que el orden es importante cuando se utilizan los indicadores de compilación! Intenté cambiar la orden:

gcc -o hello hello.c -lpanel -lncurses 

Esto permitió que compilara correctamente. Sé que ya tienes tu respuesta, así que espero que esto ayude a alguien.