2011-10-25 21 views
7

ओह, मैं जीसीसी और मैक और मेकफ़ाइल में नौसिखिया हूं। आज मैं मैक ओएस एक्स और जीसीसी 4.4.2 का उपयोग कर एक गतिशील lib का निर्माण करने का इरादा है, लेकिन जब ओ फ़ाइलों को जोड़ने, संकलक इस तरह की शिकायत है:"___emutls_get_address" प्रतीक क्या है?

Undefined symbols: 
    "___emutls_get_address", referenced from: 
     _malloc in michael.o 
     _malloc in michael.o 
ld: symbol(s) not found 

मैं इस जानकारी googled, लेकिन मैं नहीं समझ सकता परिणाम अच्छी तरह से, मुझे आश्चर्य है कि प्रतीक का मतलब क्या है, और क्यों कई कार्यक्रमों में यह लिंकिंग त्रुटि है। मैं भी आश्चर्य है कि इस त्रुटि के लिए संभावित कारण क्या है, को जोड़ने आदेश है:

g++ -Dx86 -D_GNU_SOURCE -D_REENTRANT -Wall -m32 \ 
    -fno-strict-aliasing -fno-pic -O3 -ggdb \ 
    michael.o malloc_new.o -o libmichael.so \ 
    -lpthread -lm -lstdc++ -shared 
+0

आपको स्पष्ट रूप से '-lstdC++' से लिंक करने की आवश्यकता नहीं है, g ++ को सही स्वयं को चुनना चाहिए। इसे हटाने का प्रयास करें। – Mat

उत्तर

5

यह प्रतीक टीएलएस (धागे की स्थानीय संग्रहण) मैक ओएस एक्स के लिए जीसीसी द्वारा अनुकरण का हिस्सा है वहाँ जीसीसी में कुछ कीड़े हैं इस बारे में बगजिला, जैसे: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39888

डार्विन पर धागा स्थानीय भंडारण (जैसे OpenMP ThreadPrivate चर) का उपयोग करना मैन्युअल रूप से, टीएलएस emutls को जोड़ने की आवश्यकता है या तो -lgcc_s.so.1 या -lgcc_eh

के माध्यम से देखें धागे: http://gcc.gnu.org/ml/gcc/2008-12/msg00145.html http://gcc.gnu.org/ml/gcc/2008-12/msg00107.html

उपर्युक्त धागे से, यह स्पष्ट रूप से काफी गड़बड़ है। हालांकि, जैसा कि मैं केवल बिट था, इसलिए मुझे उम्मीद थी कि इस मुद्दे को ट्रैक करने में एक बग है। अगर मैं मैन्युअल रूप से जैसा कि ऊपर उल्लेख gcc_s.so.1 या gcc_eh से लिंक

...

टीएलएस ठीक काम करता है।

तो, संभव समाधान की दिशा में एक कदम जोड़ने में जोड़ने के लिए -lgcc_s.so.1 या -lgcc_eh विकल्प है। और दूसरा आपके जीसीसी को अपडेट करना है, क्योंकि यह जीसीसी की बग है।

+0

मैंने इन दो पुस्तकालयों की कोशिश की है, और पहला नहीं मिला। दूसरे का उपयोग करने के बाद, अब emutls प्रतीक पाया जा सकता है, लेकिन जीसीसी शिकायत करता है कि "पूर्ण संबोधन (शायद-गतिशील-नो-तस्वीर) michael.o से _DescRetire में उपयोग किया जाता है। Slidable छवि में अनुमति नहीं है। '-read_only_relocs दबाने का उपयोग करें 'पाठ अवशेषों को सक्षम करने के लिए ", मुझे अभी भी इसके बारे में कोई जानकारी नहीं है। – JustQieTry

+1

JustQieTry, मुझे लगता है कि यह '-फनो-तस्वीर' विकल्प से है। इस विकल्प के बिना अपनी परियोजना को पुन: संकलित करने का प्रयास करें। आप बनाने की कोशिश कर रहे हैं। इसलिए लाइब्रेरी और किसी गतिशील लाइब्रेरी को -फिक मोड में संकलित किया जाना चाहिए। – osgx

+0

अगर -फिक चालू है, तो एक और समस्या है, यह शिकायत करता है कि "एएसएम" को पुनः लोड करते समय "बीआरईजी 'कक्षा में एक रजिस्टर नहीं मिल सकता है, मैं इसके लिए गुगल हूं और यह पता लगाता हूं कि मैक के लिए, -फिक चालू है डिफ़ॉल्ट, तो मैं इसे बंद कर देता हूं ....... क्या यह गलत है? – JustQieTry

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