2012-01-25 19 views
8

मैं गणित कार्यों का उपयोग करने वाले कुछ कोड बनाने की कोशिश कर रहा हूं (उदा। pow)।जीसीसी और गणित के अजीब व्यवहार। एच?

math.h शामिल है, और ध्वज -lm निर्माण के दौरान उपयोग किया जाता है।

संकलन इस तरह कहा जाता है जब (आदेश की शुरुआत में -lm झंडा), यह विफल रहा है कह pow के लिए एक अपरिभाषित संदर्भ है कि वहाँ,:

gcc -lm -O3 main.o clustering.o grassberger.o hash.o list.o mat.o metropolis.o motif_ids.o output.o permutation.o prob.o random.o results.o role.o stubs.o switches.o -o mfinder 
main.o: In function `get_sn_motif_id': 
main.c:(.text+0x28d): undefined reference to `pow' 

और जब -lm ध्वज पर डाल दिया जाता है कॉमांड का अंत, यह काम करता है!

gcc -O3 main.o clustering.o grassberger.o hash.o list.o mat.o metropolis.o motif_ids.o output.o permutation.o prob.o random.o results.o role.o stubs.o switches.o -o mfinder -lm 

यह सामान्य है?

+0

ओह। ध्यान नहीं दिया कि यह एक पुराना सवाल है। – AnT

उत्तर

18

हां, यह सामान्य है। कई लिंकर्स के लिए, ऑर्डर जिसमें आप ऑब्जेक्ट फाइलें निर्दिष्ट करते हैं और पुस्तकालय मायने रखते हैं।

"An Introduction to GCC - for the GNU compilers gcc and g++" के शब्दों में:

linkers के पारंपरिक व्यवहार बाहरी कार्यों के लिए खोज करने के लिए पुस्तकालयों कमांड लाइन पर निर्दिष्ट में बाएं से दाएं है। इसका अर्थ यह है कि किसी फ़ंक्शन की परिभाषा वाली लाइब्रेरी किसी भी स्रोत फ़ाइलों या ऑब्जेक्ट फ़ाइलों के बाद दिखाई देनी चाहिए। निम्न कमांड में दिखाया गया है यह, लघु कटौती -l विकल्प के साथ निर्दिष्ट लाइब्रेरी शामिल है:

$ gcc -Wall calc.c -lm -o calc (correct order)

यह व्यवहार आम है, लेकिन कोई सार्वभौमिक तरह से है। संदेह में, अपने लिंकर के मैनुअल से परामर्श करना सबसे अच्छा है। उदाहरण के लिए, मेरी Ubuntu पर man ld कहा गया है कि:

-l namespec 
    --library=namespec 

     ... 

     The linker will search an archive only once, at the location where 
     it is specified on the command line. If the archive defines a 
     symbol which was undefined in some object which appeared before the 
     archive on the command line, the linker will include the 
     appropriate file(s) from the archive. However, an undefined symbol 
     in an object appearing later on the command line will not cause the 
     linker to search the archive again. 

दूसरे शब्दों में, इस लिंकर ढंग gcc पुस्तक में वर्णित से व्यवहार करता है।

+0

हालांकि यह उल्लेख किया जाना चाहिए कि यह साझा पुस्तकालयों (कम से कम जीसीसी के साथ) पर लागू नहीं होता था, वे कमांड लाइन पर कहीं भी दिखाई दे सकते थे। तो लोगों ने ऐसा किया।हालांकि, हाल ही में यह बदल गया है, जीसीसी अब कई प्लेटफार्मों पर लिंकर को '--as- आवश्यक 'ध्वज लागू करता है, इसलिए प्रभाव साझा पुस्तकालयों के लिए भी प्रभाव समान है। – nos

4

An Introduction to GCC - for the GNU compilers gcc and g++

में उल्लेख किया linkers के पारंपरिक व्यवहार बाहरी कार्यों के लिए खोज करने के लिए पुस्तकालयों कमांड लाइन पर निर्दिष्ट में बाएं से दाएं है। इसका अर्थ यह है कि किसी फ़ंक्शन की परिभाषा वाली लाइब्रेरी किसी भी स्रोत फ़ाइलों या ऑब्जेक्ट फ़ाइलों के बाद दिखाई देनी चाहिए।

मुझे लगता है कि आप एक ही व्यवहार देख रहे हैं।

ध्यान दें कि यह भी आगे कहा गया है,

अधिकांश आधुनिक linkers आदेश के सभी पुस्तकालयों की खोज, परवाह किए बिना, लेकिन यह आदेश देने पुस्तकालयों के सम्मेलन बाएं से दाएं पालन करने के लिए सबसे अच्छा है।

संबंधित मुद्दे