You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CLion中使用C语言getline函数出现未定义引用错误求助

解决MinGW下getline函数未定义的编译错误

你遇到的问题很典型:getline是POSIX标准提供的函数,并不属于C语言的标准库(C99/C11/C17都未包含它),而你使用的MinGW编译器默认没有实现这个POSIX函数,所以链接阶段会出现"undefined reference to getline"的错误。

下面给你两种可行的解决办法:

方法1:改用标准C库的fgets函数(推荐跨平台)

如果你的代码需要跨平台运行,建议替换成C标准库的fgets,它在所有符合标准的C编译器中都能正常工作。修改你的ler_ficheiro函数中的循环部分:

// 替换原来的getline循环
char sub_linha[1000];
while (fgets(sub_linha, sizeof(sub_linha), ficheiro) != NULL) {
    // 注意:fgets会把换行符也读进来,如果不需要可以手动去除
    size_t len = strlen(sub_linha);
    if (len > 0 && sub_linha[len-1] == '\n') {
        sub_linha[len-1] = '\0';
    }
    colocar_buffer(sub_linha, n_linha);
    n_linha++;
}

这样修改后,不需要依赖POSIX函数,编译就能正常通过。

方法2:手动实现getline或启用MinGW的POSIX扩展

如果你一定要使用getline函数,可以试试以下两种方式:

方式A:定义POSIX宏

在你的代码最顶部添加宏定义,强制MinGW启用POSIX相关的函数实现:

#define _POSIX_C_SOURCE 200809L
// 或者#define _GNU_SOURCE(针对GNU扩展)
#include <stdio.h>
#include <stdlib.h>
// 其他头文件...

不过注意:部分旧版本的MinGW可能还是不支持getline,如果添加宏后还是报错,就需要用方式B。

方式B:自己实现一个简易版getline

如果MinGW确实不提供getline,可以自己写一个简单的实现,放在你的代码里:

ssize_t getline(char **lineptr, size_t *n, FILE *stream) {
    if (*lineptr == NULL || *n == 0) {
        *n = 128; // 初始缓冲区大小
        *lineptr = (char*)malloc(*n);
        if (*lineptr == NULL) return -1;
    }

    ssize_t chars_read = 0;
    int c;

    while ((c = fgetc(stream)) != EOF && c != '\n') {
        if (chars_read + 1 >= *n) {
            *n *= 2;
            char *new_ptr = (char*)realloc(*lineptr, *n);
            if (new_ptr == NULL) {
                free(*lineptr);
                *lineptr = NULL;
                return -1;
            }
            *lineptr = new_ptr;
        }
        (*lineptr)[chars_read++] = c;
    }

    if (c == '\n') {
        if (chars_read + 1 >= *n) {
            *n += 1;
            char *new_ptr = (char*)realloc(*lineptr, *n);
            if (new_ptr == NULL) {
                free(*lineptr);
                *lineptr = NULL;
                return -1;
            }
            *lineptr = new_ptr;
        }
        (*lineptr)[chars_read++] = '\n';
    }

    if (chars_read == 0 && c == EOF) return -1;

    (*lineptr)[chars_read] = '\0';
    return chars_read;
}

把这个函数放在你的代码开头(头文件之后),就可以像原来一样调用getline了。

另外,还要注意你的原代码中char* linha;;多了一个分号,虽然不影响编译,但建议修正为char* linha = NULL;,避免未初始化的指针问题。

内容的提问来源于stack exchange,提问作者GUILHERME CARDOSO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:14:09