Страницы

Поиск по вопросам

пятница, 30 ноября 2018 г.

GNU Readline, статическое подключение к Qt

Имеется Qt Creator с собранным Qt с флагом -static. Библиотеки qt успешно вшиваются в программу, а вот readline (GNU Readline) никак не желает. Каким образом надо настроить .pro - файл, чтобы readline вшилась в программу?
ОС: Ubuntu 14.xx. Файл libreadline.a в системе есть.
P.S.: проект с открытым исходным кодом будет, так что про GNU в курсе.


Ответ

Сразу предупреждаю, на ответ не тянет, но в комментарий не поместится.
Собрал тест с readline (но без QT -)).
В самом деле
gcc -o t-r t-readline.c -static -lreadline
выдает предупреждения для некоторых функций libc (связанных с аутентификацией) и ошибки на отсутствие функций tgetent, tputs, tgetflag и т.п., вызываемых из функций библиотеки readline
Понятно, что я не задал линкеру какую-то библиотеку (или несколько).
Узнать, какие библиотеки нужны помогает утилита ldd (print shared object dependencies).
Итак, собираем shared версию
gcc -o t-r t-readline.c -lreadline
и запускаем ldd
avp@avp-ubu1:hashcode$ ldd -v ./t-r linux-vdso.so.1 => (0x00007ffeb73e5000) libreadline.so.6 => /lib/x86_64-linux-gnu/libreadline.so.6 (0x00007fb39dd17000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb39d94d000) libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fb39d724000) /lib64/ld-linux-x86-64.so.2 (0x00007fb39df5d000)
Version information: ./t-r: libc.so.6 (GLIBC_2.7) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6 /lib/x86_64-linux-gnu/libreadline.so.6: libtinfo.so.5 (NCURSES_TINFO_5.0.19991023) => /lib/x86_64-linux-gnu/libtinfo.so.5 libc.so.6 (GLIBC_2.11) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.15) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6 /lib/x86_64-linux-gnu/libc.so.6: ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2 ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2 /lib/x86_64-linux-gnu/libtinfo.so.5: libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.16) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
Из полученного вывода делаем предположение, что скорее всего нам нужна libtinfo
Пробуем
avp@avp-ubu1:hashcode$ gcc -o t-r t-readline.c -static -lreadline -ltinfo /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libreadline.a(complete.o): In function `rl_username_completion_function': (.text+0x3f69): warning: Using 'getpwent' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libreadline.a(tilde.o): In function `tilde_expand_word': (.text+0x1c4): warning: Using 'getpwnam' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libreadline.a(shell.o): In function `sh_get_home_dir': (.text+0xf9): warning: Using 'getpwuid' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libreadline.a(complete.o): In function `rl_username_completion_function': (.text+0x3f5f): warning: Using 'setpwent' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libreadline.a(complete.o): In function `rl_username_completion_function': (.text+0x4009): warning: Using 'endpwent' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking avp@avp-ubu1:hashcode$
смотрим результат
avp@avp-ubu1:hashcode$ file t-r t-r: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=e0ee17d4201c7070bf650e9ac2bac441f6628a51, not stripped avp@avp-ubu1:hashcode$
потом слегка "тестируем"
avp@avp-ubu1:hashcode$ ./t-r > djjdjj line: djjdjj > kdkk dkkdkk dk line: kdkk dkkdkk dk > kdkk dkkm 49949 dkk dk line: kdkk dkkm 49949 dkk dk > End avp@avp-ubu1:hashcode$
и видим, что затея удалась.
P.S. Warnings, наверное, тоже можно побороть.

Комментариев нет:

Отправить комментарий