मैं "जीसीसी का परिचय" नामक पुस्तक पढ़ रहा हूं और कुछ स्पष्टीकरण चाहूंगा। पुस्तक इंगित करता है कि कोड के नीचे एक त्रुटि कारण होगा लेकिन जब मैं संकलन, यह बनाता है और पूरी तरह से चलाता है:स्थिर पुस्तकालयों के साथ जीसीसी लिंकिंग
#include <math.h>
#include <stdio.h>
int main (void) {
double x = sqrt (2.0);
printf ("The square root of 2.0 is %f\n", x);
return 0;
}
मैं किताब से बोली "इस स्रोत अकेले फ़ाइल से एक निष्पादन योग्य बनाने के लिए कोशिश कर रहा है लिंक चरण में एक त्रुटि देने के लिए संकलक का कारण बनता है: "
$ gcc -Wall calc.c -o calc
/tmp/ccbR6Ojm.o: In function `main':
/tmp/ccbR6Ojm.o(.text+0x19): undefined reference
to `sqrt'
समाधान है कि इस पुस्तक देता है कि आप गणित पुस्तकालय 'libm.a लिए पथ शामिल करने की अपेक्षा की जाती है 'के रूप में इस प्रकार है:
$ gcc -Wall calc.c /usr/lib/libm.a -o calc
यह पथ पुस्तकालयों है कि हम अपने कार्यक्रमों में उपयोग में बनाया करने के लिए निर्दिष्ट करने के लिए बहुत असुविधाजनक होगा। मैं अपने स्वयं के कस्टम पुस्तकालयों को पथ जोड़ने का कारण समझ सकता हूं, लेकिन libm.a जीसीसी में बनाया गया है। और हालांकि पुस्तक काफी पुरानी है (2004 में प्रकाशित), जीसीसी के अधिक आधुनिक संस्करणों के साथ क्या बदल गया है, ताकि हमें libm.a पर पथ शामिल करने की आवश्यकता न हो?
* अद्यतन *
मैंने देखा है कि इस सवाल का जवाब taskinoor द्वारा दिए गए कोड की आवश्यकता है कि है कि मैं -lm ध्वज का उपयोग करता है, तो() मान sqrt के लिए पारित संकलन समय पर नहीं जाना जाता है अद्यतन दर्शाता।
मैंने वीएस का उपयोग करके सी/सी ++ सीखा लेकिन मेरा लक्ष्य अब जीसीसी सीखना और उपयोग करना है। मेरे पास विजुअल स्टूडियो 2013 है और वीएस कंपाइलर/लिंकर इतना picky प्रतीत नहीं होता है। उदाहरण के लिए, मैं रहस्यमय कंपाइलर झंडे निर्दिष्ट किए बिना किसी भी साधारण कार्यक्रम के बारे में संकलित करने में सक्षम हूं। मैं
मैं जीसीसी संस्करण 5.4 कि Kubuntu 16.04.1
सबसे पहले, एक अलग पुस्तक आज़माएं क्योंकि दशकों से, गणित पुस्तकालय को जोड़ने का मानक तरीका पुस्तकालय के पूर्ण पथ के बजाय -lm का उपयोग करना है। दूसरा, https://gcc.gnu.org/releases.html में रिलीज़ परिवर्तन शामिल हैं। –
@ जॉन ग्रिफिन: एक ही पुस्तक से: * "कमांड लाइन पर लंबे पथ निर्दिष्ट करने की आवश्यकता से बचने के लिए, कंपाइलर पुस्तकालयों के खिलाफ जोड़ने के लिए एक शॉर्ट-कट विकल्प '-l' प्रदान करता है। उदाहरण के लिए, निम्न आदेश, ' $ gcc -Wall calc.c -lm -o calc' मूल कमांड के समतुल्य है ... "* –
ध्यान दें कि इन दिनों डिफ़ॉल्ट डायनामिक लाइब्रेरी से लिंक करना है, न कि स्थिर पुस्तकालयों। शायद आप के बारे में पूछने के लिए क्या मतलब था * मानक * पुस्तकालयों से जुड़ा हुआ था? – Barmar