2016-08-26 2 views
1

Je souhaite créer une bibliothèque statique implémentant une interface TUI à l'aide de ncurses. Je suis nouveau à ce sujet et l'application de ces réponses ne fonctionne pas pour moi.Création d'une bibliothèque statique incluant ncurses

Je veux créer un lien varViewer.c dans une bibliothèque. J'utilise ce code pour compiler un fichier d'exemple.

src Compiler/example.c et src/spectateur/varViewer.c:

gcc -Wall -Wextra -Wnonnull -Isrc/viewer/ 
    -c src/example.c -o obs/example.o -lncurses 
    -fsanitize=undefined -fprofile-arcs -ftest-coverage -Winline -O2 
    gcc -Wall -Wextra -Wnonnull -Isrc/viewer/ 
    -c src/viewer/varViewer.c -o obs/viewer/varViewer.o -lncurses 
    -fsanitize=undefined -fprofile-arcs -ftest-coverage -Winline -O2 

Lier obs/example.o à bin/exemple:

gcc -o bin/example -Isrc/viewer/ 
    obs/example.o obs/viewer/varViewer.o -lncurses 
    -fsanitize=undefined -fprofile-arcs -ftest-coverage -Winline -O2 

bin/exemple fonctionne comme prévu . J'ai essayé de compiler un fichier objet approprié:

src Compiler/spectateur/varViewer.c:

gcc -Wall -Wextra -Wnonnull -Isrc/viewer/ 
    -c src/viewer/varViewer.c -o lib/objects/varViewer.o 
    -lncurses -fPIC -O2 

et le mettre dans la bibliothèque:

ar -cvr lib/libvarViewer.a lib/objects/varViewer.o 

lorsque je tente de l'utiliser dans d'autres projets, un notamment à l'aide

-L ..../src/spectateur/lib -lvarViewer

drapeaux, mais toutes les références à des fonctions que j'ai utilisé de la bibliothèque ncurses et string.h ne sont pas définies:

nm /lib/libvarViewer.a

   .... 
      U __snprintf_chk 
      U __stack_chk_fail 
      U start_color 
      U stdscr 
      U strchr 
      U strlen 
      U strncmp 
      U strncpy 
      U strnlen 
      U waddnstr 
      U wborder 
      U wclear 
      U wcolor_set 
      U wgetnstr 
      U winsdelln 
      U winsnstr 
      U wmove 
      U wrefresh 

Quelle est la bonne façon appeler ar? J'ai déjà essayé de produire une bibliothèque "fine" en utilisant l'option -T.

Répondre

0

La commande

gcc -Wall -Wextra -Wnonnull -Isrc/viewer/ 
-c src/viewer/varViewer.c -o lib/objects/varViewer.o 
-lncurses -fPIC -O2 

va simplement compiler le fichier varViewer.c et donc, ignore les bibliothèques, car il ne sera pas un lien vers un fichier exécutable final.

Par conséquent, le fichier objet varViewer.o aura des références indéfinies (U signalées dans nm comme vous l'avez montré) aux symboles non définis dans varViewer.c. Ceux-ci incluent non seulement la bibliothèque libncurses mais également la librairie régulière libc (qui fournit des symboles tels que strlen, strncpy, ...). Cependant, n'oubliez pas que libc sera automatiquement ajouté dans votre étape de liaison par le compilateur, sauf indication contraire.

Vous pourrait utiliser la commande ar x pour extraire les fichiers objets (.o) d'autres bibliothèques statiques puis utiliser à nouveau ar pour générer une nouvelle bibliothèque. Bien que ce soit possible, je ne pense pas que l'inclusion de toutes les bibliothèques dans le vôtre soit une bonne idée.Je pense qu'il est préférable de lier toutes les bibliothèques nécessaires, car cela garantit que l'application est liée à la dernière version disponible - tandis que si vous incorporez une bibliothèque dans la vôtre, alors vous conserverez cette version jusqu'à ce que vous la mettiez à jour.

+0

Merci :-) J'ai essayé de suivre votre conseil et lié à ncurses lib. Malheureusement quand j'essaye de lier contre '/ usr/lib/x86_64-linux-gnu/libncurses.a' en utilisant 'gcc -I ../ viewer/lib garbage.c -L ../viewer/lib/-lvarViewer -l : libncurses.a' Je reçois beaucoup de références indéfinies pendant que 'gcc -I ../ viewer/lib garbage.c -L ../ viewer/lib/-lvarViewer -lncurses' fonctionne. Ai-je raté quelque chose? Selon [cette question] (http://stackoverflow.com/questions/3514852/static-link-ncurses-to-program?rq=1) cela devrait fonctionner. – anpi

+0

Références indéfinies à quels symboles? – Harald

+0

J'essaie de le résumer: Dans les fonctions j'ai écrit des macros comme 'COLS, LINES, stdscr' sont indéfinies. Dans les fonctions de libncurses, certains symboles liés au terminal (tparm, SP, cur_term, ...) sont manquants: exemple: /usr/lib/gcc/x86_64-linux-gnu/5/../../. ./x86_64-linux-gnu/libncurses.a(lib_box.o): Dans la fonction 'wborder ': (.text + 0x1f): référence non définie' acs_map ' – anpi