aviso: declaração implícita incompatível da função interna 'xyz'

164

Estou recebendo vários desses avisos ao compilar alguns binários:

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

Para tentar resolver isso, adicionei

#include <stdlib.h>

na parte superior dos arquivos C associados a esse aviso, além de compilar com os seguintes sinalizadores:

CFLAGS = -fno-builtin-exit -fno-builtin-strcat -fno-builtin-strncat -fno-builtin-strcpy -fno-builtin-strlen -fno-builtin-calloc

Estou usando o GCC 4.1.2:

$ gcc --version
gcc (GCC) 4.1.2 20080704

O que devo fazer para resolver esses avisos?

Alex Reynolds
fonte
5
Você pode postar o código que falha?
Mkb
7
Infelizmente, não tenho permissão para repassar esse código.
Alex Reynolds

Respostas:

271

Em C, o uso de uma função não declarada anteriormente constitui uma declaração implícita da função. Em uma declaração implícita, o tipo de retorno é intse bem me lembro. Agora, o GCC possui definições internas para algumas funções padrão. Se uma declaração implícita não corresponder à definição interna, você receberá este aviso.

Para corrigir o problema, você deve declarar as funções antes de usá-las; normalmente você faz isso incluindo o cabeçalho apropriado. Eu recomendo não usar o-fno-builtin-* sinalizadores, se possível.

Em vez de stdlib.h , você deve tentar:

#include <string.h>

É onde strcpye strncpysão definidos, pelo menos de acordo com a strcpypágina de manual (2).

A exitfunção é definida em stdlib.h , portanto, não sei o que está acontecendo lá.

Ville Laurikari
fonte
Obrigado, tenho cerca de 20 arquivos .c para limpar e deixei de adicionar alguns cabeçalhos.
Alex Reynolds
Resolvi meu problema ao tentar compilar um programa C para verificar o tipo de virtualização (Xen HVM / KVM / VMware / Bare Metal), legal! Obrigado.
Terry Wang
16

No caso de alguns programas, esses erros são normais e não devem ser corrigidos.

Recebo essas mensagens de erro ao compilar o phrap do programa (por exemplo). Esse programa contém código que modifica ou substitui algumas funções internas e, quando eu incluo os arquivos de cabeçalho apropriados para corrigir os avisos, o GCC gera vários erros. Portanto, corrigir os avisos efetivamente interrompe a compilação.

Se você obteve a fonte como parte de uma distribuição que deve compilar normalmente, os erros podem ser normais. Consulte a documentação para ter certeza.

Brandon
fonte
10

Aqui está um código C que produz o erro mencionado acima:

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

Compilado assim no Fedora 17 Linux de 64 bits com o 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 $ 

Para fazer o aviso desaparecer, adicione esta declaração na parte superior do arquivo:

#include <stdlib.h>
Eric Leschinski
fonte
6
Leia a pergunta; ele já mencionou a adição de stdlib.h. Mas isso é bom o suficiente para a saída, não para as funções de string.
Matt Fletcher
7

Eu conheci esses avisos em mempcpyfunção. A página de manual diz que esta função é uma extensão GNU e a sinopse mostra:

#define _GNU_SOURCE
#include <string.h>

Quando #defineé adicionado à minha fonte antes do #include, as declarações para as extensões GNU são tornadas visíveis e os avisos desaparecem.

ajlittoz
fonte