2016-08-26 5 views
1

Я хочу создать статическую библиотеку, реализующую интерфейс TUI с использованием ncurses. Я новичок в этой теме, и применение этих ответов не сработало для меня.Создать статическую библиотеку, включая ncurses

Я хочу связать varViewer.c в библиотеке. Я использую этот код для компиляции файла примера.

Компиляция SRC/example.c и Src/зрителя/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 

Связывание набл/example.o бен/например:

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

бен/пример работает, как ожидалось , Я попытался составить подходящий файл объекта:

Компиляция SRC/зритель/varViewer.c:

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

и поместить его в библиотеку:

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

, когда я пытаюсь использовать его в других проекты, включить его с помощью

-L ..../SRC/зритель/Библиотека -lvarViewer

флаги, но все ссылки на функции, которые я использовал из библиотеки Ncurses и string.h не определены:

нм /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 

Что такое правильный путь вызвать ar? Я уже пытался создать «тонкую» библиотеку с использованием опции -T.

ответ

0

Команда

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

просто скомпилировать файл varViewer.c и, таким образом, будет игнорировать библиотеки, потому что не будет ссылаться на окончательный исполняемый файл.

Следовательно, в объектном файле varViewer.o будут указаны неопределенные ссылки (U, указанные в nm, как вы уже указали) на символы, не определенные в varViewer.c. Они включают не только библиотеку libncurses, но и обычную библиотеку libc (которая содержит такие символы, как strlen, strncpy, ...). Однако помните, что libc будет автоматически добавлен в ваш этап ссылки компилятором, если вы явно не укажете иное.

Вы могли использовать команду ar x для извлечения объектных файлов (.o) из других статических библиотек, а затем использовать ar снова, чтобы создать новую библиотеку. Хотя это возможно, я не думаю, что включение всех ваших библиотек в вашу идею - хорошая идея.Я думаю, что лучше связать все библиотеки, потому что это гарантирует, что приложение связано с последней доступной версией, а если вы вставляете одну библиотеку в свою, то будете придерживаться этой версии, пока не обновите ее.

+0

Спасибо :-) Я попытался следовать вашему совету и связался с ncurses lib. К сожалению, когда я пытаюсь ссылаться на '/ usr/lib/x86_64-linux-gnu/libncurses.a', используя' gcc -I ../ viewer/lib garbage.c -L ../ viewer/lib/-lvarViewer -l : libncurses.a' Я получаю много неопределенных ссылок, а 'gcc -I ../ viewer/lib garbage.c -L ../ viewer/lib/-lvarViewer -lncurses' работает. Я что-то упустил? Согласно [этому вопросу] (http://stackoverflow.com/questions/3514852/statically-link-ncurses-to-program?rq=1) это должно работать. – anpi

+0

Неопределенные ссылки на какие символы? – Harald

+0

Я пытаюсь его суммировать: В функциях, которые я написал макросы, такие как 'COLS, LINES, stdscr', не определены. В функциях из libncurses отсутствуют некоторые связанные с терминалом символы (tparm, SP, cur_term, ...): пример: /usr/lib/gcc/x86_64-linux-gnu/5/../../. ./x86_64-linux-gnu/libncurses.a(lib_box.o): В функции 'wborder ': (.text + 0x1f): неопределенная ссылка' acs_map ' – anpi

Смежные вопросы