【问题标题】:How do I properly reference the GNU readline library to scan terminal input?如何正确引用 GNU readline 库来扫描终端输入?
【发布时间】:2010-09-23 23:06:45
【问题描述】:

我正在尝试编译在 GNU readline 中利用以下内容的 C 代码。

#include <readline/readline.h>;
#include <readline/history.h>;

我尝试将 更改为 "" 并使用和不使用 -lreadline 选项。似乎没有任何效果。在 gcc 下不使用 -lreadline 进行编译时,编译时会生成以下内容(详细):

Reading specs from /software/gcc-3.4.6-0/pkg/lib/gcc/i386-unknown-freebsd6.1/3.4.6/specs
Configured with: ../gcc-3.4.6/configure --prefix=/software/gcc-3.4.6-0/pkg --disable-dependency-tracking --localstatedir=/var --disable-nls --program-suffix=34 --enable-shared --enable-version-specific-runtime-libs
Thread model: posix
gcc version 3.4.6
 /software/gcc-3.4.6-0/pkg/libexec/gcc/i386-unknown-freebsd6.1/3.4.6/cc1 -quiet -v myshell.c -quiet -dumpbase myshell.c -auxbase myshell -version -o /var/tmp//ccVSq3jQ.s
ignoring nonexistent directory "/software/gcc-3.4.6-0/pkg/lib/gcc/i386-unknown-freebsd6.1/3.4.6/../../../../i386-unknown-freebsd6.1/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /software/gcc-3.4.6-0/pkg/include
 /software/gcc-3.4.6-0/pkg/lib/gcc/i386-unknown-freebsd6.1/3.4.6/include
 /usr/include
End of search list.
GNU C version 3.4.6 (i386-unknown-freebsd6.1)
        compiled by GNU C version 3.4.6.
GGC heuristics: --param ggc-min-expand=99 --param ggc-min-heapsize=129976
 as -o /var/tmp//ccl1Jaqk.o /var/tmp//ccVSq3jQ.s
 /software/gcc-3.4.6-0/pkg/libexec/gcc/i386-unknown-freebsd6.1/3.4.6/collect2 -V -dynamic-linker /libexec/ld-elf.so.1 -L/software/gcc-3.4.6-0/pkg/lib/gcc/i386-unknown-freebsd6.1 -o a /usr/lib/crt1.o /usr/lib/crti.o /software/gcc-3.4.6-0/pkg/lib/gcc/i386-unknown-freebsd6.1/3.4.6/crtbegin.o -L/software/gcc-3.4.6-0/pkg/lib/gcc/i386-unknown-freebsd6.1/3.4.6 -L/software/gcc-3.4.6-0/pkg/lib/gcc/i386-unknown-freebsd6.1/3.4.6/../../.. /var/tmp//ccl1Jaqk.o -lreadline -lgcc -lgcc_eh -lc -lgcc -lgcc_eh /software/gcc-3.4.6-0/pkg/lib/gcc/i386-unknown-freebsd6.1/3.4.6/crtend.o /usr/lib/crtn.o
/usr/bin/ld: cannot find -lreadline
GNU ld version 2.15 [FreeBSD] 2004-05-23
  Supported emulations:
   elf_i386_fbsd
collect2: ld returned 1 exit status

这是不使用 -lreadline 选项进行编译时的输出。

/var/tmp//ccNnucSC.o(.text+0x4f): In function `main':
: undefined reference to `readline'
collect2: ld returned 1 exit status

到目前为止,我一直无法解决此错误。我的代码或调用 gcc 时缺少什么?

【问题讨论】:

    标签: c unix gnu readline


    【解决方案1】:

    在 UNIX 下编译时,我发现以下是正确引用 GNU readline 库所必需的:

    gcc code.c -L/usr/local/lib -I/usr/local/include -lreadline
    

    这可确保编译器在编译和链接期间找到 readline 目录和文件。

    【讨论】:

    • 它在本地工作,但是当我将输出可执行文件复制到另一台设备时,我得到一个找不到 readline 错误,需要重新安装它。是否可以添加一个标志以使其始终将 readline 库复制到输出路径?提前致谢
    【解决方案2】:

    听起来您没有安装 libreadline 开发库。在 Debian(包括 FreeBSD 端口)上,该库位于 /lib 中,而开发库(您将链接到的)位于 /usr/lib 中。

    此外,您的包含后还有分号,这是您不应该有的。

    【讨论】:

    • 我忘了在我的问题中提到该库确实已正确安装并位于路径 /usr/local/include 下。跨度>
    • 是的,我从您的回答中看到它已安装到 /usr/local/lib 中,这有点令人惊讶地没有包含在您的默认库路径中(通常首先检查 /usr/local)。
    猜你喜欢
    • 2016-08-17
    • 2010-12-03
    • 2020-08-26
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    相关资源
    最近更新 更多