undefined reference to `getline' in c

24

我正在学习在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 64位 + Eclipse Indigo + MinGW。


你尝试过使用“-std=gnu90”进行编译吗? - Gandaro
这不是一个好的C语言教程,或者说根本不是C语言教程。我不建议将其作为您关于C语言的唯一或主要信息来源。 - n. m.
4个回答

21
其他答案已经涵盖了大部分内容,但存在几个问题。首先,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年后,它现在被规范化了吗? - VimNing
@VimNing 不是的,它们仍然不在标准库中,但至少它们现在在TR块中了。一步一个脚印...(还有很多人闲着没干)。 - WhozCraig
@NeoZoom.lua 通常情况下,C语言标准化所需的时间是以十年为单位衡量的。 - undefined

9

我也在使用MinGW。我检查了MinGW头文件,发现getline()不存在于任何C头文件中,只存在于C++头文件中。这意味着C函数getline()在MinGW中不存在。


8

getline不是一个标准函数,你需要设置一个特性测试宏才能使用它,根据我的man页。

_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700
_GNU_SOURCE

在此之前。


2

getline()不在C标准库中。然而,您仍然可以使用编译器标志-std=gnu99来使用它。这个标志告诉编译器使用GNU的ISO C99方言,被gccclang都支持。

gcc main.c -std=gnu99

查看gcc flags
手册(通过终端中的man getline命令获取)还提到,
       getline(), getdelim():
           Since glibc 2.10:
               _POSIX_C_SOURCE >= 200809L
           Before glibc 2.10:
               _GNU_SOURCE

所以你可以在你的文件中添加#define _POSIX_C_SOURCE 200809L或者#define _GUN_SOURCE来暴露声明。
如果你喜欢,这里是一个基本实现的getline()
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>

ssize_t getline(char **restrict buffer, size_t *restrict size,
                FILE *restrict fp) {
    register int c;
    register char *cs = NULL;

    if (cs == NULL) {
        register int length = 0;
        while ((c = getc(fp)) != EOF) {
            cs = (char *)realloc(cs, ++length+1);
            if ((*(cs + length - 1) = c) == '\n') {
                *(cs + length) = '\0';
                *buffer = cs;
                break;
            }
        }
        return (ssize_t)(*size = length);
    } else {
        while (--(*size) > 0 && (c = getc(fp)) != EOF) {
            if ((*cs++ = c) == '\n')
                break;
        }
        *cs = '\0';
    }
    return (ssize_t)(*size=strlen(*buffer));
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接