【发布时间】:2015-12-16 02:13:19
【问题描述】:
我正在使用一些工作代码(我没有编写,并且创建者不再存在)尝试使用终端在我的 Mac (10.9.5) 上编译它。编译时出现以下错误(gcc -o code code.c):
Undefined symbols for architecture x86_64:
"_add_history", referenced from:
_rl_gets in talk-c856c6.o
"_read_history", referenced from:
_main in talk-c856c6.o
"_readline", referenced from:
_rl_gets in talk-c856c6.o
"_write_history", referenced from:
_rl_gets in talk-c856c6.o
ld: symbol(s) not found for architecture x86_64
这是我的所有内容:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <strings.h>
#include <readline/readline.h>
#include <readline/history.h>
我在网上和其他地方发现了类似的问题并尝试过
#include <readline.h>
但是得到fatal error: 'readline.h' file not found
(#include <libedit.dylib> 也一样)
我对外部库有点陌生,所以也许我需要安装另一个库?我的问题只是 Mac 需要安装一个额外的库来使用这 5 个函数会产生错误,还是我的 #include 之一仅适用于 Linux 而不适用于 Mac?我想既然 Mac 和 Linux 都使用 Unix,那应该是一样的,但显然有一些我不明白的细微之处。
提前致谢。
【问题讨论】:
-
gcc只知道在哪里可以找到一组有限的标准头文件和库。您需要-I选项到gcc告诉它在哪里可以找到 readline 头文件,以及-L选项在哪里可以找到截止日期库(搜索路径取决于您安装 readline 的位置)。此外,#include不能与 .dylibs 一起使用。 -
有趣的是,如果我尝试
gcc -o -I code code.c -ledit,我不会像原来的问题/帖子中那样出现所有 4 个单独的符号错误,但我确实得到了ld: can't link with a main executable file 'talk' for architecture x86_64 -
@BobbyDigital,
gcc -o -I code code.c -ledit坏了。-o选项后面必须跟一个输出文件名(在这种情况下是所需可执行文件的名称),-I选项后面必须跟要搜索包含文件的目录的路径。我最好的猜测是省略-I会表达你真正想说的。 -
谢谢大家。
gcc code.c -o code -l readline也可以。最初的错误具有误导性,因为这实际上也是 linux 端的一个问题。有人有任何资源可以帮助我更好地理解这个库的细微差别吗? -
@BobbyDigital 在 C 中,包含头文件只会使您的程序知道在该头文件中声明的函数和变量。它不会导致编译器链接到任何库。您需要手动指定要链接到的库。在这种情况下,
libedit和libreadline都提供了您想要的功能,因此您可以根据需要链接其中任何一个。