2014-12-21 8 views
5

से लिंक करने के लिए pkg-config का उपयोग कैसे करें मैं ppg-config द्वारा स्थिर रूप से libpng को लिंक करना चाहता हूं।लाइब्रेरी को

pkg-config --libs --static libpng 

आउटपुट

एल/usr/स्थानीय/सेलर/libpng/1.6.15/lib -lpng16 -lz

मैं, कि निर्देशिका में दोनों libpng16.alibpng16.dylib है और अगर मैं इन झंडे का उपयोग करता हूं तो पुस्तकालय गतिशील रूप से जुड़ा हुआ है।

मैं या तो पीकेजी-कॉन्फ़िगर या लिंकर (अधिमानतः कुछ पोर्टेबल-आइश तरीके से) कैसे कह सकता हूं कि मैं वास्तव में इसे स्थिर रूप से लिंक करना चाहता हूं?

मैंने pkg-config के झंडे से पहले -static जोड़ने का प्रयास किया है, लेकिन यह क्लैंग का ld "crt0.o" लिंक करने में विफल रहता है और विफल रहता है।

उत्तर

2

pkg-config --static विकल्प .pc फ़ाइलों में ठीक ढंग से टैग पर निर्भर करता है। यदि --static विकल्प प्रदान करना libpng संग्रह के विरुद्ध लिंक करने के लिए आवश्यक सही जानकारी नहीं देता है, तो आप उस उद्देश्य के लिए pkg-config का उपयोग नहीं कर सकते हैं।

मुझे संदेह है कि libpng (अन्य पैकेजों के साथ) libpng 1.2 के बाद कुछ समय स्थिर लिंकिंग के लिए समर्थन छोड़ दिया। वे अभी भी एक लाइब्रेरी संग्रह प्रदान कर सकते हैं, लेकिन libpng pkg-config फ़ाइल को स्थिर लिंक का समर्थन करने के लिए ठीक से टैग नहीं किया गया है। स्थैतिक lib का उपयोग करने के लिए आपको मैन्युअल रूप से ld बताना होगा।

5

प्रयास करें:

-L/usr/local/Cellar/libpng/1.6.15/lib -l:libpng16.a -lz 

एक साथ -l का उपयोग करना: चरित्र आप फ़ाइल नाम एक्सटेंशन निर्दिष्ट करने के लिए अनुमति देता है।

-l: विकल्प GNU ld 2.24 manual में दर्ज है:

-l namespec

--library = namespec

निर्दिष्ट संग्रह या वस्तु फ़ाइल जोड़ें लिंक करने के लिए फ़ाइलों की सूची में नेमस्पेक द्वारा। इस विकल्प का इस्तेमाल कई बार किया जा सकता है। namespec रूप की है: फ़ाइल नाम, ld फ़ाइल नाम नामक एक फ़ाइल के लिए पुस्तकालय पथ खोज करेगा, अन्यथा यह libnamespec.a नामक एक फ़ाइल के लिए पुस्तकालय पथ खोज करेंगे।

साझा पुस्तकालयों का समर्थन करने वाले सिस्टम पर, ld libnamespec.a के अलावा अन्य फ़ाइलों की खोज भी कर सकता है। विशेष रूप से, ईएलएफ और सनोस सिस्टम पर, एलडी libnamespec.so नामक लाइब्रेरी के लिए एक निर्देशिका खोजेगी जिसे libnamespec.a कहा जाता है। (सम्मेलन के अनुसार, एक .so एक्सटेंशन एक साझा लाइब्रेरी इंगित करता है।) ध्यान दें कि यह व्यवहार पर लागू नहीं होता है: फ़ाइल नाम, जो हमेशा फ़ाइल नाम नामक फ़ाइल निर्दिष्ट करता है।

+1

यह दिलचस्प है। क्या यह एक दस्तावेज विकल्प है? मेरे पास लिंकर है (क्लैंग से?) इसका समर्थन नहीं करता है: "ld: पुस्तकालय -l: libpng16.a" के लिए नहीं मिला है। – Kornel

+0

@porneL, हाँ, यह प्रलेखित है। मैंने मैनुअल से उद्धरण में संपादित किया है। –

1

आप .pc फ़ाइल को स्थिर लिंकिंग का समर्थन करने के लिए संपादित कर सकते हैं, विशेष रूप से यदि आप कुछ लिनक्स वितरण पर निर्भर होने के बजाय स्वयं संकलन, पैचिंग और सॉफ़्टवेयर इंस्टॉल करने की स्थिति में हैं।

यहां .pc फ़ाइल का एक उदाहरण है जो गतिशील और स्थिर दोनों लिंकिंग का समर्थन करता है। यह मेरा Ubuntu पर /usr/lib/x86_64-linux-gnu/pkgconfig/xcb.pc से लिया जाता है:

prefix=/usr 
exec_prefix=${prefix} 
libdir=${prefix}/lib/x86_64-linux-gnu 
includedir=${prefix}/include 
xcbproto_version=1.11 

Name: XCB 
Description: X-protocol C Binding 
Version: 1.11.1 
Requires.private: pthread-stubs xau >= 0.99.2 xdmcp 
Libs: -L${libdir} -lxcb 
Libs.private: 
Cflags: -I${includedir} 

आप pkg-config --libs xcb चलाते हैं, तो यह मान लिया गया है कि आप गतिशील संस्करण चाहते हैं और यह तुम सिर्फ -lxcb देता है। xcb.so गतिशील रूप से साझा ऑब्जेक्ट को पता होगा कि अपनी सभी निर्भरताओं को कैसे लोड किया जाए, इसलिए इसके खिलाफ लिंक करते समय आपको उन्हें निर्दिष्ट करने की आवश्यकता नहीं है।

यदि आप pkg-config --libs xcb --static चलाते हैं, तो .private फ़ील्ड खेल में आते हैं, और आपको -lxcb -lXau -lXdmcp मिलते हैं।

मुझे --staticpkg-config पर --static तर्क पास करने के बारे में पता है कि कई बिल्ड सिस्टम का सामना नहीं हुआ है। इसलिए यदि आपकी .pc फ़ाइल केवल स्थिर लिंकिंग का समर्थन करने का इरादा है, तो शायद .private फ़ील्ड का उपयोग न करने के लिए सबसे अच्छा है, और केवल उन सभी निर्भरताओं को प्रदान करें जो लोगों को बिना शर्त शर्त की आवश्यकता होगी। इस तरह लोग लाइब्रेरी के खिलाफ सफलतापूर्वक लिंक कर सकते हैं भले ही उन्हें यह स्थिर न हो या --static से pkg-config पास न करें।

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