编译 Readline 时对“tputs”的未定义引用

Yun*_*Liu 4 shell ubuntu compilation readline gnu-make

我想在 Ubuntu 上编译安装 readline 库。

我执行以下操作:

wget http://git.savannah.gnu.org/cgit/readline.git/snapshot/readline-8.0.tar.gz
tar -zxvf readline-8.0.tar.gz
cd readline-8.0
./configure --prefix=`pwd`/readline
make
make install
Run Code Online (Sandbox Code Playgroud)

没错,但是当我使用-lreadline选项时,出现如下错误:

readline/lib/libreadline.so: undefined reference to `tputs'
readline/lib/libreadline.so: undefined reference to `tgoto'
readline/lib/libreadline.so: undefined reference to `tgetflag'
readline/lib/libreadline.so: undefined reference to `UP'
readline/lib/libreadline.so: undefined reference to `tgetent'
readline/lib/libreadline.so: undefined reference to `tgetnum'
readline/lib/libreadline.so: undefined reference to `PC'
readline/lib/libreadline.so: undefined reference to `tgetstr'
Run Code Online (Sandbox Code Playgroud)

我想知道我做错了什么,为什么以及该怎么做?

如果你帮助我,我将不胜感激。

Ste*_*ker 6

显然,您缺少链接readline依赖的库。在我的系统上我得到

$ readelf --dynamic --symbols --wide /usr/lib64/libreadline.so.7.0 | fgrep tputs
    17: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND tputs
Run Code Online (Sandbox Code Playgroud)

ietputsreadline代码中的外部引用。

编辑:图书馆将是libtinfo

$ readelf --dynamic --symbols --wide /usr/lib64/libtinfo.so.6 | fgrep tputs
   199: 0000000000019a30   151 FUNC    GLOBAL DEFAULT   12 tputs
   245: 00000000000195f0   930 FUNC    GLOBAL DEFAULT   12 tputs_sp
Run Code Online (Sandbox Code Playgroud)

所以解决方案是使用-lreadline -ltinfo.

一般来说,我建议不要自己编译库,而是安装-dev(el)Linux 发行版提供的包。然后您可以使用 egpkg-config命令自动发现库的正确 C 标志和链接器选项。

  • 我编译安装库以避免像 [DELL_Hell](https://en.wikipedia.org/wiki/DLL_Hell),现在,我发现使用 `-lreadline -ltinfo` 或 `-lreadline -ltermcap` 或 `-lreadline - lncurses` 都可以工作,谢谢。 (2认同)