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?
c
gcc
gcc-warning
Alex Reynolds
sumber
sumber
Jawaban:
Dalam C, menggunakan fungsi yang sebelumnya tidak dideklarasikan merupakan deklarasi implisit fungsi. Dalam deklarasi implisit, tipe kembali adalah
int
jika 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:
Di situlah
strcpy
danstrncpy
didefinisikan, setidaknya menurut halaman manualstrcpy
(2).The
exit
Fungsi didefinisikan dalam stdlib.h , meskipun, jadi saya tidak tahu apa yang terjadi di sana.sumber
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.
sumber
Berikut adalah beberapa kode C yang menghasilkan kesalahan yang disebutkan di atas:
Dikompilasi seperti ini di Fedora 17 Linux 64 bit dengan gcc:
Untuk menghilangkan peringatan, tambahkan deklarasi ini ke bagian atas file:
sumber
Saya bertemu peringatan ini pada
mempcpy
fungsi. Halaman manual mengatakan fungsi ini adalah ekstensi GNU dan sinopsis menunjukkan:Ketika
#define
ditambahkan ke sumber saya sebelum#include
, deklarasi untuk ekstensi GNU dibuat terlihat dan peringatan menghilang.sumber