2010-08-18 15 views
7

Je vais avoir quelques problèmes reliant statiquement ncurses à un de mes programmeslien statiquement ncurses pour programmer

Voici un échantillon très simple programme:

#include<ncurses.h> 


int main(){ 

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

Quand je compile avec

gcc -static -lncurses hello_curses.c -o curses 

Je reçois ces erreurs:

/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 

Je suis un peu confus pourquoi cela ne fonctionne pas. Qu'est-ce que j'oublie ici?

+0

Utilisez-vous parce que vous -static' ' Voulez-vous que les bibliothèques C soient également liées statiquement? – Troubadour

+0

yea tout doit être lié statiquement – mdogg

+0

Possible duplicate of [Pourquoi l'ordre dans lequel les bibliothèques sont liées provoque-t-il parfois des erreurs dans GCC?] (Http://stackoverflow.com/questions/45135/why-does-the-order-in -which-libraries-are-linked-parfois-cause-errors-in-gcc) –

Répondre

24

Vous devez passer -l les options à la fin de la ligne de commande:

gcc -static hello_curses.c -o curses -lncurses 

Lorsque le compilateur rencontre -lfoo, il relie dans tous les symboles de foo qui ont été demandées par un fichier précédent. Si vous mettez -lfoo au début, aucun symbole n'a encore été demandé, donc aucun symbole n'est lié.

+0

+1: pour l'explication! – Troubadour

+0

merci! cela lui permet de compiler. Cependant quand j'essaye de l'exécuter dans mon environnement j'obtiens "Erreur ouvrant le terminal: vt102." Est-ce un problème avec libncurses n'étant pas lié correctement? – mdogg

+0

@mdogg: FWIW, ça fonctionne bien pour moi, donc je dirais que ce n'est pas la liaison statique en soi. – Troubadour

5

Edit:

Je pense que le vrai problème est que vous devez spécifier votre option -l à la fin de la commande. Je l'ai juste essayé comme tu l'avais et reproduisais ton erreur. Si je mets -l:libncurses.a à la fin de la ligne alors ça marche. Tout sans l'option -static BTW.


Je pense que ce qui se passe est que vous avez une bibliothèque dynamique pour ncurses mais vous avez utilisé l'option -static qui signifie de ne pas utiliser toutes les bibliothèques dynamiques. Je suppose que vous n'avez pas de version statique de la bibliothèque ncurses, c'est-à-dire une qui se termine par un suffixe .a. Si vous souhaitez lier avec la version statique (.a) de ncurses plutôt qu'avec la version dynamique (.so), supprimez temporairement le lien symbolique de libncurses.so afin que l'éditeur de liens récupère le fichier .a à la place. Vous pouvez également copier le fichier .a ailleurs et l'ajouter à un chemin de recherche antérieur.

Sinon, si votre éditeur de liens le prend en charge (par exemple ld), vous pouvez spécifier -l:libncurses.a au lieu de -lncurses.

+0

Merci pour la réponse troubadour. J'ai d'abord pensé que le problème était que la bibliothèque statique n'était pas installée, mais qu'elle se trouvait dans/usr/lib. Je vais essayer de l'ajouter à un chemin de recherche précédent – mdogg

+0

@mdogg: Je pense maintenant que le problème est l'endroit où l'option '-l' apparaît. La réponse de [@Gilles] (http://stackoverflow.com/questions/3514852/static-link-ncurses-to-program/3515002#3515002) est en accord. – Troubadour

+0

vous pouvez également simplement ajouter le chemin d'accès à votre archive .a sans '-l 'précédant le tout et il liera cette bibliothèque statique dans votre programme. par exemple. 'gcc hello_curses.c -o curses/chemin/vers/libncurses.a' – Wyatt8740

1

Je viens de passer quelques heures sur un processeur ARM, essayant de le faire fonctionner, car la réponse acceptée n'a pas fonctionné pour moi.

Voici mes conclusions:

Apparemment

gcc -static hello_curses.c -o curses -lncurses 

fonctionne sur un processeur x64, mais pas sur un processeur ARM.

Lorsque j'ai essayé avec la ligne ci-dessus, j'ai toujours obtenu toutes les "erreurs de référence non définies" (et beaucoup plus) de l'OP.

Vous devez également faire un lien avec libtinfo.a, et noter que la séquence est importante.
Ceci est la ligne de commande qui fonctionne correctement:

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

Si vous mélangez la séquence, il ne fonctionnera pas ...

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

undefined reference to `unctrl'

Bien sûr, cela fonctionne aussi si vous utilisez la syntaxe: lib

Cette compile

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

Cela ne compile pas

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

Oh comment j'aime gcc ...
Ce programme ne devrait jamais avoir été autorisé à obtenir leur diplôme de la maternelle

(.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