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


164

编译一些二进制文件时,我收到许多这样的警告:

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

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


5
您可以发布失败的代码吗?
mkb

7
不幸的是,我无权重新发布此代码。
亚历克斯·雷诺兹

Answers:


271

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

要解决此问题,必须在使用函数之前声明它们。通常,您可以通过包含适当的标头来实现此目的。-fno-builtin-*如果可能,我建议不要使用这些标志。

代替stdlib.h,您应该尝试:

#include <string.h>

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

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


谢谢,我有大约20个.c文件需要清理,错过了添加一些标头的过程。
亚历克斯·雷诺兹

解决了我尝试编译C程序以检查虚拟化类型(Xen HVM / KVM / VMware / Bare Metal)时的问题,很酷!谢谢。
Terry Wang

16

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

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

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


10

这是一些产生上述错误的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>

6
阅读问题;他已经提到添加stdlib.h。但这仅对出口就足够了,对字符串函数来说就足够了。
马特·弗莱彻

7

我在mempcpy功能上遇到了这些警告。手册页中说此功能是GNU扩展,并显示以下内容:

#define _GNU_SOURCE
#include <string.h>

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.