जीसीसी में साझा पुस्तकालय समारोह का स्टेटिक लिंक


138

मैं एक साझा पुस्तकालय समारोह को जीसीसी में सांख्यिकीय रूप से कैसे जोड़ सकता हूं?


13
सांख्यिकीय रूप से जुड़े होने का क्या मतलब है? क्या आप चाहते हैं कि आपके निष्पादन योग्य को .so की आवश्यकता के बिना विचलित होना चाहिए?
एमिलियानो

जवाबों:


108

को देखें:

http://www.linuxquestions.org/questions/linux-newbie-8/forcing-static-linking-of-shared-libraries-696714/

http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html

इसे लिंक करने के लिए आपको लाइब्रेरी के स्थिर संस्करण की आवश्यकता है।

एक साझा पुस्तकालय वास्तव में निर्दिष्ट बिंदुओं के साथ एक विशेष प्रारूप में एक निष्पादन योग्य है (और कुछ चिपचिपा संबोधित मुद्दों में शामिल हैं)। इसमें सांख्यिकीय रूप से लिंक करने के लिए आवश्यक सभी जानकारी नहीं है।

आप किसी साझा लाइब्रेरी (या डायनामिक रूप से एक स्थिर लिंक) को सांख्यिकीय रूप से लिंक नहीं कर सकते।

ध्वज -staticलिंकर को साझा (.so) वाले के बजाय स्थिर पुस्तकालयों (.a) का उपयोग करने के लिए मजबूर करेगा। लेकिन स्थैतिक पुस्तकालय हमेशा डिफ़ॉल्ट रूप से स्थापित नहीं होते हैं, इसलिए आपको स्वयं स्थैतिक पुस्तकालय स्थापित करना पड़ सकता है।

एक अन्य संभावित दृष्टिकोण स्टैटिफायर या एर्मिन का उपयोग करना है । दोनों उपकरण एक गतिशील रूप से जुड़े निष्पादन योग्य इनपुट के रूप में लेते हैं और आउटपुट सभी साझा पुस्तकालयों के साथ एक आत्म निहित निष्पादन योग्य बनाते हैं।


11
स्थैतिक पुस्तकालय के पास क्या जानकारी है, ताकि इसे सांख्यिकीय रूप से जोड़ा जा सके, कि गतिशील पुस्तकालय नहीं है?
kbolino

75

यदि आप लिंक करना चाहते हैं, तो कहिए , लिबाप्लेजूइस को स्टेटिकली , लेकिन नहीं, लाइबोरेंज्यूजिस से कह सकते हैं, आप इस तरह जुड़ सकते हैं:

gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary

एक चेतावनी है - अगर liborangejuiceउपयोग करता है libapplejuice, तो libapplejuiceगतिशील रूप से भी जुड़ा होगा।

आप लिंक करने होंगे liborangejuiceस्थिर साथ साथ libapplejuiceपाने के लिए libapplejuiceस्थिर।

और -Wl,-Bdynamicसब कुछ स्थिर रखने के लिए मत भूलना , जिसमें आप सब कुछ स्थिर है, जिसमें शामिल है libc(जो करना अच्छी बात नहीं है)।


2
क्या सीधे तौर पर जीसीसी को यह बताने का कोई तरीका नहीं है कि उसे क्या करना है, और उसे बायपास करने और लिंकर के साथ बात करने के लिए नहीं?
एलाजार लीबोविच

1
@ElazarLeibovich आपको इस तरह से स्थिर और गतिशील का संयोजन नहीं मिल सकता है।
होहजून

@EugeneBujak: चेतावनी अपने सिस्टम पर लागू नहीं होता। उदाहरण: gcc -o main main.cc -Wl,-rpath=. -Wl,-Bdynamic -lB -Wl,-Bstatic -lA -Wl,-Bdynamic -L. libB का उपयोग करता LIBA , यह जुड़ा हुआ है और lddके लिए एक संदर्भ प्रदर्शित नहीं करता है LIBA । निष्पादन योग्य ठीक काम करता है। G ++ 4.7.3 के साथ परीक्षण किया गया।
मूलांक

एक अप्रत्यक्ष (नेस्टेड), स्थिर, एक प्रत्यक्ष, गतिशील, निर्भरता की निर्भरता स्वयं गतिशील रूप से जुड़ी नहीं होती है।
विन्नी

निम्नलिखित पर विचार करें: BinA libB.so पर निर्भर करता है जो libC.a पर निर्भर करता है। जैसा कि अन्य लोग पहले ही बता चुके हैं, .so स्वयं निष्पादन योग्य हैं, इसलिए जब कोई साझा ऑब्जेक्ट लिंक किया जाता है, तो कोई भी स्थिर लाइब्रेरी आश्रितों को लिंकर द्वारा संसाधित किया जाता है, जैसे कि एक निष्पादन योग्य जोड़ा जा रहा था: केवल एक .a स्थिर परिवाद से खींचे गए प्रतीकों को (या अनसुलझे) धड़ द्वारा संदर्भित किया जाता है। इसका मतलब यह है कि यदि बिन्या ने libC.a में किसी प्रतीक का संदर्भ दिया है, तो libB.so में कहीं भी संदर्भित नहीं है, तो भले ही बिन्या libB.so से लिंक करती है, तो उस प्रतीक को अपरिभाषित किया जाएगा (जब तक -Wl, - लिंक करते समय पूरे-संग्रह का उपयोग नहीं किया जाता है libB.so)।
विन्नी

18

यदि आपके पास अपनी साझा लाइब्रेरी (.so) की .a फाइल है तो आप इसे इसके पूर्ण पथ के साथ शामिल कर सकते हैं जैसे कि यह एक ऑब्जेक्ट फ़ाइल हो, जैसे:

यह केवल संकलन करके main.o उत्पन्न करता है:

gcc -c main.c

यह लिंक जो संबंधित स्थिर पुस्तकालय के साथ फ़ाइल करता है और निष्पादन योग्य ("मुख्य" नाम दिया गया है) बनाता है:

gcc main.o mylibrary.a -o main

या एक ही आदेश में:

gcc main.c mylibrary.a -o main

यह एक पूर्ण या सापेक्ष पथ भी हो सकता है:

gcc main.c /usr/local/mylibs/mylibrary.a -o main

12

हाँ, मुझे पता है कि यह एक 8 साल पुराना सवाल है, लेकिन मुझे बताया गया था कि यह एक साझा-वस्तु पुस्तकालय के खिलाफ सांख्यिकीय रूप से लिंक करना संभव था और जब मैंने इसके बारे में अधिक जानकारी की खोज की, तो यह वास्तव में शीर्ष हिट था।

वास्तव में यह प्रदर्शित करने के लिए कि साझा-ऑब्जेक्ट लायब्रेरी को सांख्यिकीय रूप से जोड़ना संभव नहीं है ld( gcc'लिंकर') - जैसा कि लोगों के एक समूह से आग्रह है कि यह संभव नहीं है - निम्नलिखित gccकमांड का उपयोग करें :

gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so

(बेशक आप संकलित करने के लिए होगा objectname.oसे sourcename.c, और आप शायद अच्छी तरह से अपने स्वयं के साझा-वस्तु पुस्तकालय बनाने चाहिए। यदि आप करते हैं, का उपयोग करें -Wl,--library-path,.ताकि ld स्थानीय निर्देशिका में अपने पुस्तकालय पा सकते हैं।)

आपको प्राप्त वास्तविक त्रुटि है:

/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status

उम्मीद है की वो मदद करदे।


10

थोड़ी देर से लेकिन ... मुझे एक लिंक मिला जिसे मैंने कुछ साल पहले बचाया था और मुझे लगा कि यह आप लोगों के लिए उपयोगी हो सकता है:

सीडीई: स्वचालित रूप से पोर्टेबल लिनक्स एप्लिकेशन बनाएं

http://www.pgbovine.net/cde.html

  • बस प्रोग्राम डाउनलोड करें
  • द्विआधारी पासिंग को एक तर्क के रूप में निष्पादित करें बाइनरी का नाम जिसे आप पोर्टेबल बनाना चाहते हैं, उदाहरण के लिए: nmap

    ./cde_2011-08-15_64bit nmap

यह कार्यक्रम नप और उसके आश्रितों से जुड़े सभी परिवादों को पढ़ेगा और यह उन सभी को cde-package / (उसी निर्देशिका में जहाँ आप हैं) नामक फ़ोल्डर में सहेजेगा ।

  • अंत में, आप फ़ोल्डर को संपीड़ित कर सकते हैं और जो भी सिस्टम में पोर्टेबल बाइनरी को तैनात कर सकते हैं।

याद रखें, पोर्टेबल प्रोग्राम लॉन्च करने के लिए आपको सीडी-पैकेज / nmap.cde में स्थित बाइनरी को निष्पादित करना होगा

सादर


2
जबकि सवाल का जवाब बिल्कुल नहीं दे रहा है - समस्या का एक उल्लेखनीय समाधान है।
रज़ॉन्ग

लगता है कि लिंक अब मृत हो गया है।
पापी

0

जीसीसी में, यह समर्थित नहीं है। वास्तव में, यह किसी भी मौजूदा संकलक / लिंकर में समर्थित नहीं है जिसकी मुझे जानकारी है।


4
क्या आप बता सकते हैं कि स्थैतिक लिंकिंग किसी भी मौजूदा संकलक द्वारा समर्थित नहीं है?
jww

5
@noloader, गतिशील पुस्तकालय का स्थैतिक लिंक?
नॉट्रो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.