当我按照指示将readline编译到我的目录/ mypath中时(./configure --prefix = / mypath; make; make install)我在其中得到以下未解析的符号:
ldd -r /mypath/lib/libreadline.so.6.2
linux-vdso.so.1 => (0x00007ffffb186000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f450c62f000)
/lib64/ld-linux-x86-64.so.2 (0x00007f450cc07000)
undefined symbol: UP (/mypath/lib/libreadline.so.6.2)
undefined symbol: PC (/mypath/lib/libreadline.so.6.2)
undefined symbol: BC (/mypath/lib/libreadline.so.6.2)
当我阅读readline的自述文件时,这似乎是一个功能,而不是一个错误:
`--with-curses'
This tells readline that it can find the termcap library functions
(tgetent, et al.) in the curses library, rather than a separate
termcap library. Readline uses the termcap functions, but does not
link with the termcap or curses library itself, allowing applications
which link with readline the to choose an appropriate library.
This option tells readline to link the example programs with the
curses library rather than libtermcap.
我当然尝试使用--with-curses,但这并没有改变任何东西,这并不奇怪,因为它似乎只是影响readline中某些测试程序的设置。
我的发行版(debian)有一条没有未定义符号的readline,所以很明显可以这样做。
如何创建没有未解析符号的readline库?
编辑:
我已将ncurses编译并安装到同一目录中,并且我还尝试使用CFLAGS ="来配置readline。 -Wl,-rpath = / mypath中"并且 - 启用静态,但没有成功。
答案 0 :(得分:1)
我认为这些符号是由libncurses定义的。您可以这样确认:
env LD_PRELOAD=/usr/lib/libncurses.so ldd -r /mypath/lib/libreadline.so.6.2
(我认为 ldd
在检查符号时会考虑预加载,但可能不会。)
Arch Linux使用的构建脚本是here。看起来诀窍是使用:
make SHLIB_LIBS=/mypath/libncurses.so
还对构建文件中的-rpath
选项进行了一些其他调整,因此您可能也需要这样做。
答案 1 :(得分:0)
make install
步骤是在某个目录中安装共享库,通常是/usr/local/lib/
您需要让动态加载程序ld.so(8)知道这一点。我建议将一次 /usr/local/lib/
添加到/etc/ld.so.conf
文件中,然后在每次安装新的共享库之后运行ldconfig
。请参阅ldconfig(8),ldd(1)
在将程序与您的-Wl,-rpath
libreadline.so
构建共享库时,可以将其链接到其他共享库。在我的Debian上,系统libreadline
链接到libtinfo
:
% ldd /lib/x86_64-linux-gnu/libreadline.so.6
linux-vdso.so.1 (0x00007ffffccf3000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f45cffcc000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f45cfc23000)
/lib64/ld-linux-x86-64.so.2 (0x00007f45d046c000)
您可能想要研究readline6
的{{3}},因为它包含构建过程的补丁。
BTW,我的Debian有一个libtinfo5
包(用dpkg -S /lib/x86_64-linux-gnu/libtinfo.so.5
获得)