2013-04-27 5 views
5

से जुड़ा हुआ था, मैं अपने प्रोग्राम को ग्लिबैक के साथ स्थिर रूप से लिंक करने का प्रयास कर रहा हूं, क्योंकि लक्ष्य मशीन पर ग्लिब का संस्करण काफी अप्रत्याशित है। मैंने लिंकर झंडे -स्टैटिक-libgcc और -static-libstdC++ का उपयोग किया और यह ठीक काम किया। निष्पादन योग्य बड़ा है, लेकिन मैं इसके साथ रह सकता हूं। दुर्भाग्य से, जब मैं लक्षित मशीन पर मेरी निष्पादन योग्य चलाने (यह नाम दिया गया है 'mytest' नीचे दिए गए उदाहरण में) मैं निम्नलिखित त्रुटि मिलती है:प्रोग्राम glibc/libstdC++ का सही संस्करण नहीं ढूंढ सकता है, हालांकि यह स्थिर रूप से

./mytest: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by libboost_log.so.1.53.0) 
./mytest: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by libboost_log.so.1.53.0) 
./mytest: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by libboost_log.so.1.53.0) 
./mytest: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by libboost_date_time.so.1.53.0) 
./mytest: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by libboost_thread.so.1.53.0) 

अगर मैं 'तार' कर mytest पर, यह मेरे

देता है
$ strings mytest | grep GLIBC 
GLIBC_2.9 
GLIBC_2.7 
GLIBC_2.8 
GLIBC_2.3.2 
GLIBC_2.2.5 
GLIBCXX_3.4.15 
GLIBCXX_3.4.11 
GLIBCXX_3.4.14 
GLIBCXX_3.4.9 
GLIBCXX_3.4 

मेरा मतलब है कि स्थिर लिंकिंग ठीक काम कर रही थी। लोडर अभी भी साझा ग्लिब और libstdC++ में मेरे कार्यों को देखने का प्रयास क्यों करता है? मैं क्या गलत कर रहा हूं?

धन्यवाद!

उत्तर

5

I am trying to link my program statically with glibc, because version of the glibc on the target machine is pretty much unpredictable. I used linker flags -static-libgcc and -static-libstdc++ and it worked fine.

कि glibc का संस्करण (libc) है, जो अलगlibgcc और libstdc++ से है प्रभावित नहीं किया। इन झंडे के साथ, आपने अभी भी एक गतिशील रूप से जुड़े निष्पादन योग्य उत्पादित किए हैं, जो पुराने वितरण पर काम नहीं करने के लिए अपेक्षित है।

आप अपने निष्पादन योग्य को -static ध्वज से जोड़ सकते हैं, और आपको पूरी तरह से स्थिर निष्पादन योग्य प्रदान करना चाहिए।

अद्यतन:

अपने प्रश्न को फिर से पढ़ने के बाद; आपकी समस्या glibc के साथ है। आपकी समस्या यह है कि आप libboost_log.so से लिंक कर रहे हैं, जो स्वयं libstdc++.so.6 पर निर्भर करता है।

उत्तर libboost*.so के बजाय libboost*.a से लिंक करना है। आप इसे इस तरह से प्राप्त करने का प्रयास कर सकते हैं:

g++ $(OBJS) -static-libgcc -static-libstdc++ -Wl,-Bstatic -lboost_log ... \ 
    -Wl,-Bdynamic 

(यह बहुत महत्वपूर्ण अनुगामी -Wl,-Bdynamic है।)

+0

बहुत धन्यवाद। दुर्भाग्य से, मैं सबकुछ स्थिर रूप से लिंक नहीं कर सकता, क्योंकि तब मेरी पाथ्रेड लाइब्रेरी काम नहीं कर रही है। किसी भी कारण से, यह ठीक काम करता है अगर यह गतिशील रूप से जुड़ा हुआ है। – svetlana

+0

@ स्वेतलाना 'libpthread' glibc का हिस्सा है।यदि आप इसे स्थिर रूप से लिंक नहीं कर सकते हैं, तो आपके पास पूरी तरह से स्थिर निष्पादन योग्य नहीं हो सकता है, और इसका तात्पर्य है कि आपका निष्पादन योग्य * पुराने सिस्टम पर कभी काम नहीं करेगा (जो अभी समर्थित नहीं है)। स्टेटिक लिंकिंग * सामान्य रूप से बहुप्रचारित कार्यक्रमों के लिए काम करता है, इसलिए आपको यह पता लगाना होगा कि यह आपके विशेष मामले के लिए क्यों काम नहीं कर रहा है, या पूरे विचार को छोड़ देता है। –

+0

@ स्वेतलाना उत्तर अपडेट किया गया। –

1

-static-libgcc और -static-libstdc++ से लिंक करने से केवल उन पुस्तकालयों के लिए काम किया जाएगा। ऐसा लगता है कि आप बूस्ट लाइब्रेरीज़ (संभवतः गतिशील रूप से) के खिलाफ भी जुड़ रहे हैं जो कि libgcc और libstdC++ के खिलाफ लिंक करते हैं।

निम्नलिखित चलाने की कोशिश करें:

ldd mytest 

यह दिखाना चाहिए "एक गतिशील निष्पादन योग्य नहीं है"। यदि यह कुछ और दिखाता है, तो इसका मतलब है कि यह अन्य पुस्तकालयों के खिलाफ गतिशील रूप से जुड़ा हुआ है। यह हमेशा इतना आसानी से काम नहीं करता है, लेकिन संकलन रेखा में -static जोड़ने के साथ-साथ शेष पुस्तकालयों का ख्याल रखने का प्रयास करें।

+0

एलेक, यह पता चलता 'एक गतिशील निष्पादन योग्य नहीं'। मुझे वीडर और वीडर लगता है ... – svetlana

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