c 中对“getline”的未定义引用
Posted
技术标签:
【中文标题】c 中对“getline”的未定义引用【英文标题】:undefined reference to `getline' in c 【发布时间】:2012-10-18 05:53:26 【问题描述】:我正在学习在 C 编程中使用 getline,并尝试了来自 http://crasseux.com/books/ctutorial/getline.html 的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int atgc, char *argv[])
int bytes_read = 1;
int nbytes = 10;
char *my_string;
my_string = (char *)malloc(nbytes+1);
puts("Please enter a line of text");
bytes_read = getline(&my_string, &nbytes, stdin);
if (bytes_read == -1)
puts ("ERROR!");
else
puts ("You typed:");
puts (my_string);
return 0;
但是,问题在于编译器不断返回以下错误:undefined reference to 'getline'。 你能告诉我问题是什么吗?谢谢!
我使用的是 Win7 64bit + Eclipse Indigo + MinGW
【问题讨论】:
你试过用-std=gnu90
编译吗?
【参考方案1】:
其他答案已经涵盖了大部分内容,但存在几个问题。首先,getline()
不在 C 标准库中,而是 POSIX 2008 扩展。通常,它可以与 POSIX 兼容的编译器一起使用,因为宏 _POSIX_C_SOURCE 将使用适当的值定义。在getline()
标准化之前,您可能有一个较旧的编译器,在这种情况下,这是一个 GNU 扩展,您必须在 #include <stdio.h>
之前使用#define _GNU_SOURCE
才能启用它,并且必须使用与 GNU 兼容的编译器,例如 gcc .
此外,nbytes
的类型应该是 size_t
,而不是 int
。至少在我的系统上,它们的大小不同,size_t
更长,使用int*
而不是size_t*
可能会产生严重后果(并且也不能使用默认的 gcc 设置进行编译)。有关详细信息,请参阅 getline 手册页 (http://linux.die.net/man/3/getline)。
进行该更改后,您的程序可以在我的系统上编译并正常运行。
【讨论】:
现在标准化了吗? 9 年后。【参考方案2】:我也在使用 MinGW。我检查了 MinGW 头文件,getline()
没有出现在任何 C 头文件中,它只出现在 C++ 头文件中。这意味着MinGW中不存在C函数getline()
。
【讨论】:
【参考方案3】:getline
不是标准功能,您需要设置一个功能测试宏才能使用它,根据我的手册页,
_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700
对于 glibc 2.10 或更高版本,
_GNU_SOURCE
在那之前。
【讨论】:
以上是关于c 中对“getline”的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章
ARM-NONE-EABI链接链中对memcpy的未定义引用
Linux 中对 pthread_create 的未定义引用