ostrzeżenie: niekompatybilna niejawna deklaracja funkcji wbudowanej „xyz”

164

Podczas kompilowania kilku plików binarnych otrzymuję kilka takich ostrzeżeń:

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

Aby spróbować rozwiązać ten problem, dodałem

#include <stdlib.h>

na górze plików C skojarzonych z tym ostrzeżeniem, oprócz kompilowania z następującymi flagami:

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

Używam GCC 4.1.2:

$ gcc --version
gcc (GCC) 4.1.2 20080704

Co mam zrobić, aby rozwiązać te ostrzeżenia?

Alex Reynolds
źródło
5
Czy możesz opublikować kod, który się nie powiedzie?
mkb
7
Niestety nie mam uprawnień do ponownego opublikowania tego kodu.
Alex Reynolds

Odpowiedzi:

271

W języku C użycie wcześniej niezadeklarowanej funkcji stanowi niejawną deklarację funkcji. W niejawnej deklaracji typem zwracanym jest, intjeśli dobrze pamiętam. Teraz GCC ma wbudowane definicje niektórych funkcji standardowych. Jeśli niejawna deklaracja nie pasuje do wbudowanej definicji, zostanie wyświetlone to ostrzeżenie.

Aby rozwiązać problem, musisz zadeklarować funkcje przed ich użyciem; zwykle robisz to, dołączając odpowiedni nagłówek. Zalecam, aby nie używać -fno-builtin-*flag, jeśli to możliwe.

Zamiast stdlib.h powinieneś spróbować:

#include <string.h>

Tam są strcpyi strncpysą zdefiniowane, przynajmniej zgodnie ze strcpystroną podręcznika (2).

exitFunkcja jest zdefiniowana w stdlib.h , choć, więc nie wiem, co się tam dzieje.

Ville Laurikari
źródło
Dzięki, mam około 20 plików .c do wyczyszczenia i nie dodałem kilku nagłówków.
Alex Reynolds
Rozwiązałem mój problem podczas próby skompilowania programu w C w celu sprawdzenia typu wirtualizacji (Xen HVM / KVM / VMware / Bare Metal), super! Dzięki.
Terry Wang,
16

W przypadku niektórych programów te błędy są normalne i nie należy ich naprawiać.

Otrzymuję te komunikaty o błędach podczas kompilowania frazy programu (na przykład). Ten program zawiera kod, który modyfikuje lub zastępuje niektóre wbudowane funkcje, a kiedy dołączam odpowiednie pliki nagłówkowe, aby naprawić ostrzeżenia, zamiast tego GCC generuje kilka błędów. Zatem naprawienie ostrzeżeń skutecznie psuje kompilację.

Jeśli masz źródło jako część dystrybucji, która powinna się normalnie kompilować, błędy mogą być normalne. Zapoznaj się z dokumentacją, aby się upewnić.

Brandon
źródło
10

Oto kod w C, który powoduje powyższy błąd:

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

Skompilowany w ten sposób w Fedorze 17 Linux 64-bit z 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 $ 

Aby ostrzeżenie zniknęło, dodaj tę deklarację na początku pliku:

#include <stdlib.h>
Eric Leschinski
źródło
6
Przeczytaj pytanie; on już wspomniał o dodaniu stdlib.h. Ale to wystarczy tylko do wyjścia, a nie do funkcji łańcuchowych.
Matt Fletcher,
7

Spotkałem się z tymi ostrzeżeniami dotyczącymi mempcpyfunkcji. Strona man mówi, że ta funkcja jest rozszerzeniem GNU, a streszczenie pokazuje:

#define _GNU_SOURCE
#include <string.h>

Kiedy #definejest dodany do mojego źródła przed #include, deklaracje rozszerzeń GNU są widoczne, a ostrzeżenia znikają.

ajlittoz
źródło