दिलचस्प पोस्ट
कैसे bcrypt बनाया है में नमक? उसी डोमेन पर कोर त्रुटि? पायथन में कक्षा विधि अंतर: बाउंड, अनबाउंड और स्थिर सर्वर प्रकार का कोई आवृत उदाहरण सुलभ है वापसी अपवाद खाती है कैसे jQuery का उपयोग कर कुंजीपटल पर दबाने का पता लगाने के लिए? जावास्क्रिप्ट कस्टम इवेंट श्रोता जावा वेब अनुप्रयोग में सत्र की समय सीमा समाप्त होने पर लॉगिन पृष्ठ पर कैसे पुनर्निर्देशित किया जाता है? सुरक्षित एसक्यूएल नामों का उपयोग कैसे करें? मैं जावास्क्रिप्ट ऑब्जेक्ट से संपत्ति कैसे निकालूं? अवैध स्ट्रिंग ऑफसेट चेतावनी PHP JSF कार्यान्वयन और घटक पुस्तकालय JQuery के साथ दूरस्थ सामग्री को पार्स करने के लिए सबसे अच्छा अभ्यास क्या है? अक्षांश और देशांतर को दशमलव मानों में परिवर्तित करना मैं जावा में डबल से दो दशमलव स्थानों को कैसे गोल करूं?

`पाप` के अपरिभाषित संदर्भ

मेरे पास निम्न कोड है (इस सवाल के लिए बेअर मूल बातें नीचे छीन लिया या है):

#include<stdio.h> #include<math.h> double f1(double x) { double res = sin(x); return 0; } /* The main function */ int main(void) { return 0; } 

जब इसे gcc test.c साथ संकलित किया जाए तो मुझे निम्नलिखित त्रुटि मिलती है, और मैं इसे क्यों नहीं चला सकता:

 /tmp/ccOF5bis.o: In function `f1': test2.c:(.text+0x13): undefined reference to `sin' collect2: ld returned 1 exit status 

हालांकि, मैंने विभिन्न परीक्षण कार्यक्रमों को लिखा है जो main फ़ंक्शन के भीतर से sin को कहते हैं, और ये काम पूरी तरह से करते हैं। मुझे यहाँ कुछ स्पष्ट रूप से गलत करना होगा – लेकिन यह क्या है?

वेब के समाधान से एकत्रित समाधान "`पाप` के अपरिभाषित संदर्भ"

आपने अपने कोड को सही math.h हैडर फ़ाइल के संदर्भ के साथ संकलित किया है, लेकिन जब आप इसे लिंक करने का प्रयास किया, तो आप गणित पुस्तकालय को शामिल करने का विकल्प भूल गए। नतीजतन, आप अपनी .o ऑब्जेक्ट फाइलों को संकलित कर सकते हैं, लेकिन अपने निष्पादन योग्य नहीं बना सकते हैं।

जैसा कि पॉल ने पहले ही उल्लेख किया है कि उस चरण में गणित पुस्तकालय से लिंक करने के लिए " -lm " जोड़ें, जहां आप अपने निष्पादन योग्य उत्पन्न करने का प्रयास कर रहे हैं।

टिप्पणी में , linuxD पूछता है:

क्यों sin() <math.h> , हमें स्पष्ट रूप से -lm विकल्प की आवश्यकता है; लेकिन, <stdio.h> में printf() लिए नहीं?

चूंकि इन दोनों कार्यों को "एकल यूनिक्स विशिष्टता" के भाग के रूप में कार्यान्वित किया गया है इस मानक का यह इतिहास दिलचस्प है और इसे कई नाम (आईईईई एसटीडी 1003.1, एक्स / ओपन पोर्टेबिलिटी गाइड, पॉसिक्स, स्पेक 1170) के द्वारा जाना जाता है।

यह मानक, विशेष रूप से "मानक सी गणितीय पुस्तकालय" रूटीन (पृष्ठ 277) से "मानक सी लाइब्रेरी" रूटीन को अलग करता है । उचित मार्ग नीचे कॉपी किया गया है:

स्टैंडर्ड सी लाइब्रेरी

बाहरी संदर्भों को हल करने के लिए मानक सी लाइब्रेरी को cc द्वारा स्वचालित रूप से खोजा जाता है। यह लाइब्रेरी बेस सिस्टम के सभी इंटरफेस का समर्थन करता है, जैसा कि माप 1 में वर्णित है, मठ routines को छोड़कर।

मानक सी गणितीय पुस्तकालय

यह लाइब्रेरी बेस सिस्टम गणित रूटीन का समर्थन करता है, जैसा कि वॉल्यूम 1 में परिभाषित किया गया है। -lm option -lm इस लाइब्रेरी को खोजने के लिए उपयोग किया जाता है।

इस अलगाव के पीछे तर्क कई कारकों से प्रभावित था:

  1. यूनिक्स युद्धों की वजह से मूल एटी एंड टी यूनिक्स की भेंट में बढ़ोतरी हुई।
  2. यूनिक्स प्लेटफार्मों की संख्या में ऑपरेटिंग सिस्टम के लिए सॉफ्टवेयर विकसित करने में कठिनाई हुई।
  3. सॉफ़्टवेयर डेवलपर्स के लिए निम्नतम आम परिभाषा को परिभाषित करने का प्रयास लॉन्च किया गया, जिसे 1988 POSIX कहा गया था।
  4. अधिक प्लेटफार्म तक पहुंचने के लिए सॉफ़्टवेयर डेवलपर्स ने "POSIX आज्ञाकारी सिस्टम" पर अपने सॉफ़्टवेयर को प्रदान करने के लिए POSIX मानक के विरुद्ध प्रोग्राम किया है।
  5. यूनिक्स ग्राहकों ने सॉफ्टवेयर चलाने के लिए "पॉसिक्स आज्ञाकारी" यूनिक्स सिस्टम की मांग की

एक अलग पुस्तकालय में -lm डाल करने के फैसले में खिलाया गया दबाव शायद शामिल है, लेकिन इसमें सीमित नहीं है:

  1. यह नीचे लिबसी के आकार को रखने का एक अच्छा तरीका है, क्योंकि कई एप्लिकेशन गणित पुस्तकालय में एम्बेडेड कार्यों का उपयोग नहीं करते हैं।
  2. यह गणित पुस्तकालय कार्यान्वयन में लचीलापन प्रदान करता है, जहां कुछ गणित पुस्तकालय बड़े एम्बेडेड लुकअप तालिकाओं पर भरोसा करते हैं जबकि अन्य छोटे लुकअप तालिकाओं (कंप्यूटिंग समाधान) पर भरोसा कर सकते हैं।
  3. सचमुच आकार के बाध्य अनुप्रयोगों के लिए, यह गणित पुस्तकालय के एक गैर-मानक तरीके से (जैसे कि सिर्फ sin() खींच कर और एक कस्टम निर्मित लाइब्रेरी में लगाया जाता है।

किसी भी स्थिति में, यह अब सी भाषा के हिस्से के रूप में स्वचालित रूप से शामिल नहीं होने के मानक का हिस्सा है, और यही कारण है कि आपको जोड़ना चाहिए -lm

मेरे साथ-साथ समस्या भी है- एलएम जोड़ा गया

 gcc -Wall -lm mtest.c -o mtest.o mtest.c: In function 'f1': mtest.c:6:12: warning: unused variable 'res' [-Wunused-variable] /tmp/cc925Nmf.o: In function `f1': mtest.c:(.text+0x19): undefined reference to `sin' collect2: ld returned 1 exit status 

मुझे हाल ही में पता चला है कि अगर आप पहले निर्दिष्ट करते हैं – एलएम आदेश के मामलों:

 gcc mtest.c -o mtest.o -lm 

बस समस्याओं के बिना लिंक

तो आपको पुस्तकालयों को बाद में निर्दिष्ट करना होगा।

आपको गणित पुस्तकालय, libm से लिंक करने की आवश्यकता है:

 $ gcc -Wall foo.c -o foo -lm 

मेरे पास यही समस्या थी, जो मेरी लाइब्रेरी पिछली बार सूचीबद्ध करने के बाद चले गए: जीसीसी प्रोग.c-एलएम