avvertenza: dichiarazione implicita incompatibile della funzione integrata 'xyz'


164

Ricevo un numero di questi avvisi durante la compilazione di alcuni file binari:

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

Per provare a risolvere questo, ho aggiunto

#include <stdlib.h>

nella parte superiore dei file C associati a questo avviso, oltre alla compilazione con i seguenti flag:

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

Sto usando GCC 4.1.2:

$ gcc --version
gcc (GCC) 4.1.2 20080704

Cosa devo fare per risolvere questi avvisi?


5
Puoi pubblicare il codice che fallisce?
MK

7
Sfortunatamente, non ho il permesso di ripubblicare questo codice.
Alex Reynolds,

Risposte:


271

In C, l'utilizzo di una funzione precedentemente non dichiarata costituisce una dichiarazione implicita della funzione. In una dichiarazione implicita, il tipo restituito è intse ricordo correttamente. Ora, GCC ha delle definizioni integrate per alcune funzioni standard. Se una dichiarazione implicita non corrisponde alla definizione integrata, viene visualizzato questo avviso.

Per risolvere il problema, è necessario dichiarare le funzioni prima di utilizzarle; normalmente lo fai includendo l'intestazione appropriata. Consiglio di non usare le -fno-builtin-*bandiere se possibile.

Invece di stdlib.h , dovresti provare:

#include <string.h>

Ecco dove strcpye strncpysono definiti, almeno secondo la strcpypagina (2) l'uomo.

La exitfunzione è definita in stdlib.h , quindi non so cosa stia succedendo lì.


Grazie, ho circa 20 file .c da pulire e ho perso l'aggiunta di alcune intestazioni.
Alex Reynolds,

Risolto il mio problema quando provavo a compilare un programma C per verificare il tipo di virtualizzazione (Xen HVM / KVM / VMware / Bare Metal), fantastico! Grazie.
Terry Wang,

16

Nel caso di alcuni programmi, questi errori sono normali e non dovrebbero essere corretti.

Ottengo questi messaggi di errore durante la compilazione del programma phrap (ad esempio). Questo programma contiene codice che modifica o sostituisce alcune funzioni integrate e quando includo i file di intestazione appropriati per correggere gli avvisi, GCC genera invece un mucchio di errori. Quindi correggere gli avvisi interrompe efficacemente la build.

Se hai la fonte come parte di una distribuzione che dovrebbe essere compilata normalmente, gli errori potrebbero essere normali. Consultare la documentazione per essere sicuri.


10

Ecco del codice C che produce l'errore sopra menzionato:

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

Compilato in questo modo su Fedora 17 Linux a 64 bit con 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 $ 

Per far sparire l'avvertimento, aggiungi questa dichiarazione all'inizio del file:

#include <stdlib.h>

6
Leggi la domanda; ha già menzionato l'aggiunta di stdlib.h. Ma è abbastanza buono per l'uscita, non per le funzioni stringa.
Matt Fletcher,

7

Ho incontrato questi avvisi sulla mempcpyfunzione. La pagina man dice che questa funzione è un'estensione GNU e la sinossi mostra:

#define _GNU_SOURCE
#include <string.h>

Quando #defineviene aggiunto alla mia fonte prima di #include, le dichiarazioni per le estensioni GNU sono rese visibili e gli avvisi scompaiono.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.