Je reçois un certain nombre de ces avertissements lors de la compilation de quelques binaires:
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 essayer 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?
c
gcc
gcc-warning
Alex Reynolds
la source
la source
Réponses:
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 correctement. Maintenant, GCC a des définitions intégrées 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 faites cela en incluant l'en-tête approprié. Je recommande de ne pas utiliser les
-fno-builtin-*
drapeaux si possible.Au lieu de stdlib.h , vous devriez essayer:
C'est là
strcpy
etstrncpy
sont définis, au moins selon lastrcpy
page de manuel (2).La
exit
fonction est définie dans stdlib.h , donc je ne sais pas ce qui se passe là-bas.la source
Dans le cas de certains programmes, ces erreurs sont normales et ne doivent pas être corrigées.
J'obtiens 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'inclus les fichiers d'en-tête appropriés pour corriger les avertissements, GCC génère à la place un tas d'erreurs. Donc, la correction des avertissements rompt efficacement la construction.
Si vous avez obtenu la source dans le cadre d'une distribution qui devrait se compiler normalement, les erreurs peuvent être normales. Consultez la documentation pour être sûr.
la source
Voici un code C qui produit l'erreur mentionnée ci-dessus:
Compilé comme ça sur Fedora 17 Linux 64 bits avec gcc:
Pour faire disparaître l'avertissement, ajoutez cette déclaration en haut du fichier:
la source
J'ai rencontré ces avertissements sur la
mempcpy
fonction. La page de manuel indique que cette fonction est une extension GNU et le synopsis montre:Quand
#define
est ajouté à ma source avant le#include
, les déclarations pour les extensions GNU sont rendues visibles et les avertissements disparaissent.la source