2009-06-10 11 views
143

Dostaję liczbę tych ostrzeżeń podczas kompilacji kilku plików binarnych:ostrzeżenie: niejawna deklaracja niezgodna z wbudowaną funkcją „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’ 

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

#include <stdlib.h> 

na górze plików C związanych z tym ostrzeżeniem, oprócz kompilacji z następujących flag:

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 należy zrobić, aby rozwiązać te ostrzeżenia?

+5

Czy możesz opublikować kod, który się nie powiedzie? – mkb

+7

Niestety, nie mam uprawnień do ponownego opublikowania tego kodu. –

Odpowiedz

238

W języku C użycie poprzednio niezadeklarowanej funkcji stanowi domyślną deklarację funkcji. W domniemanej deklaracji typem zwracanym jest int, jeśli dobrze pamiętam. Teraz GCC ma wbudowane definicje niektórych standardowych funkcji. Jeśli domyślna deklaracja nie pasuje do definicji wbudowanej, otrzymujesz to ostrzeżenie.

Aby rozwiązać problem, musisz zadeklarować funkcje przed ich użyciem; zwykle robisz to, włączając odpowiedni nagłówek. W miarę możliwości nie polecam używania flag -ofno-wbudowanych- *.

Zamiast stdlib.h, należy spróbować

#include <string.h> 

To gdzie strcpy i strncpy są zdefiniowane, przynajmniej według strcpy (2) Strona człowiekiem.

Funkcja exit jest zdefiniowana w pliku stdlib.h, więc nie wiem, co się tam dzieje.

+0

Dzięki, mam około 20 plików .cc do posprzątania i pominięto dodawanie nagłówków. –

+0

Rozwiązałem problem podczas próby skompilowania programu C w celu sprawdzenia typu wirtualizacji (Xen HVM/KVM/VMware/Bare Metal), fajnie! Dzięki. –

17

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

Otrzymuję te komunikaty o błędach podczas kompilowania programu phrap (na przykład). Ten program zawiera kod, który modyfikuje lub zamienia niektóre wbudowane funkcje, a kiedy dołączę odpowiednie pliki nagłówkowe, aby naprawić ostrzeżenia, GCC zamiast tego generuje mnóstwo błędów. Naprawianie ostrzeżeń skutecznie łamie kompilację.

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

11

Oto kod C, który wytwarza wyżej wymieniony błąd:

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

skompilowanego tak na Fedorze 17 Linux 64 bit z 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 $ 

Aby ostrzeżenie iść dalej, dodaj tę deklarację na górze pliku:

#include <stdlib.h> 
+5

Przeczytaj pytanie; wspomniał już o dodaniu stdlib.h. Ale to wystarczy tylko do wyjścia, a nie do funkcji ciągów. –

6

Napotkałem te ostrzeżenia na funkcję mempcpy.Strona człowiek mówi ta funkcja jest GNU rozszerzeń i SKŁADNIA pokazuje:

#define _GNU_SOURCE 
#include <string.h> 

Kiedy #define dodaje do mojego źródła przed #include, deklaracje dla rozszerzenia GNU są widoczne i ostrzeżenia znikają.

Powiązane problemy