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?
c
gcc
gcc-warning
Alex Reynolds
źródło
źródło
Odpowiedzi:
W języku C użycie wcześniej niezadeklarowanej funkcji stanowi niejawną deklarację funkcji. W niejawnej deklaracji typem zwracanym jest,
int
jeś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ć:
Tam są
strcpy
istrncpy
są zdefiniowane, przynajmniej zgodnie zestrcpy
stroną podręcznika (2).exit
Funkcja jest zdefiniowana w stdlib.h , choć, więc nie wiem, co się tam dzieje.źródło
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ć.
źródło
Oto kod w C, który powoduje powyższy błąd:
Skompilowany w ten sposób w Fedorze 17 Linux 64-bit z gcc:
Aby ostrzeżenie zniknęło, dodaj tę deklarację na początku pliku:
źródło
Spotkałem się z tymi ostrzeżeniami dotyczącymi
mempcpy
funkcji. Strona man mówi, że ta funkcja jest rozszerzeniem GNU, a streszczenie pokazuje:Kiedy
#define
jest dodany do mojego źródła przed#include
, deklaracje rozszerzeń GNU są widoczne, a ostrzeżenia znikają.źródło