2009-06-10 6 views
143

obtenir un certain nombre de ces avertissements lors de la compilation quelques binaires:avertissement: déclaration implicite de la j'intégrée dans la fonction « 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’ 

Pour tenter de résoudre ce problème, j'ai ajouté

#include <stdlib.h> 

en haut des fichiers C associés à cet avertissement, en plus de la compilation avec les indicateurs suivants:

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

J'utilise GCC 4.1.2:

$ gcc --version 
gcc (GCC) 4.1.2 20080704 

Que dois-je faire pour résoudre ces avertissements?

+5

Pouvez-vous poster le code qui échoue? – mkb

+7

Malheureusement, je n'ai pas la permission de rediffuser ce code. –

Répondre

238

En C, l'utilisation d'une fonction précédemment non déclarée constitue une déclaration implicite de la fonction. Dans une déclaration implicite, le type de retour est int si je me souviens bien. Maintenant, GCC a intégré des définitions pour certaines fonctions standard. Si une déclaration implicite ne correspond pas à la définition intégrée, vous obtenez cet avertissement.

Pour résoudre le problème, vous devez déclarer les fonctions avant de les utiliser; normalement, vous le faites en incluant l'en-tête approprié. Je recommande de ne pas utiliser les drapeaux -fno-builtin- * si possible.

Au lieu de stdlib.h, vous devriez essayer

#include <string.h> 

C'est là sont définis strcpy et strncpy, au moins selon la strcpy (2) page de manuel.

La fonction exit est définie dans stdlib.h, par conséquent, je ne sais pas ce qui s'y passe.

+0

Merci, j'ai environ 20 fichiers .c à nettoyer et raté l'ajout de certains en-têtes. –

+0

Résolu mon problème en essayant de compiler un programme C pour vérifier le type de virtualisation (Xen HVM/KVM/VMware/Bare Metal), cool! Merci. –

17

Dans le cas de certains programmes, ces erreurs sont normales et ne doivent pas être réparées.

Je reçois ces messages d'erreur lors de la compilation du programme phrap (par exemple). Ce programme contient du code qui modifie ou remplace certaines fonctions intégrées et lorsque j'inclue les fichiers d'en-tête appropriés pour corriger les avertissements, GCC génère à la place un tas d'erreurs. Donc, réparer les avertissements brise la construction.

Si vous avez la source dans le cadre d'une distribution qui devrait compiler normalement, les erreurs peuvent être normales. Consultez la documentation pour être sûr.

11

Voici un code C qui produit l'erreur mentionnée ci-dessus:

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

Compilé comme celui-ci sur Fedora 17 Linux 64 bits avec 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 $ 

Pour aller de l'avertissement loin, ajoutez cette déclaration en haut du fichier:

#include <stdlib.h> 
+5

Lisez la question; il a déjà mentionné l'ajout de stdlib.h. Mais ce n'est que suffisant pour la sortie, pas pour les fonctions de chaîne. –

6

J'ai rencontré ces avertissements sur la fonction mempcpy.page Man dit cette fonction est une extension GNU et synopsis: spectacles

#define _GNU_SOURCE 
#include <string.h> 

Lorsque #define est ajouté à ma source avant la #include, les déclarations pour les extensions GNU sont rendus visibles et les avertissements disparaissent.

Questions connexes