चेतावनी: अंतर्निहित कार्य 'xyz' की असंगत निहित घोषणा


164

कुछ बायनेरिज़ का संकलन करते समय मुझे इन चेतावनियों का एक नंबर मिल रहा है:

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

इसे हल करने की कोशिश करने के लिए, मैंने जोड़ा है

#include <stdlib.h>

इस झंडे से जुड़ी सी फाइलों के शीर्ष पर, निम्नलिखित झंडे के साथ संकलन के अलावा:

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

मैं GCC 4.1.2 का उपयोग कर रहा हूं:

$ gcc --version
gcc (GCC) 4.1.2 20080704

इन चेतावनियों को हल करने के लिए मुझे क्या करना चाहिए?


5
क्या आप उस कोड को पोस्ट कर सकते हैं जो विफल रहता है?
mkb

7
दुर्भाग्यवश, मेरे पास इस कोड को रीपोस्ट करने की अनुमति नहीं है।
एलेक्स रेनॉल्ड्स

जवाबों:


271

सी में, पहले से अघोषित फ़ंक्शन का उपयोग करने से फ़ंक्शन की अंतर्निहित घोषणा होती है। एक अंतर्निहित घोषणा में, वापसी प्रकार intयदि मुझे सही ढंग से याद है। अब, जीसीसी ने कुछ मानक कार्यों के लिए अंतर्निहित परिभाषाएं बनाई हैं। यदि एक अंतर्निहित घोषणा अंतर्निहित परिभाषा से मेल नहीं खाती है, तो आपको यह चेतावनी मिलती है।

समस्या को ठीक करने के लिए, आपको उनका उपयोग करने से पहले कार्यों को घोषित करना होगा; आम तौर पर आप इसे उपयुक्त हेडर को शामिल करके करते हैं। मेरा सुझाव है कि -fno-builtin-*यदि संभव हो तो झंडे का उपयोग न करें ।

Stdlib.h के बजाय , आपको प्रयास करना चाहिए:

#include <string.h>

यही कारण है कि जहां है strcpyऔर strncpy, परिभाषित कर रहे हैं के अनुसार कम से कम strcpy(2) आदमी पेज।

exitसमारोह में परिभाषित किया गया है stdlib.h , हालांकि, इसलिए मैं नहीं जानता कि क्या वहाँ हो रहा है।


धन्यवाद, मेरे पास साफ करने के लिए लगभग 20 .c फाइलें हैं और कुछ हेडर जोड़ने से चूक गए हैं।
एलेक्स रेनॉल्ड्स

वर्चुअलाइजेशन प्रकार (एक्सएन एचवीएम / केवीएम / वीएमवेयर / बेयर मेटल) की जांच करने के लिए सी प्रोग्राम को संकलित करने की कोशिश करते समय मेरे मुद्दे को हल किया, अच्छा! धन्यवाद।
टेरी वांग

16

कुछ कार्यक्रमों के मामले में, ये त्रुटियां सामान्य हैं और इन्हें ठीक नहीं किया जाना चाहिए।

प्रोग्राम फ़्रेप (उदाहरण के लिए) को संकलित करते समय मुझे ये त्रुटि संदेश मिलते हैं। इस प्रोग्राम में ऐसा कोड होता है जो कुछ निर्मित कार्यों को संशोधित या प्रतिस्थापित करता है, और जब मैं चेतावनियों को ठीक करने के लिए उपयुक्त हेडर फाइलें शामिल करता हूं, तो इसके बजाय GCC त्रुटियों का एक समूह बनाता है। इसलिए चेतावनियों को ठीक करने से बिल्ड को प्रभावी ढंग से तोड़ दिया जाता है।

यदि आपको स्रोत वितरण के हिस्से के रूप में मिला है जिसे सामान्य रूप से संकलित करना चाहिए, तो त्रुटियाँ सामान्य हो सकती हैं। सुनिश्चित करने के लिए प्रलेखन से परामर्श करें।


10

यहाँ कुछ C कोड है जो उपर्युक्त त्रुटि उत्पन्न करता है:

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

इस तरह संकलित Fedora 17 लिनक्स 64 बिट के साथ जीसीसी:

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 $ 

चेतावनी को दूर करने के लिए, इस घोषणा को फ़ाइल के शीर्ष पर जोड़ें:

#include <stdlib.h>

6
प्रश्न पढ़ें; उन्होंने पहले से ही stdlib.h को जोड़ने का उल्लेख किया है। लेकिन यह केवल निकास के लिए पर्याप्त है, स्ट्रिंग कार्यों के लिए नहीं।
मैट फ्लेचर

7

मैं इन चेतावनियों को mempcpyफंक्शन पर मिला । मैन पेज कहता है कि यह फ़ंक्शन GNU एक्सटेंशन और सिनॉप्सिस शो है:

#define _GNU_SOURCE
#include <string.h>

जब #defineमेरे स्रोत से पहले जोड़ा जाता है #include, तो GNU एक्सटेंशन के लिए घोषणाएं दिखाई जाती हैं और चेतावनी गायब हो जाती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.