2009-06-10 19 views
143

sto ottenendo un certo numero di questi avvertimenti quando si compila un paio di binari:warning: incompatibili dichiarazione implicita di funzione built-in 'xyz'

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 cercare di risolvere questo, ho aggiunto

#include <stdlib.h> 

nella parte superiore del file C associati a questo avviso, oltre a compilare con i seguenti flag:

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

Sto utilizzando GCC 4.1.2:

$ gcc --version 
gcc (GCC) 4.1.2 20080704 

Cosa devo fare per risolvere questi avvertimenti?

+5

Puoi pubblicare il codice che fallisce? – mkb

+7

Sfortunatamente, non ho il permesso di ripubblicare questo codice. –

risposta

238

In C, l'utilizzo di una funzione precedentemente non dichiarata costituisce una dichiarazione implicita della funzione. In una dichiarazione implicita, il tipo restituito è int se ricordo correttamente. Ora, GCC ha definizioni integrate per alcune funzioni standard. Se una dichiarazione implicita non corrisponde alla definizione built-in, si ottiene questo avviso.

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

Invece di stdlib.h, si dovrebbe cercare

#include <string.h> 

Ecco dove strcpy e strncpy sono definiti, almeno secondo la strcpy (2) pagina man.

La funzione exit è definita in stdlib.h, tuttavia, quindi non so cosa sta succedendo lì.

+0

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

+0

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

17

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

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

Se si ottiene l'origine come parte di una distribuzione che dovrebbe essere compilata normalmente, gli errori potrebbero essere normali. Consulta la documentazione per essere sicuro.

11

Ecco po 'di codice C che produce l'errore sopra citato:

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

compilati come questo su Fedora 17 Linux a 64 bit con gcc:

[email protected] ~/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] 
[email protected] ~/foo2 $ ./n 
[email protected] ~/foo2 $ 

Per rendere l'avvertimento andare via, aggiungi questa dichiarazione all'inizio del file:

#include <stdlib.h> 
+5

Leggi la domanda; ha già detto di aggiungere stdlib.h. Ma questo è abbastanza buono per l'uscita, non per le funzioni di stringa. –

6

Ho ricevuto questi avvisi sulla funzione mempcpy.pagina man dice che questa funzione è una distribuzione GNU estensione e sinossi spettacoli:

#define _GNU_SOURCE 
#include <string.h> 

Quando #define si aggiunge alla mia fonte prima della #include, dichiarazioni per le estensioni GNU sono resi visibili e gli avvisi scompaiono.

Problemi correlati