我正在尝试通过 GCC 编译一个旧的 C 程序,该程序定义并使用名为 的函数getline
,该函数与 GNU C 库中的同名函数冲突。你怎样才能编译它?传递-ansi -D_XOPEN_SOURCE_EXTENDED
给 GCC 给我带来奇怪的错误strings.h
:
/usr/include/strings.h:74:16: error: expected identifier or '(' before '__extension__'
中的相关行strings.h
是:
extern char *index (__const char *__s, int __c)
__THROW __attribute_pure__ __nonnull ((1));
答案1
虽然该-fno-builtin-function
选项gcc
适用于内置函数,例如malloc
和strlen
(请参阅GCC提供的其他内置函数),它不适用于glibc
内置的 GNU 扩展,例如getline
函数。
与 jw013 的链接指出的一些解决方案类似,您可以尝试#define
在源文件中插入语句来重命名getline
程序定义的函数,例如#define getline my_getline
.
下面是一个小代码示例来说明这种方法。
/*
gcc -Wall -Wextra -o mystrdup mystrdup.c
./mystrdup
*/
#include <stdio.h>
#include <string.h>
// mystrdup.c:14: error: conflicting types for 'strdup'
//#define strdup my_strdup
char *strdup(char *str) {
str = str;
return str;
}
int main (void) {
char *str = 0;
char mystr[] = "Hello, mystrdup!";
str = strdup(mystr);
printf("%s\n", str);
return 0;
}
答案2
尝试:
gcc -fno-builtin-getline ...
欲了解更多信息,请参阅:
man gcc | less -p '-fno-builtin'
答案3
在 GCC 文档中,他们处理此问题的建议是添加 -ansi 编译器开关,因为 getline 是 ansi 的 GCC 扩展。