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

172

当我编译一些可执行文件时,我得到了很多这样的警告:

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
你能否发布出现错误的代码? - Matt K
7
很遗憾,我没有重新发布此代码的许可。 - Alex Reynolds
4个回答

288

在C语言中,如果使用了一个之前未声明的函数,则构成了对该函数的隐式声明。在隐式声明中,如果我没记错的话,返回类型是int。现在,GCC已经为一些标准函数内置了定义。如果隐式声明与内置定义不匹配,则会出现此警告。

要解决问题,你需要在使用函数之前声明它们。通常,你可以通过包含适当的头文件来实现这一点。我建议尽可能不要使用-fno-builtin-*标志。

与其使用stdlib.h,你应该尝试:

#include <string.h>

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

exit函数是在stdlib.h中被定义的,但我不知道那里发生了什么。


谢谢,我有大约20个.c文件需要整理,并且错过了添加一些头文件。 - Alex Reynolds
解决了我的问题,当我尝试编译一个C程序来检查虚拟化类型(Xen HVM/KVM/VMware/Bare Metal)时,太棒了!谢谢。 - Terry Wang

16

在某些程序中,这些错误是正常的,不需要修复。

例如,在编译phrap程序时,我会收到这些错误消息。该程序包含修改或替换一些内置函数的代码,当我包含适当的头文件来修复警告时,GCC实际上会生成一堆错误。因此,修复警告会导致构建失败。

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


11

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

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

使用gcc在64位Fedora 17 Linux上编译:

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,请注意问题;但这只能满足退出操作,不能适用于字符串函数。 - Matt Fletcher
虽然它在这里帮了我一些忙。 - Al-Baraa El-Hag

7

我在使用mempcpy函数时遇到了一些警告。手册中指出该函数是GNU扩展,并给出如下概述:

#define _GNU_SOURCE
#include <string.h>

在我的源代码中添加#define#include之前,可以使GNU扩展的声明可见,从而消除警告。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接