2009-06-10 24 views
143

Me estoy poniendo un número de estas advertencias al compilar unos binarios:aviso: declaración implícita incompatible de la función incorporada '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’ 

para tratar de resolver esto, he añadido

#include <stdlib.h> 

en la parte superior de los archivos de C asociadas con esta advertencia, además de compilar con las siguientes banderas:

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?

+5

¿Se puede publicar el código que falla? – mkb

+7

Desafortunadamente, no tengo permiso para volver a publicar este código. –

Respuesta

238

En C, el uso de una función previamente no declarada constituye una declaración implícita de la función. En una declaración implícita, el tipo de devolución es int si 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, recibe esta advertencia.

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

En lugar de stdlib.h, usted debe tratar

#include <string.h> 

Ahí es donde strcpy y strncpy se definen, al menos de acuerdo con el (2) página de manual strcpy.

La función exit está definida en stdlib.h, sin embargo, así que no sé qué está pasando allí.

+0

Gracias, tengo alrededor de 20 archivos .c para limpiar y he perdido la adición de algunos encabezados. –

+0

Resolvió mi problema al intentar compilar un programa C para verificar el tipo de virtualización (Xen HVM/KVM/VMware/Bare Metal), ¡genial! Gracias. –

17

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 incorporadas, y cuando incluyo los archivos de encabezado apropiados para corregir las advertencias, GCC genera un montón de errores. Entonces, arreglar las advertencias rompe efectivamente 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.

11

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

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

Compilado como este en Fedora 17 Linux de 64 bits con 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 $ 

Para hacer la advertencia ir de distancia, agregue esta declaración a la parte superior del archivo:

#include <stdlib.h> 
+5

Lea la pregunta; él ya mencionó agregar stdlib.h. Pero eso solo es suficiente para la salida, no para las funciones de cadena. –

6

Me encontré con estas advertencias en la función mempcpy.página del manual dice que esta función es una extensión de GNU y sinopsis muestra:

#define _GNU_SOURCE 
#include <string.h> 

Cuando se añade #define a mi fuente antes de la #include, las declaraciones de las extensiones de GNU se hacen visibles y advertencias desaparecen.

Cuestiones relacionadas