警告:内置函数'xyz'的隐式声明不兼容

时间:2009-06-10 18:01:50

标签: c gcc gcc-warning

编译几个二进制文件时,我收到了一些警告:

warning: incompatible implicit declaration of built-in function ‘strcpy’
warning: incompatible implicit declaration of built-in function ‘strlen’
warning: incompatible implicit declaration of built-in function ‘exit’

要尝试解决此问题,我已添加

#include <stdlib.h>
除了使用以下标志进行编译之外,

在与此警告关联的C文件的顶部:

CFLAGS = -fno-builtin-exit -fno-builtin-strcat -fno-builtin-strncat -fno-builtin-strcpy -fno-builtin-strlen -fno-builtin-calloc

我正在使用GCC 4.1.2:

$ gcc --version
gcc (GCC) 4.1.2 20080704

我该怎么做才能解决这些警告?

4 个答案:

答案 0 :(得分:257)

在C中,使用先前未声明的函数构成函数的隐式声明。在隐式声明中,如果我没记错的话,返回类型是int。现在,GCC具有一些标准功能的内置定义。如果隐式声明与内置定义不匹配,则会收到此警告。

要解决此问题,您必须在使用之前声明这些功能;通常你通过包含适当的标题来做到这一点。如果可能,我建议不要使用-fno-builtin-*标志。

而不是 stdlib.h ,您应该尝试:

#include <string.h>

这是定义strcpystrncpy的地方,至少根据strcpy(2)手册页。

exit函数在 stdlib.h 中定义,所以我不知道那里发生了什么。

答案 1 :(得分:16)

对于某些程序,这些错误是正常的,不应修复。

我在编译程序文件时会收到这些错误消息(例如)。该程序恰好包含修改或替换某些内置函数的代码,当我包含适当的头文件来修复警告时,GCC会生成一堆错误。因此,有效地修复警告会破坏构建。

如果您将源代码作为应该正常编译的发行版的一部分,那么错误可能是正常的。请参阅文档以确定。

答案 2 :(得分:11)

以下是产生上述错误的一些C代码:

int main(int argc, char **argv) {
  exit(1);
}

使用gcc:

在Fedora 17 Linux 64位上编译如下
el@defiant ~/foo2 $ gcc -o n n2.c                                                               
n2.c: In function ‘main’:
n2.c:2:3: warning: incompatible implicit declaration of built-in 
function ‘exit’ [enabled by default]
el@defiant ~/foo2 $ ./n 
el@defiant ~/foo2 $ 

要使警告消失,请将此声明添加到文件顶部:

#include <stdlib.h>

答案 3 :(得分:7)

我在mempcpy函数上遇到了这些警告。手册页说这个函数是一个GNU扩展,概要显示:

#define _GNU_SOURCE
#include <string.h>

#define之前将#include添加到我的源代码中时,GNU扩展的声明会变得可见并且警告会消失。