2010-11-14 10 views
6

मेरे पास एक प्रोग्राम है, myprogram, जो स्थिर सुविधा लाइब्रेरी से जुड़ा हुआ है, इसे libconvenience.a पर कॉल करें, जिसमें एक फ़ंक्शन, func() शामिल है। फ़ंक्शन func() को myprogram में कहीं भी नहीं कहा जाता है; इसे प्लगइन लाइब्रेरी, plugin.so से कॉल करने में सक्षम होना चाहिए।सुविधा लाइब्रेरी से प्रतीकों को निष्पादन योग्य में निर्यात नहीं किया जा रहा है

प्रतीक func()myprogram में गतिशील रूप से निर्यात नहीं हो रहा है। अगर मैं

nm myprogram | grep func 

मुझे कुछ भी नहीं मिलता है। हालांकि, यह libconvenience.a से गायब नहीं है:

nm libconvenience/libconvenience.a | grep func
00000000 टी समारोह

मैं automake उपयोग कर रहा हूँ, लेकिन अगर मैं बजाय कमांड लाइन पर हाथ से पिछले जोड़ने कदम करते हैं, यह या तो काम नहीं करता है:

gcc -Wl,--export-dynamic -o myprogram *.o libconvenience/libconvenience.a `pkg-config --libs somelibraries` 

हालांकि, अगर मैं इस तरह कार्यक्रम जुड़ी हों, एक सुविधा पुस्तकालय के उपयोग को छोड़ने और वस्तु फ़ाइलों कि 01 में चला गया होता जोड़नेसीधे, func() अप myprogram में पता चलता है: रों प्रतीकों के प्रतीक के रूप में यह होना चाहिए

gcc -Wl,--export-dynamic -o myprogram *.o libconvenience/*.o `pkg-config --libs somelibraries` 

मैं myprogram में कहीं func() को एक डमी कॉल जोड़ते हैं, तो func() भी myprogram में पता चलता '। लेकिन मैंने सोचा कि --export-dynamic को सभी प्रतीकों को निर्यात करना था चाहे वे प्रोग्राम में इस्तेमाल किए गए हों या नहीं!

मैं automake 1.11.1 और जीसीसी 4.5.1 का उपयोग कर रहा फेडोरा 14. मैं भी Libtool 2.2.10 का उपयोग कर रहा plugin.so का निर्माण करने पर (लेकिन सुविधा पुस्तकालय।)

मैं भूल नहीं था डाल करने के लिए myprogram_LDFLAGS में -Wl,--export-dynamic, न ही मैं स्रोत है कि libconvenience_a_SOURCES में func() शामिल डाल करने के लिए भूल गए हैं (कुछ Googling पता चलता है कि इन इस समस्या का आम कारण हैं।)

किसी मदद कर सकते हैं मुझे समझने यहाँ क्या चल रहा है?

उत्तर

3

मैं इसे हल करने में कामयाब रहा। यह जॉन Calcote उत्तम Autotools किताब है कि मुझे सही दिशा में इशारा से इस टिप्पणी थी:

Linkers द्विआधारी उत्पाद हर वस्तु फ़ाइल कमांड लाइन पर स्पष्ट रूप से निर्दिष्ट करने के लिए जोड़, लेकिन वे केवल उन वस्तु फ़ाइलों अभिलेखागार से निकालने कि वास्तव में जुड़े कोड में संदर्भित हैं।

इस व्यवहार का विरोध करने के लिए, कोई --whole-archive ध्वज का उपयोग libtool में कर सकता है। हालांकि, यह सभी सिस्टम पुस्तकालयों के सभी प्रतीकों को भी खींचने का कारण बनता है, जिससे बहुत से डबल प्रतीक परिभाषा त्रुटियां होती हैं।इसलिए --whole-archive को लिंकर कमांड लाइन पर libconvenience.a से पहले सही होना चाहिए, और इसके बाद --no-whole-archive का पालन करना होगा ताकि अन्य पुस्तकालयों का इस तरह से इलाज न किया जाए। इसमें कुछ समय मुश्किल के बाद से automake और libtool वास्तव में कमांड लाइन पर एक ही क्रम में अपने झंडे रखने की गारंटी नहीं देते है, लेकिन Makefile.am में इस लाइन चाल किया:

myprogram_LDFLAGS = -Wl,--export-dynamic \ 
    -Wl,--whole-archive,libconvenience/libconvenience.a,--no-whole-archive 
0

यदि आपको प्लगइन में होने के लिए func की आवश्यकता है। तो, यदि संभव हो तो आपको इसे आजमाएं और ढूंढें। सुविधा पुस्तकालयों का मतलब यह है कि - निष्पादन योग्य या lib को मध्यवर्ती चरण के रूप में जोड़ने की सुविधा।

+0

यह सच है, लेकिन मैं स्पष्ट रूप से करने के लिए _not_ समारोह की जरूरत है प्लगइन में रहें, क्योंकि func एक एपीआई का हिस्सा है कि कई प्लगइन्स को कॉल करने की आवश्यकता होती है। प्लगइन्स कहीं और लिखे गए थे और मैं उन्हें स्थानीय संशोधनों से बचने की कोशिश कर रहा हूं। – ptomato

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

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