Warnung: Inkompatible implizite Deklaration der eingebauten Funktion 'xyz'

164

Beim Kompilieren einiger Binärdateien werden einige dieser Warnungen angezeigt:

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

Um dies zu beheben, habe ich hinzugefügt

#include <stdlib.h>

oben in den C-Dateien, die dieser Warnung zugeordnet sind, zusätzlich zum Kompilieren mit den folgenden Flags:

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

Ich benutze GCC 4.1.2:

$ gcc --version
gcc (GCC) 4.1.2 20080704

Was kann ich tun, um diese Warnungen zu beheben?

Alex Reynolds
quelle
5
Können Sie den fehlgeschlagenen Code veröffentlichen?
mkb
7
Leider habe ich keine Erlaubnis, diesen Code erneut zu veröffentlichen.
Alex Reynolds

Antworten:

271

In C stellt die Verwendung einer zuvor nicht deklarierten Funktion eine implizite Deklaration der Funktion dar. In einer impliziten Deklaration ist der Rückgabetyp, intwenn ich mich richtig erinnere. Jetzt hat GCC integrierte Definitionen für einige Standardfunktionen. Wenn eine implizite Deklaration nicht mit der integrierten Definition übereinstimmt, wird diese Warnung angezeigt.

Um das Problem zu beheben, müssen Sie die Funktionen deklarieren, bevor Sie sie verwenden. Normalerweise tun Sie dies, indem Sie den entsprechenden Header einfügen. Ich empfehle, die -fno-builtin-*Flags möglichst nicht zu verwenden .

Anstelle von stdlib.h sollten Sie Folgendes versuchen:

#include <string.h>

Dort werden strcpyund strncpywerden zumindest gemäß der strcpy(2) Manpage definiert.

Die exitFunktion ist jedoch in stdlib.h definiert , sodass ich nicht weiß, was dort vor sich geht.

Ville Laurikari
quelle
Vielen Dank, ich muss ungefähr 20 .c-Dateien bereinigen und habe einige Header nicht hinzugefügt.
Alex Reynolds
Mein Problem beim Kompilieren eines C-Programms zur Überprüfung des Virtualisierungstyps (Xen HVM / KVM / VMware / Bare Metal) wurde behoben. Cool! Vielen Dank.
Terry Wang
16

Bei einigen Programmen sind diese Fehler normal und sollten nicht behoben werden.

Ich erhalte diese Fehlermeldungen beim Kompilieren des Programms phrap (zum Beispiel). Dieses Programm enthält zufällig Code, der einige integrierte Funktionen ändert oder ersetzt. Wenn ich die entsprechenden Header-Dateien zur Behebung der Warnungen einbinde, generiert GCC stattdessen eine Reihe von Fehlern. Das Beheben der Warnungen unterbricht also effektiv den Build.

Wenn Sie die Quelle als Teil einer Distribution erhalten haben, die normal kompiliert werden soll, sind die Fehler möglicherweise normal. Konsultieren Sie die Dokumentation, um sicherzugehen.

Brandon
quelle
10

Hier ist ein C-Code, der den oben genannten Fehler erzeugt:

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

So kompiliert unter Fedora 17 Linux 64 Bit mit 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 $ 

Fügen Sie diese Deklaration oben in der Datei hinzu, damit die Warnung nicht mehr angezeigt wird:

#include <stdlib.h>
Eric Leschinski
quelle
6
Lies die Frage; Er hat bereits erwähnt, dass er stdlib.h hinzugefügt hat. Das ist aber nur für den Exit gut genug, nicht für die String-Funktionen.
Matt Fletcher
7

Ich habe diese Warnungen auf mempcpyFunktion getroffen. Manpage sagt, dass diese Funktion eine GNU-Erweiterung ist und Synopse zeigt:

#define _GNU_SOURCE
#include <string.h>

Wenn #definevor dem zu meiner Quelle hinzugefügt wird #include, werden Deklarationen für die GNU-Erweiterungen sichtbar gemacht und Warnungen verschwinden.

Ajlittoz
quelle