2010-01-21 14 views
7

के साथ सी लाइब्रेरी को लिंक करना मैं एक प्रोग्राम को संकलित करने के लिए जीसीसी का उपयोग कर रहा हूं जिसे मुझे गैर-मानक नाम वाले सी पुस्तकालय से लिंक करने की आवश्यकता है; इसे libstuff.a के बजाय stuff.a कहा जाता है।गैर-मानक नाम

मैं फ़ाइल का नाम (अनुमति समस्या) नहीं बदल सकता।

मैं पूरी लाइब्रेरी (अर्थात gcc program.c stuff.a -oprogram का प्रयोग करके)

मैं gcc program.c -L/path/to/library/ -lstuff -oprogram के रूप में संकलित करने के लिए चाहते हैं, लेकिन जीसीसी पुस्तकालय नहीं मिलेगा (क्योंकि यह libstuff.a नहीं बुलाया जाता है) शामिल करने के लिए नहीं करना चाहती।

मैं एक लिनक्स बॉक्स पर काम कर रहा हूं।

मैं (गतिशील) लिंकिंग कैसे प्राप्त कर सकता हूं?

संपादित करें:

आप सभी, और मेरी क्षमा याचना एक खराब शब्दों में प्रश्न के लिए धन्यवाद।

मेरे पास एक साझा ऑब्जेक्ट भी नहीं था (मैंने सोचा कि मैं गतिशील रूप से * .a फ़ाइल से लिंक कर सकता हूं), इसलिए यह आप में से कई को भ्रमित कर दिया। फिर, मेरी अज्ञानता के लिए क्षमा चाहते हैं।

मैं जो कर रहा हूं वह स्थानीय निर्देशिका में साझा ऑब्जेक्ट बना रहा है, मेरे एलडी_LIBRARY_PATH पर्यावरण चर में स्थान जोड़ रहा है, और फिर से लिंक कर रहा है।

यह एक आकर्षण की तरह काम करता है (1.3 एम निष्पादन योग्य से 5.8K तक)।

फिर से धन्यवाद।

+0

पुस्तकालय का एक साझा वस्तु संस्करण मौजूद है (stuff.so)? – jschmier

+0

उल्लेख करना भूल गया, मैं लिनक्स पर काम कर रहा हूं। – Escualo

+0

@jschmier: नहीं, केवल '.a' लाइब्रेरी। – Escualo

उत्तर

6

मानते हैं कि स्थैतिक पुस्तकालय का एक साझा ऑब्जेक्ट संस्करण मौजूद नहीं है, तो इसे बनाना आवश्यक हो सकता है। याद रखें कि स्थैतिक पुस्तकालय stuff.a सिर्फ एक ar archive है।

ar -x stuff.a 
gcc -shared *.o -o libstuff.so 

इसका मतलब यह है कि आप और एक साझा पुस्तकालय के रूप में इसके खिलाफ लिंक करने के लिए चाहते नहीं बस अपने द्विआधारी में यह संकलन।

+6

दिलचस्प है, लेकिन .o फ़ाइलों को काम करने के लिए स्थिति-स्वतंत्र कोड के रूप में संकलित किया जाना चाहिए, जो वे नहीं हो सकते हैं यदि वे स्थिर पुस्तकालय के लिए थे, है ना? –

+1

यह सही जवाब है क्योंकि मेरे पास साझा ऑब्जेक्ट भी नहीं था। मैं एक बनाने, और जोड़ने के समाप्त हो गया। 1.3 एम के निष्पादन योग्य (मूल दृष्टिकोण के साथ) मैं 5.8 के निष्पादन योग्य को पास कर दिया। यह कमाल का है। धन्यवाद। उन्नत क्रिस्टल बॉल उपयोग या दिमाग पढ़ने की क्षमताओं के लिए – Escualo

+1

+1;) – Christoph

4

क्या आप stuff.a पर libstuff.a नामक एक प्रतीकात्मक लिंक बना सकते हैं? आप symlink को दूसरी निर्देशिका में भी बना सकते हैं (यानी, मानक लाइब्रेरी निर्देशिका नहीं) और -L विकल्प gcc के साथ सिम्लिंक के साथ निर्देशिका को शामिल करने के लिए उपयोग कर सकते हैं।

+0

मैं ऐसा करने के बारे में सोच रहा था, और यह हो सकता है कि मैं क्या कर रहा हूं। मैंने सोचा कि क्या कोई विशेष झंडा है, मैं इसे जीसीसी को पास कर सकता हूं ताकि यह पता चल सके कि नाम गैर-मानक है। – Escualo

3

ऐसा लगता है कि होगा एक वस्तु फ़ाइल लिंक:

gcc blah.o /usr/local/lib/foo.a -o binary 

अगर आप पूरा पथ पसंद नहीं है, बस एक चर का उपयोग करें। अन्यथा आप वहाँ अस्तित्व के लिए LD_LIBRARY_PATH और परीक्षण फ़ाइल को पार्स सकता

+0

@ एरियाटा: जीसीसी मैनुअल – Christoph

+0

के अनुसार नहीं, धन्यवाद, मैं अब यह नहीं था। – Escualo

+1

आप स्थिर पुस्तकालय से गतिशील रूप से लिंक नहीं कर सकते हैं, यह समय स्थिर लिंक संकलित होना चाहिए। साझा वस्तुओं को पीआईसी के साथ संकलित किया जाना चाहिए, स्थिर पुस्तकालयों को आमतौर पर इस तरह संकलित नहीं किया जाता है। आपको अभी भी रनटाइम पर साझा लाइब्रेरी को स्मृति में लोड करना होगा, जब तक कि आप एकाधिक थ्रेड नहीं चला रहे हैं, आपको अधिक – Anycorn

1

बस पूरा नाम दे:

gcc program.c /path/to/library/stuff.a -oprogram 
5

आप gcc manual की समीक्षा के दौरान किया जाना चाहिए था: एक का उपयोग कर के बीच फर्क सिर्फ इतना है

-l विकल्प और फ़ाइल नाम निर्दिष्ट करना यह है कि -l 'lib' और '.a' के साथ लाइब्रेरी को घेरता है और कई निर्देशिकाओं की खोज करता है।

तर्क के रूप में stuff.a का उपयोग करने में कुछ भी गलत नहीं है।

+0

प्राप्त नहीं होगा मूल प्रश्न में "(गतिशील)" था लेकिन मुझे कम से कम यकीन है कि ओपी वास्तव में इसका मतलब है। –

+0

धन्यवाद। मुझे इस बारे में पता नहीं था, और आपकी और अन्य टिप्पणियों के साथ अब मैं अपनी समस्या का समाधान करने में सक्षम हूं। – Escualo

0

मैं इस समस्या निकला रूप में गतिशील रूप से जुड़ा हुआ एक स्थिर पुस्तकालय स्थापित करने के लिए कोशिश कर रहा है के साथ एक होने का पता है, लेकिन मैं भावी पीढ़ी की खातिर इस जोड़ना चाहते थे:

आप को कोलन से -l विकल्प के लिए अपने तर्क प्रस्तावना हैं , :, यह नाम को "lib" की आवश्यकता वाले नाम के बजाय शाब्दिक के रूप में नामित करेगा और फ़ाइल एक्सटेंशन अंत में जोड़ा जाएगा।

मामले आपके द्वारा बताई गई जहां बल्कि एक libstatic.a की तुलना में एक static.a के खिलाफ लिंक करना चाहते हैं, और यह सोचते हैं आप स्थिर इसके खिलाफ लिंक करने के लिए, चाहते हैं निम्नलिखित काम करेगा:

gcc program.c -L/path/to/library/ -l:stuff.a -oprogram 

आप निश्चित रूप से कर सकते थे के रूप में रिचर्ड Penington और Anycorn दोनों का उल्लेख किया है क्या करना है और बस के बजाय रूप में अच्छी तरह कमांड लाइन पर पूरी तरह से pathed पुस्तकालय में शामिल हैं:

gcc program.c /path/to/library/stuff.a -oprogram 
संबंधित मुद्दे