advertencia: declaración implícita incompatible de la función incorporada 'xyz'

164

Recibo varias de estas advertencias al compilar algunos binarios:

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 tratar de resolver esto, he agregado

#include <stdlib.h>

en la parte superior de los archivos C asociados con esta advertencia, además de compilar con los siguientes indicadores:

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

Estoy usando GCC 4.1.2:

$ gcc --version
gcc (GCC) 4.1.2 20080704

¿Qué debo hacer para resolver estas advertencias?

Alex Reynolds
fuente
55
¿Puedes publicar el código que falla?
mkb
77
Lamentablemente, no tengo permiso para volver a publicar este código.
Alex Reynolds

Respuestas:

271

En C, el uso de una función no declarada anteriormente constituye una declaración implícita de la función. En una declaración implícita, el tipo de retorno es intsi recuerdo correctamente. Ahora, GCC tiene definiciones incorporadas para algunas funciones estándar. Si una declaración implícita no coincide con la definición incorporada, recibirá esta advertencia.

Para solucionar el problema, debe declarar las funciones antes de usarlas; normalmente haces esto incluyendo el encabezado apropiado. Recomiendo no usar las -fno-builtin-*banderas si es posible.

En lugar de stdlib.h , deberías probar:

#include <string.h>

Ahí es donde strcpyy strncpyse definen, al menos de acuerdo con la strcpy(2) página de manual.

Sin embargo, la exitfunción está definida en stdlib.h , así que no sé qué está pasando allí.

Ville Laurikari
fuente
Gracias, tengo que limpiar unos 20 archivos .c y no agregué algunos encabezados.
Alex Reynolds
Resuelto mi problema al intentar compilar un programa en C para verificar el tipo de virtualización (Xen HVM / KVM / VMware / Bare Metal), ¡genial! Gracias.
Terry Wang
16

En el caso de algunos programas, estos errores son normales y no deben repararse.

Recibo estos mensajes de error al compilar el programa phrap (por ejemplo). Este programa contiene código que modifica o reemplaza algunas funciones integradas, y cuando incluyo los archivos de encabezado apropiados para corregir las advertencias, GCC genera un montón de errores. Entonces, arreglar las advertencias efectivamente rompe la construcción.

Si obtuvo la fuente como parte de una distribución que debería compilarse normalmente, los errores podrían ser normales. Consulte la documentación para estar seguro.

Brandon
fuente
10

Aquí hay un código C que produce el error mencionado anteriormente:

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

Compilado así en Fedora 17 Linux 64 bit con 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 que la advertencia desaparezca, agregue esta declaración al principio del archivo:

#include <stdlib.h>
Eric Leschinski
fuente
66
Lea la pregunta; ya mencionó agregar stdlib.h. Pero eso solo es lo suficientemente bueno para la salida, no para las funciones de cadena.
Matt Fletcher el
7

Encontré estas advertencias en mempcpyfunción. La página de manual dice que esta función es una extensión de GNU y la sinopsis muestra:

#define _GNU_SOURCE
#include <string.h>

Cuando #definese agrega a mi fuente antes de #include, las declaraciones para las extensiones GNU se hacen visibles y las advertencias desaparecen.

ajlittoz
fuente