जवाबों:
को देखें:
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html
इसे लिंक करने के लिए आपको लाइब्रेरी के स्थिर संस्करण की आवश्यकता है।
एक साझा पुस्तकालय वास्तव में निर्दिष्ट बिंदुओं के साथ एक विशेष प्रारूप में एक निष्पादन योग्य है (और कुछ चिपचिपा संबोधित मुद्दों में शामिल हैं)। इसमें सांख्यिकीय रूप से लिंक करने के लिए आवश्यक सभी जानकारी नहीं है।
आप किसी साझा लाइब्रेरी (या डायनामिक रूप से एक स्थिर लिंक) को सांख्यिकीय रूप से लिंक नहीं कर सकते।
ध्वज -static
लिंकर को साझा (.so) वाले के बजाय स्थिर पुस्तकालयों (.a) का उपयोग करने के लिए मजबूर करेगा। लेकिन स्थैतिक पुस्तकालय हमेशा डिफ़ॉल्ट रूप से स्थापित नहीं होते हैं, इसलिए आपको स्वयं स्थैतिक पुस्तकालय स्थापित करना पड़ सकता है।
एक अन्य संभावित दृष्टिकोण स्टैटिफायर या एर्मिन का उपयोग करना है । दोनों उपकरण एक गतिशील रूप से जुड़े निष्पादन योग्य इनपुट के रूप में लेते हैं और आउटपुट सभी साझा पुस्तकालयों के साथ एक आत्म निहित निष्पादन योग्य बनाते हैं।
यदि आप लिंक करना चाहते हैं, तो कहिए , लिबाप्लेजूइस को स्टेटिकली , लेकिन नहीं, लाइबोरेंज्यूजिस से कह सकते हैं, आप इस तरह जुड़ सकते हैं:
gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary
एक चेतावनी है - अगर liborangejuice
उपयोग करता है libapplejuice
, तो libapplejuice
गतिशील रूप से भी जुड़ा होगा।
आप लिंक करने होंगे liborangejuice
स्थिर साथ साथ libapplejuice
पाने के लिए libapplejuice
स्थिर।
और -Wl,-Bdynamic
सब कुछ स्थिर रखने के लिए मत भूलना , जिसमें आप सब कुछ स्थिर है, जिसमें शामिल है libc
(जो करना अच्छी बात नहीं है)।
gcc -o main main.cc -Wl,-rpath=. -Wl,-Bdynamic -lB -Wl,-Bstatic -lA -Wl,-Bdynamic -L.
libB का उपयोग करता LIBA , यह जुड़ा हुआ है और ldd
के लिए एक संदर्भ प्रदर्शित नहीं करता है LIBA । निष्पादन योग्य ठीक काम करता है। G ++ 4.7.3 के साथ परीक्षण किया गया।
यदि आपके पास अपनी साझा लाइब्रेरी (.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
हाँ, मुझे पता है कि यह एक 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
उम्मीद है की वो मदद करदे।
थोड़ी देर से लेकिन ... मुझे एक लिंक मिला जिसे मैंने कुछ साल पहले बचाया था और मुझे लगा कि यह आप लोगों के लिए उपयोगी हो सकता है:
सीडीई: स्वचालित रूप से पोर्टेबल लिनक्स एप्लिकेशन बनाएं
http://www.pgbovine.net/cde.html
द्विआधारी पासिंग को एक तर्क के रूप में निष्पादित करें बाइनरी का नाम जिसे आप पोर्टेबल बनाना चाहते हैं, उदाहरण के लिए: nmap
./cde_2011-08-15_64bit nmap
यह कार्यक्रम नप और उसके आश्रितों से जुड़े सभी परिवादों को पढ़ेगा और यह उन सभी को cde-package / (उसी निर्देशिका में जहाँ आप हैं) नामक फ़ोल्डर में सहेजेगा ।
याद रखें, पोर्टेबल प्रोग्राम लॉन्च करने के लिए आपको सीडी-पैकेज / nmap.cde में स्थित बाइनरी को निष्पादित करना होगा
सादर