2010-08-18 35 views
7

Estoy teniendo algunos problemas de estática que une ncurses a uno de mis programasestáticamente ncurses enlace para programar

Aquí hay una muy simple programa de ejemplo:

#include<ncurses.h> 


int main(){ 

    initscr(); 
    printw("Hello world\n"); 
    refresh(); 
    getch(); 
    endwin(); 
    return 0; 
} 

Cuando compilo con

gcc -static -lncurses hello_curses.c -o curses 

consigo estos errores:

/tmp/ccwHJ6o1.o: In function `main': 
curses_hello.c:(.text+0x5): undefined reference to `initscr' 
curses_hello.c:(.text+0x14): undefined reference to `printw' 
curses_hello.c:(.text+0x1b): undefined reference to `stdscr' 
curses_hello.c:(.text+0x20): undefined reference to `wrefresh' 
curses_hello.c:(.text+0x27): undefined reference to `stdscr' 
curses_hello.c:(.text+0x2c): undefined reference to `wgetch' 
curses_hello.c:(.text+0x31): undefined reference to `endwin' 
collect2: ld returned 1 exit status 

Estoy un poco confundido por qué esto no funciona. ¿Que me estoy perdiendo aqui?

+0

¿Está utilizando '-static' porque ¿Quieres que las bibliotecas de C también estén vinculadas estáticamente? – Troubadour

+0

sí, todo tiene que estar vinculado estáticamente – mdogg

+0

Posible duplicado de [¿Por qué el orden en el que las bibliotecas están vinculadas a veces causa errores en GCC?] (Http://stackoverflow.com/questions/45135/why-does-the-order-in -qué-bibliotecas-están-vinculadas-a veces-causa-errores-en-gcc) –

Respuesta

24

lo necesario para pasar -l opciones al final de la línea de comandos:

gcc -static hello_curses.c -o curses -lncurses 

Cuando el compilador encuentra -lfoo, vincula en todos los símbolos de foo que han sido solicitadas por un archivo anterior. Si pone -lfoo al principio, aún no se ha solicitado ningún símbolo, por lo que no se vincula ningún símbolo.

+0

+1: para la explicación! – Troubadour

+0

gracias! que le permite compilar. Sin embargo, cuando intento ejecutarlo en mi entorno obtengo "Error al abrir el terminal: vt102". ¿Es esto un problema con libncurses que no está vinculado correctamente? – mdogg

+0

@mdogg: FWIW, funciona bien para mí, así que diría que no es el enlace estático per se. – Troubadour

5

Editar:

creo que el verdadero problema es que tiene que especificar su opción -l al final del comando. Simplemente lo probé de la manera en que lo tienes y reproduje tu error. Si pongo -l:libncurses.a al final de la línea, entonces funciona. Todo sin la opción -static BTW.


Creo que lo que está sucediendo es que usted tiene una biblioteca dinámica de ncurses, sino que ha usado la opción -static lo que significa que no se utilice ningún bibliotecas dinámicas. Sospecho que en realidad no tiene una versión estática de la biblioteca ncurses, es decir, una que termina con un sufijo .a.

Si desea establecer un vínculo con la versión estática (.a) de ncurses en lugar de la versión dinámica (.so), elimine temporalmente el enlace simbólico de libncurses.so para que el vinculador seleccione el archivo .a. También puede copiar el archivo .a en otro lugar y agregarlo a una ruta de búsqueda anterior.

Alternativamente, si su enlazador lo admite (por ejemplo, ld), puede especificar -l:libncurses.a en lugar de -lncurses.

+0

Gracias por el trovador de respuesta. Inicialmente pensé que el problema era que la biblioteca estática no estaba instalada, pero está en/usr/lib. Intentaré agregarlo a una ruta de búsqueda anterior – mdogg

+0

@mdogg: ahora creo que el problema es donde aparece la opción '-l'. La respuesta de [@Gilles] (http://stackoverflow.com/questions/3514852/statically-link-ncurses-to-program/3515002#3515002) está de acuerdo. – Troubadour

+0

también puede agregar la ruta a su archivo .a sin que '-l' lo preceda y vinculará esa biblioteca estática a su programa. p.ej. 'gcc hello_curses.c -o curses/path/to/libncurses.a' – Wyatt8740

1

Acabo de pasar unas horas en un procesador ARM, tratando de que funcione, ya que la respuesta aceptada no funcionó para mí.

Aquí están mis resultados:

Al parecer

gcc -static hello_curses.c -o curses -lncurses 

obras en un procesador x64, pero no en un procesador ARM.

Cuando probé con la línea anterior, todavía obtuve todos los "errores de referencia indefinidos" (y mucho más) del OP.

También necesita vincular con libtinfo.a, y tenga en cuenta que la secuencia es importante.
Esta es la línea de comandos correcta que funciona:

gcc -static hello_curses.c -o curses -lncurses -ltinfo 

Si mezcla la secuencia, entonces no va a funcionar ...

gcc -static hello_curses.c -o curses -ltinfo -lncurses 

undefined reference to `unctrl'

Por supuesto, esto también funciona si se utiliza el: sintaxis lib

Esto compila

gcc -static hello_curses.c -o curses -l:libncursesw.a -l:libtinfo.a 

Esto no compila

gcc -static hello_curses.c -o curses -l:libtinfo.a -l:libncursesw.a 

Oh, cómo me gusta gcc ...
Este programa nunca debería haber sido autorizado a graduarse de kindergarden

(.text+0x2a8): undefined reference to cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_pair': (.text+0x2ac): undefined reference to cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_pair': (.text+0x50a): undefined reference to tparm' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_pair': (.text+0x518): undefined reference to _nc_putp' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_color': (.text+0x552): undefined reference to cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_color': (.text+0x556): undefined reference to cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_color': (.text+0x5e4): undefined reference to tparm' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_color': (.text+0x5f2): undefined reference to _nc_putp' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function can_change_color': (.text+0x740): undefined reference to cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function can_change_color': (.text+0x744): undefined reference to cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function has_colors': (.text+0x768): undefined reference to cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function has_colors': (.text+0x76c): undefined reference to cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function color_content': (.text+0x7c2): undefined reference to cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o):(.text+0x7c6): more undefined references to cur_term' follow /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function _nc_do_color': (.text+0x8de): undefined reference to tparm' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function _nc_do_color': (.text+0x8e6): undefined reference to tputs' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function _nc_do_color': (.text+0x958): undefined reference to tputs' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function set_foreground_color': (.text+0x62): undefined reference to tputs' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function set_background_color': (.text+0xa2): undefined reference to tputs' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_hline.o): In function whline': (.text+0xec): undefined reference to acs_map' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_hline.o): In function whline': (.text+0xf0): undefined reference to acs_map' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_add_wch.o): In function wadd_wch': (.text+0x4fe): undefined reference to TABSIZE' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_add_wch.o): In function wadd_wch': (.text+0x502): undefined reference to TABSIZE' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_add_wch.o): In function wecho_wchar': (.text+0x6d8): undefined reference to TABSIZE' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_add_wch.o): In function wecho_wchar': (.text+0x6dc): undefined reference to TABSIZE' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_wunctrl.o): In function wunctrl': (.text+0x30): undefined reference to unctrl' collect2: error: ld returned 1 exit status