Имеется 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, наверное, тоже можно побороть.
Комментариев нет:
Отправить комментарий