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
相关产品推荐
相关产品推荐

