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

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

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 

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

在C中,使用先前未声明的函数构成函数的隐式声明。 在隐式声明中,如果我正确记得,返回types是int 。 现在,GCC有一些标准function的内置定义。 如果隐式声明与内置定义不匹配,则会出现此警告。

要解决这个问题,你必须在使用它之前声明这个函数。 通常你通过包含适当的头来做到这一点。 如果可能,我build议不要使用-fno-builtin- *标志。

而不是stdlib.h,你应该尝试

 #include <string.h> 

这就是strcpystrncpy的定义,至less根据strcpy(2)手册页。

但是,stdlib.h中定义了exit函数,所以我不知道那里是怎么回事。

在一些程序的情况下,这些错误是正常的,不应该被修复。

编译程序废话时(例如)我得到这些错误信息。 这个程序恰好包含修改或replace一些内置函数的代码,当我包含适当的头文件来修复警告时,GCC反而会产生一堆错误。 所以修复警告有效地打破了构build。

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

这里有一些C代码产生了上面提到的错误:

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

在Fedora 17 Linux 64位上用gcc编译就像这样:

 el@defiant ~/foo2 $ gcc -on 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> 

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

 #define _GNU_SOURCE #include <string.h> 

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