2011-11-01 12 views
25

जब मैं टर्मिनल से लिखना मैं एक कार्यक्रम (बुलाया ES3) संकलित करने के लिए कोशिश कर रहा हूँ, लेकिन:अपरिभाषित संदर्भ - collect2: ld लौटे 1 से बाहर निकलें स्थिति

gcc es3.c -o es3

यह इस संदेश प्रकट होता है:

/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/crt1.o: In function `_start': 
(.text+0x18): undefined reference to `main' 
collect2: ld returned 1 exit status 

मैं क्या कर सकता था?

+0

इस त्रुटि के कारण कोड पोस्ट करने के लिए एक अच्छा विचार हो सकता है। – Lundin

+1

@ ब्रांड्सस्क: जब मैं उस लिंक का पालन करता हूं, तो मुझे 45-सेकंड उलटी गिनती मिलती है। या तो अपने प्रश्न के हिस्से के रूप में कोड पोस्ट करें, या इसे एक छोटे से उदाहरण में संकीर्ण करें जो समस्या को दर्शाता है और उसे पोस्ट करता है। –

+0

ठीक है, मैंने अभी आपकी स्रोत फ़ाइल डाउनलोड की है। (1) इसे 'es3_f3.c' कहा जाता है, नहीं' es3.c'। (2) इसमें कई त्रुटियां हैं, उदाहरण के लिए लाइन 18 पर एक लापता अर्धविराम। यह संभवतः संकलित नहीं हो सका, जिसका अर्थ है कि आप जिस लिंकर त्रुटि की रिपोर्ट करते हैं उसे देखने के लिए आप पर्याप्त नहीं हो पाएंगे। हमें अपना असली कोड दिखाएं। (डाउनलोड की गई स्रोत फ़ाइल 73 लाइनें है, जो सीधे यहां पोस्ट करने के लिए काफी कम है।) –

उत्तर

38

इसका मतलब है कि es3.cmain फ़ंक्शन को परिभाषित नहीं करता है, और आप इसे निष्पादन योग्य बनाने का प्रयास कर रहे हैं। एक निष्पादन योग्य को एक प्रवेश बिंदु होना चाहिए, जिससे लिंकर शिकायत करता है।

एक वस्तु फाइल करने के लिए केवल संकलन करने के लिए, -c विकल्प का उपयोग:

gcc es3.c -c 
gcc es3.o main.c -o es3 

ऊपर एक वस्तु फाइल करने के लिए es3.c संकलित है, तो एक फ़ाइल main.c कि main समारोह होते हैं संकलित, और लिंकर विलीन हो जाती है es3.o और main.o को निष्पादन योग्य में es3 कहा जाता है।

+2

समस्या यह है कि मैं अपने कार्यक्रम के अंदर मुख्य कार्य डाल .. मुझे समझ नहीं आता क्यों ऐसा नहीं है कि कहते हैं वहाँ कोई मुख्य कार्य है ...:/अपने जवाब के लिए – bransharp

2

निष्पादन योग्य फ़ाइल को मुख्य कार्य की आवश्यकता है। हैलो वर्ल्ड डेमो के नीचे देखें।

#include <stdio.h> 
int main(void) 
{ 
     printf("Hello world!\n"); 
     return 0; 
} 

जैसा कि आप देख सकते हैं कि एक मुख्य कार्य है। यदि आप इस मुख्य कार्य नहीं है, ld "मुख्य करने के लिए अपरिभाषित संदर्भ '" रिपोर्ट करेंगे

मेरी परिणाम की जाँच करें:

$ cat es3.c 
#include <stdio.h> 
int main(void) 
{ 
    printf("Hello world!\n"); 
    return 0; 
} 
$ gcc -Wall -g -c es3.c 
$ gcc -Wall -g es3.o -o es3 
~$ ./es3 
Hello world! 

अगर वहाँ एक मुख्य प्रतीक है की जाँच करने के $ objdump -t es3.o का इस्तेमाल करें। नीचे मेरा परिणाम है।

$ objdump -t es3.o 

es3.o:  file format elf32-i386 

SYMBOL TABLE: 
00000000 l df *ABS* 00000000 es3.c 
00000000 l d .text 00000000 .text 
00000000 l d .data 00000000 .data 
00000000 l d .bss 00000000 .bss 
00000000 l d .debug_abbrev 00000000 .debug_abbrev 
00000000 l d .debug_info 00000000 .debug_info 
00000000 l d .debug_line 00000000 .debug_line 
00000000 l d .rodata  00000000 .rodata 
00000000 l d .debug_frame 00000000 .debug_frame 
00000000 l d .debug_loc  00000000 .debug_loc 
00000000 l d .debug_pubnames  00000000 .debug_pubnames 
00000000 l d .debug_aranges 00000000 .debug_aranges 
00000000 l d .debug_str  00000000 .debug_str 
00000000 l d .note.GNU-stack  00000000 .note.GNU-stack 
00000000 l d .comment  00000000 .comment 
00000000 g  F .text 0000002b main 
00000000   *UND* 00000000 puts 
+0

धन्यवाद, लेकिन मैं अपने कार्यक्रम :(अंदर मुख्य कार्य समझ में नहीं आता क्यों संकलक इसे पढ़ा नहीं है :( – bransharp

+0

मैं अपने लिनक्स पर सत्यापित किया है, कृपया इसे जांचें। – Daniel

+1

मेरा मानना ​​है कि आपके पास वास्तव में मुख्य नहीं है; यह अस्पष्ट है, प्रीप्रोसेसर द्वारा छोड़ा गया, आंतरिक या स्थैतिक बना दिया गया है ... अपनी फ़ाइल को इंडेंट करने का प्रयास करें, यह आपके लिए अधिक पठनीय होगा ... –

10

शायद आपके main फ़ंक्शन को उदाहरण के कारण टिप्पणी की गई है पूर्व प्रसंस्करण। यह जानने के लिए कि प्रीप्रोसेसिंग क्या कर रहा है, gcc -C -E es3.c > es3.i आज़माएं, फिर जेनरेट की गई फ़ाइल es3.i में एक संपादक के साथ देखें (और इसके अंदर main खोजें)।

सबसे पहले, आप हमेशा (जब से तुम एक नौसिखिया रहे हैं)

gcc -Wall -g -c es3.c 
    gcc -Wall -g es3.o -o es3 

-Wall झंडा अत्यंत महत्वपूर्ण है के साथ संकलन चाहिए, और आप हमेशा यह प्रयोग करना चाहिए। यह आपको (लगभग) सभी चेतावनियां देने के लिए कंपाइलर को बताता है। और आपको हमेशा चेतावनियों को सुनना चाहिए, यानी आपके स्रोत कोड फ़ाइल es3.C को सही करें जब तक आपको कोई और चेतावनी न मिल जाए।

-g ध्वज भी महत्वपूर्ण है, क्योंकि यह ऑब्जेक्ट फ़ाइल और निष्पादन योग्य में डिबगिंग जानकारी डालने के लिए gcc पूछता है। फिर आप अपने प्रोग्राम को डीबग करने के लिए एक डीबगर (जैसे gdb) का उपयोग करने में सक्षम हैं।

किसी ऑब्जेक्ट फ़ाइल या निष्पादन योग्य में प्रतीकों की सूची प्राप्त करने के लिए, आप nm का उपयोग कर सकते हैं।

बेशक, मुझे लगता है कि आप एक जीएनयू/लिनक्स सिस्टम का उपयोग कर रहे हैं (और यदि आप इसे पहले से उपयोग नहीं करते हैं तो मैं आपको जीएनयू/लिनक्स का उपयोग करने के लिए आमंत्रित करता हूं)।

+0

हाँ मैं Ubuntu का उपयोग कर रहा हो नहीं कर सका! मैं जाऊंगा और कोशिश कर रहा हूं कि आप क्या कह रहे हैं ..! – bransharp

0

एक संभावना जिसका अब तक उल्लेख नहीं किया गया है यह है कि आप उस फ़ाइल को संपादित नहीं कर रहे हैं जो आप सोचते हैं कि आप हैं। यानी आपके संपादक के मन में एक अलग सीडब्ल्यूडी हो सकती है।

उस फ़ाइल पर 'अधिक' चलाएं जिसे आप दो बार जांचने के लिए संकलित कर रहे हैं, यह जांचने के लिए कि वास्तव में वह सामग्री है जो आपको उम्मीद है। उम्मीद है की वो मदद करदे!

0

आप इस समस्या को हल करने के लिए बस main फ़ंक्शन जोड़ सकते हैं। बस जैसे:

int main() 
{ 
    return 0; 
} 
संबंधित मुद्दे