Warnung: inkompatible implizite Deklaration der integrierten Funktion „xyz“

Lesezeit: 3 Minuten

Benutzeravatar von Alex Reynolds
Alex Reynolds

Ich erhalte eine Reihe dieser Warnungen, wenn ich einige Binärdateien kompiliere:

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 zu versuchen, dies zu lösen, 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 verwende GCC 4.1.2:

$ gcc --version
gcc (GCC) 4.1.2 20080704

Was soll ich tun, um diese Warnungen zu beheben?

  • Kannst du den fehlgeschlagenen Code posten?

    – Matt K

    10. Juni 2009 um 18:04 Uhr

  • Leider habe ich keine Berechtigung, diesen Code zu reposten.

    – Alex Reynolds

    10. Juni 2009 um 18:32 Uhr

Benutzeravatar von Ville Laurikari
Ville Laurikari

In C stellt die Verwendung einer zuvor nicht deklarierten Funktion eine implizite Deklaration der Funktion dar. Bei einer impliziten Deklaration ist der Rückgabetyp int wenn ich mich recht erinnere. Jetzt hat GCC eingebaute Definitionen für einige Standardfunktionen. Wenn eine implizite Deklaration nicht mit der integrierten Definition übereinstimmt, erhalten Sie diese Warnung.

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 nicht zu verwenden -fno-builtin-* Fahnen ggf.

Anstatt von stdlib.hdu solltest es versuchen:

#include <string.h>

Das ist wo strcpy und strncpy definiert sind, zumindest gem strcpy(2) Handbuchseite.

Das exit Funktion ist definiert in stdlib.haber ich weiß nicht, was da los ist.

  • Danke, ich muss ungefähr 20 .c-Dateien bereinigen und habe das Hinzufügen einiger Header verpasst.

    – Alex Reynolds

    10. Juni 2009 um 22:42 Uhr

  • Mein Problem beim Kompilieren eines C-Programms zum Überprüfen des Virtualisierungstyps (Xen HVM/KVM/VMware/Bare Metal) wurde behoben, cool! Vielen Dank.

    – Terry Wang

    16. Februar 2014 um 0:05 Uhr

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

Diese Fehlermeldungen bekomme ich zB beim Kompilieren des Programms phrap. Dieses Programm enthält zufällig Code, der einige eingebaute Funktionen modifiziert oder ersetzt, und wenn ich die entsprechenden Header-Dateien einfüge, um die Warnungen zu beheben, generiert GCC stattdessen eine Reihe von Fehlern. Das Beheben der Warnungen unterbricht also effektiv den Build.

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

Benutzeravatar von Eric Leschinski
Erich Leschinski

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

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

So kompiliert auf 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 $ 

Um die Warnung zu entfernen, fügen Sie diese Deklaration am Anfang der Datei hinzu:

#include <stdlib.h>

  • Lies die Frage; Er hat bereits das Hinzufügen von stdlib.h erwähnt. Aber das reicht nur für den Exit, nicht für die String-Funktionen.

    – Matt Fletcher

    4. Juli 2014 um 8:39 Uhr

  • Obwohl es mir hier geholfen hat.

    – Al-Bara El-Hag

    29. November 2020 um 4:04 Uhr

Ich traf diese Warnungen auf mempcpy Funktion. Die Manpage besagt, dass diese Funktion eine GNU-Erweiterung ist, und die Zusammenfassung zeigt:

#define _GNU_SOURCE
#include <string.h>

Wann #define wird meiner Quelle vor dem hinzugefügt #includeDeklarationen für die GNU-Erweiterungen werden sichtbar gemacht und Warnungen verschwinden.

1425080cookie-checkWarnung: inkompatible implizite Deklaration der integrierten Funktion „xyz“

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy