avertissement: déclaration implicite incompatible de la fonction intégrée 'xyz'

164

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?

Alex Reynolds
la source
5
Pouvez-vous publier le code qui échoue?
mkb
7
Malheureusement, je n'ai pas l'autorisation de republier ce code.
Alex Reynolds

Réponses:

271

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 intsi 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:

#include <string.h>

C'est là strcpyet strncpysont définis, au moins selon la strcpypage de manuel (2).

La exitfonction est définie dans stdlib.h , donc je ne sais pas ce qui se passe là-bas.

Ville Laurikari
la source
Merci, j'ai environ 20 fichiers .c à nettoyer et j'ai manqué d'ajouter quelques en-têtes.
Alex Reynolds
J'ai 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.
Terry Wang
16

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.

Brandon
la source
10

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

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

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

Pour faire disparaître l'avertissement, ajoutez cette déclaration en haut du fichier:

#include <stdlib.h>
Eric Leschinski
la source
6
Lisez la question. il a déjà mentionné l'ajout de stdlib.h. Mais ce n'est suffisant que pour la sortie, pas pour les fonctions de chaîne.
Matt Fletcher le
7

J'ai rencontré ces avertissements sur la mempcpyfonction. La page de manuel indique que cette fonction est une extension GNU et le synopsis montre:

#define _GNU_SOURCE
#include <string.h>

Quand #defineest ajouté à ma source avant le #include, les déclarations pour les extensions GNU sont rendues visibles et les avertissements disparaissent.

Ajlittoz
la source