警告: 内置函数‘ 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

我应该如何解决这些警告?

411479 次浏览

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

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

死了不同,你应该尝试:

#include <string.h>

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

但是,exit函数是在 死了中定义的,所以我不知道那里发生了什么。

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

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

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

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

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

在 Fedora 17 Linux 64位与 gcc 一起编译如下:

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>

我在 mempcpy函数中遇到了这些警告。 Man page 说这个函数是 GNU 扩展,大纲显示:

#define _GNU_SOURCE
#include <string.h>

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