【问题标题】:warning: incompatible implicit declaration of built-in function ‘xyz’警告:内置函数“xyz”的不兼容隐式声明
【发布时间】:2010-11-01 21:51:36
【问题描述】:

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

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 gcc gcc-warning


【解决方案1】:

在 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)时遇到的问题,太棒了!谢谢。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 阅读问题;他已经提到添加stdlib.h。但这仅适用于退出,不适用于字符串函数。
    • 虽然它确实帮助了我。
    【解决方案4】:

    我在mempcpy 函数中遇到了这些警告。手册页说这个函数是一个 GNU 扩展,概要显示:

    #define _GNU_SOURCE
    #include <string.h>
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-18
      • 2013-12-01
      • 2018-03-17
      • 2013-02-15
      • 1970-01-01
      • 2013-12-28
      • 2012-10-29
      • 2011-12-15
      相关资源
      最近更新 更多