uyarı: yerleşik 'xyz' işlevinin uyumsuz örtülü bildirimi


164

Birkaç ikili dosya derlerken bu uyarıların bir kısmını alıyorum:

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

Bu sorunu çözmek için şunu ekledim:

#include <stdlib.h>

aşağıdaki bayraklarla derlemeye ek olarak, bu uyarıyla ilişkili C dosyalarının üst kısmında:

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

GCC 4.1.2 kullanıyorum:

$ gcc --version
gcc (GCC) 4.1.2 20080704

Bu uyarıları çözmek için ne yapmalıyım?


5
Başarısız olan kodu gönderebilir misiniz?
mkb

7
Ne yazık ki, bu kodu yeniden yayınlama iznim yok.
Alex Reynolds

Yanıtlar:


271

C'de, daha önce bildirilmemiş bir fonksiyon kullanmak, fonksiyonun örtülü bir beyanını oluşturur. Kapalı bir bildiride, intdoğru bir şekilde hatırlıyorsam dönüş türü olur . Şimdi, GCC bazı standart fonksiyonlar için yerleşik tanımlara sahiptir. Örtülü bir bildirim yerleşik tanımla eşleşmezse, bu uyarıyı alırsınız.

Sorunu çözmek için, işlevleri kullanmadan önce bildirmeniz gerekir; normalde bunu uygun üstbilgiyi ekleyerek yaparsınız. -fno-builtin-*Mümkünse bayrakları kullanmamanızı tavsiye ederim .

Stdlib.h yerine şunu denemelisiniz:

#include <string.h>

Yani nerede strcpyve strncpy, tanımlanmıştır göre en az strcpy(2) man sayfası.

exitFonksiyon tanımlanır stdlib.h orada neler olduğunu bilmiyorum, ama,.


Teşekkürler, temizlemek için yaklaşık 20 .c dosyam var ve bazı başlıklar eklemeyi özledim.
Alex Reynolds

Sanallaştırma türünü (Xen HVM / KVM / VMware / Bare Metal) kontrol etmek için bir C programı derlemeye çalışırken sorunumu çözdüm! Teşekkürler.
Terry Wang

16

Bazı programlarda bu hatalar normaldir ve düzeltilmemelidir.

Program hatalarını derlerken bu hata mesajlarını alıyorum (örneğin). Bu program, bazı yerleşik işlevleri değiştiren veya değiştiren kod içerir ve uyarıları düzeltmek için uygun başlık dosyalarını eklediğimde, GCC bunun yerine bir grup hata oluşturur. Böylece uyarıları düzeltmek etkili bir şekilde yapıyı bozar.

Kaynağı normal olarak derlenmesi gereken bir dağıtımın parçası olarak aldıysanız, hatalar normal olabilir. Emin olmak için belgelere bakın.


10

Yukarıda belirtilen hatayı üreten bazı C kodu:

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

Gcc ile Fedora 17 Linux 64 bit üzerinde şöyle derlendi:

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 $ 

Uyarının kaldırılması için bu bildirimi dosyanın üstüne ekleyin:

#include <stdlib.h>

6
Soruyu okuyun; stdlib.h eklemesinden zaten bahsetti. Ancak bu yalnızca dize işlevleri için değil, yalnızca çıkış için yeterlidir.
Matt Fletcher

7

İşle ilgili bu uyarılarla karşılaştım mempcpy. Man sayfası, bu işlevin bir GNU uzantısı olduğunu ve özetin şunları gösterdiğini söylüyor:

#define _GNU_SOURCE
#include <string.h>

Ne zaman #defineönce Kaynağıma eklenir #include, GNU uzantıları için bildirimleri görünür yapılır ve uyarılar kaybolur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.