peringatan: deklarasi implisit yang tidak kompatibel dari fungsi bawaan 'xyz'

164

Saya mendapatkan sejumlah peringatan ini ketika menyusun beberapa biner:

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

Untuk mencoba menyelesaikan ini, saya telah menambahkan

#include <stdlib.h>

di bagian atas file C yang terkait dengan peringatan ini, selain mengkompilasi dengan flag berikut:

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

Saya menggunakan GCC 4.1.2:

$ gcc --version
gcc (GCC) 4.1.2 20080704

Apa yang harus saya lakukan untuk menyelesaikan peringatan ini?

Alex Reynolds
sumber
5
Bisakah Anda memposting kode yang gagal?
mkb
7
Sayangnya, saya tidak memiliki izin untuk memposting ulang kode ini.
Alex Reynolds

Jawaban:

271

Dalam C, menggunakan fungsi yang sebelumnya tidak dideklarasikan merupakan deklarasi implisit fungsi. Dalam deklarasi implisit, tipe kembali adalah intjika saya ingat dengan benar. Sekarang, GCC memiliki definisi bawaan untuk beberapa fungsi standar. Jika deklarasi implisit tidak cocok dengan definisi bawaan, Anda mendapatkan peringatan ini.

Untuk memperbaiki masalah, Anda harus mendeklarasikan fungsi-fungsi sebelum menggunakannya; biasanya Anda melakukan ini dengan memasukkan tajuk yang sesuai. Saya sarankan untuk tidak menggunakan -fno-builtin-*bendera jika memungkinkan.

Alih-alih stdlib.h , Anda harus mencoba:

#include <string.h>

Di situlah strcpydan strncpydidefinisikan, setidaknya menurut halaman manual strcpy(2).

The exitFungsi didefinisikan dalam stdlib.h , meskipun, jadi saya tidak tahu apa yang terjadi di sana.

Ville Laurikari
sumber
Terima kasih, saya memiliki sekitar 20 file .c untuk membersihkan dan melewatkan menambahkan beberapa header.
Alex Reynolds
Memecahkan masalah saya ketika mencoba menyusun program C untuk memeriksa jenis virtualisasi (Xen HVM / KVM / VMware / Bare Metal), keren! Terima kasih.
Terry Wang
16

Dalam kasus beberapa program, kesalahan ini normal dan tidak boleh diperbaiki.

Saya mendapatkan pesan kesalahan ini saat mengkompilasi phrap program (misalnya). Program ini kebetulan berisi kode yang mengubah atau menggantikan beberapa fungsi bawaan, dan ketika saya menyertakan file header yang sesuai untuk memperbaiki peringatan, GCC malah menghasilkan banyak kesalahan. Jadi memperbaiki peringatan secara efektif merusak pembangunan.

Jika Anda mendapatkan sumber sebagai bagian dari distribusi yang harus dikompilasi secara normal, kesalahan mungkin normal. Konsultasikan dokumentasi untuk memastikan.

Brandon
sumber
10

Berikut adalah beberapa kode C yang menghasilkan kesalahan yang disebutkan di atas:

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

Dikompilasi seperti ini di Fedora 17 Linux 64 bit dengan 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 $ 

Untuk menghilangkan peringatan, tambahkan deklarasi ini ke bagian atas file:

#include <stdlib.h>
Eric Leschinski
sumber
6
Baca pertanyaannya; dia sudah disebutkan menambahkan stdlib.h. Tapi itu hanya cukup baik untuk keluar, bukan untuk fungsi string.
Matt Fletcher
7

Saya bertemu peringatan ini pada mempcpyfungsi. Halaman manual mengatakan fungsi ini adalah ekstensi GNU dan sinopsis menunjukkan:

#define _GNU_SOURCE
#include <string.h>

Ketika #defineditambahkan ke sumber saya sebelum #include, deklarasi untuk ekstensi GNU dibuat terlihat dan peringatan menghilang.

ajlittoz
sumber