Ale*_*lds 158 c gcc gcc-warning
编译几个二进制文件时,我收到了一些警告:
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’
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题,我补充道
#include <stdlib.h>
Run Code Online (Sandbox Code Playgroud)
在与此警告关联的C文件的顶部,除了使用以下标志进行编译之外:
CFLAGS = -fno-builtin-exit -fno-builtin-strcat -fno-builtin-strncat -fno-builtin-strcpy -fno-builtin-strlen -fno-builtin-calloc
Run Code Online (Sandbox Code Playgroud)
我正在使用GCC 4.1.2:
$ gcc --version
gcc (GCC) 4.1.2 20080704
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能解决这些警告?
Vil*_*ari 262
在C中,使用先前未声明的函数构成函数的隐式声明.在隐式声明中,返回类型是int我记得正确的.现在,GCC具有一些标准功能的内置定义.如果隐式声明与内置定义不匹配,则会收到此警告.
要解决这个问题,你必须在使用它们之前声明它们; 通常你通过包含适当的标题来做到这一点.-fno-builtin-*如果可能,我建议不要使用标志.
而不是stdlib.h,你应该尝试:
#include <string.h>
Run Code Online (Sandbox Code Playgroud)
这就是strcpy和strncpy定义,至少根据strcpy(2)手册页.
该exit函数在stdlib.h中定义,所以我不知道那里发生了什么.
Bra*_*don 16
对于某些程序,这些错误是正常的,不应修复.
编译程序文件时(例如)我收到这些错误消息.该程序恰好包含修改或替换某些内置函数的代码,当我包含适当的头文件来修复警告时,GCC会生成一堆错误.因此,有效地修复警告会破坏构建.
如果您将源代码作为应该正常编译的分发的一部分,那么错误可能是正常的.请查阅文档以确定.
Eri*_*ski 11
这是一些产生上述错误的C代码:
int main(int argc, char **argv) {
exit(1);
}
Run Code Online (Sandbox Code Playgroud)
使用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 $
Run Code Online (Sandbox Code Playgroud)
要使警告消失,请将此声明添加到文件的顶部:
#include <stdlib.h>
Run Code Online (Sandbox Code Playgroud)
我在mempcpy功能上遇到了这些警告.手册页说这个函数是GNU扩展,概要显示:
#define _GNU_SOURCE
#include <string.h>
Run Code Online (Sandbox Code Playgroud)
何时#define添加到我的源代码之前#include,GNU扩展的声明可见并且警告消失.