मैं सी प्रोग्रामिंग में नौसिखिया हूँ। इसलिए मैंने संकलन की विभिन्न प्रक्रिया सीखी (प्रीप्रोसेसिंग, संकलन, लिंकिंग)। मेरा कार्यक्रम है

#include <stdio.h>

#define testDefinition(x) printf(#x " is equal to %lf\n",x)

int main(void)
{
    testDefinition(3.15);
    return 0;
}

यह सरल प्रोग्राम है जिसका कोई मतलब नहीं है, लेकिन समस्या यह है कि जब मैं gcc -o test test.c का उपयोग करता हूं तो यह ठीक काम करता है, लेकिन जब मैं ऐसा करता हूं

gcc -E test.c -o test.i
gcc -C test.i -o test.o
gcc  test.o -o test

मुझे त्रुटि मिलती है

usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o: in function `_start':
(.text+0x24): undefined reference to `main'
collect2: error: ld returned 1 exit status

मैं उबंटू 20.04 और जीसीसी कंपाइलर का उपयोग कर रहा हूं।

0
user14479570 8 नवम्बर 2021, 15:00
बस एक IDE का उपयोग करें और इसे परिधीय कार्यों को संभालने दें जैसे कि आपके लिए समस्याएँ बनाना। मैनुअल मेक फाइल्स और कमांड लाइन बिल्डिंग 1990 के दशक की स्टाइल प्रोग्रामिंग है। यह सबसे अच्छा विषाद है और सबसे खराब पुरुषवाद।
 – 
Lundin
8 नवम्बर 2021, 15:29
मैं समझता हूं कि आपका क्या मतलब है, लेकिन सभी प्रक्रियाओं को पूरी तरह से समझने के लिए, यह "कार हुड" के तहत कैसे काम करता है, आपको इस प्रक्रिया को पूरा करना चाहिए। मैं अध्ययन कर रहा हूं और यह वास्तविक विश्वव्यापी परियोजना नहीं है जब आपको कार्य पाइपलाइन को सरल बनाने के लिए आईडीई की सभी सुविधाओं और सुविधाओं का उपयोग करना चाहिए।
 – 
Deni Streltsov
8 नवम्बर 2021, 15:52
यह "हुड के नीचे" नहीं है, यह मशीन कोड होगा। यह बल्कि है "ब्रांड एक्स की कार फैक्ट्री में जाएं और उनसे पूछें कि वे अपने विशिष्ट कार मॉडल में से एक का निर्माण करते समय किन चरणों का उपयोग कर रहे हैं"। लेकिन यह जानते हुए कि कार मैकेनिक के लिए कोई व्यावहारिक रुचि नहीं है और जब वे किसी अन्य कार ब्रांड (टूल चेन) पर स्विच करते हैं तो इससे उन्हें कोई मदद नहीं मिलेगी। बस उन्हें अपनी पसंद के अनुसार कार बनाने दें और अपना काम करने के लिए उन पर भरोसा करें।
 – 
Lundin
8 नवम्बर 2021, 15:59
मैं आपसे सहमत नहीं हूं, क्योंकि जब आप आईडीई में रन पर क्लिक करते हैं तो आपको पता नहीं होता कि कंपाइलर क्या है। जब आप इसे स्वयं करना शुरू करते हैं तो आप समझने लगते हैं कि रन बटन पर क्लिक करने से कहीं अधिक प्रक्रियाएं हैं। बेशक यह संकलन की कार्य प्रक्रिया पर बहुत गहरी समझ का स्तर नहीं है, लेकिन फिर यह बेहतर है कि विजुअल स्टूडियो या किसी आईडीई में रन बटन पर क्लिक करें।
 – 
Deni Streltsov
8 नवम्बर 2021, 16:58

1 उत्तर

सबसे बढ़िया उत्तर

test.o पहले से ही निष्पादन योग्य है, आपने -c पास नहीं किया है।

$ gcc -E test.c -o test.i
$ gcc -C test.i -o test.o
$ ./test.o
3.15 is equal ....

इसके कारण, test.o एक ELF फ़ाइल है और gcc इसे साझा पुस्तकालय के रूप में मानता है (मुझे लगता है)। क्योंकि gcc test.o -o test में कोई स्रोत फ़ाइल पास नहीं हुई है, कोई main नहीं है, इसलिए यह अपरिभाषित है।

मुझे लगता है, आप एक ऑब्जेक्ट फ़ाइल बनाने के लिए gcc -C -c test.i -o test.o करना चाहते थे।

4
KamilCuk 8 नवम्बर 2021, 15:06
धन्यवाद, मुझे यह लगभग पूरी तरह से मिल गया))))।
 – 
Deni Streltsov
8 नवम्बर 2021, 15:55