2009-06-10 233 views
143

编译二进制数时,我得到了一些这些警告的不兼容的隐式声明:警告:内建函数“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 

我该如何解决这些警告?

+5

你能发布失败的代码吗? – mkb 2009-06-10 18:04:22

+7

不幸的是,我没有权限转发此代码。 – 2009-06-10 18:32:38

回答

238

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

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

相反stdlib.h中的,你应该尝试

#include <string.h> 

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

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

+0

谢谢,我有大约20个.c文件来清理并错过添加一些标题。 – 2009-06-10 22:42:32

17

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

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

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

11

这里是产生上述的错误一些C代码:

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

编译这样在Fedora 17的Linux 64位用gcc:

[email protected] ~/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] 
[email protected] ~/foo2 $ ./n 
[email protected] ~/foo2 $ 

要使警告走将此声明添加到文件顶部:

#include <stdlib.h> 
6

我遇到了这些警告mempcpy函数。手册页说,这个功能是GNU扩展和简介显示:

#define _GNU_SOURCE 
#include <string.h> 

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