2012-12-21 41 views
10

मैं autoconf, automake, और libtool के साथ एक प्रोग्राम बना रहा हूँ। मेरे काम की आवश्यकता है कि मैं स्थिर रूप से लिंक (अधिकांश) पुस्तकालयों। यह अतीत में कोई समस्या नहीं है क्योंकि मैं -all-static के साथ सब कुछ स्थिर रूप से लिंक कर सकता था। अब यह एक समस्या है क्योंकि मुझे पुस्तकालय का उपयोग करना है जो केवल गतिशील है; यह हमें तीसरे पक्ष द्वारा दिया गया था, और हमारे पास स्रोत नहीं है।एक autotools उपयोगकर्ता स्थिर और गतिशील लिंकिंग का संयोजन कैसे निर्दिष्ट कर सकता है?

बेशक, -all-static अब निर्माण विफल होने का कारण बनता है। क्या यह संभव है इस लाइब्रेरी को छोड़कर, सब कुछ लिंक करने के लिए libtool बताएं? क्या libtool स्थिर और गतिशील लिंकिंग का कोई संयोजन करना संभव है, या यह सब कुछ या कुछ भी नहीं है?

अब तक मैंने LDFLAGS = -static के साथ सुविधा लाइब्रेरी बनाने का प्रयास किया है, जो उन पुस्तकालयों पर निर्भर करता है जिन्हें मैं स्थिर रूप से लिंक करना चाहता हूं। लेकिन libtool स्थिर पुस्तकालयों को संगत नहीं करता है, जैसा कि मैंने आशा की थी। सुविधा पुस्तकालय के आधार पर कार्यक्रम अभी भी गतिशील रूप से सबकुछ जोड़ता है।

मैंने --disable-shared भी कोशिश की है, लेकिन इससे निर्माण प्रभावित नहीं हुआ।


इन सवालों समान हैं, लेकिन वास्तव में मेरे सवाल का जवाब नहीं है:

Force linking a static library into a shared one with Libtool

Is it possible to link some — but not all — libraries statically with libtool?

(मैं अपने सिस्टम से साझा पुस्तकालयों हटाना नहीं चाहते हैं, और सब कुछ के लिए पूरा पथ निर्दिष्ट करना हाथ से जोड़ने से शायद ही बेहतर है, लेकिन शायद यह एकमात्र तरीका है।)

उत्तर

10

आपने एन किया ओटी ऑपरेटिंग सिस्टम निर्दिष्ट करें, लेकिन हमें लगता है कि यह अपेक्षाकृत हाल ही में यूनिक्स/लिनक्स/ओएसएक्स है। यदि ऐसा नहीं है, तो निम्न चेतावनी को अनदेखा करें।

उत्तर देने से पहले, आपको पता होना चाहिए कि अधिकांश ईएलएफ-आधारित सिस्टम (यूनिक्स/लिनक्स) पर स्थिर और साझा कोड मिश्रण करना समस्याग्रस्त है। एक कारण यह है कि यदि आप एक अद्यतन निर्भरता को फिर से भूलना भूल जाते हैं तो यह कोड को सिंक से बाहर निकलने का कारण बन सकता है। दूसरा एक स्थिर कोड बनाम PIC की प्रकृति के कारण है। यही कारण है कि libtool इसे हतोत्साहित करने की कोशिश करता है।

कहा जा रहा है, Makefile.am में (अपने अंतिम कार्यक्रम संभालने foo है और साझा पुस्तकालय है):

. 
    . 
    . 
    foo_SOURCES = foo.c abc.c def.c hij.c 
    foo_LDFLAGS = -all-static -Wl,-Bdynamic,-L/path/to,-lshared,-Bstatic 
    foo_LDADD = -L../path/to -lbar -lbaz 

यहाँ क्या महत्वपूर्ण है कि libtool शॉर्ट सर्किट करने की अनुमति देता है चेक और जीएनयू जीसीसी का -static ध्वज (जिसका उपयोग libtool द्वारा किया जाता है) -Wl, सीधे लिंकर (जीएनयू एलडी) के तर्कों को पारित करके। तर्कों के बीच रिक्त स्थान डालने के लिए, अल्पविराम , डिलीमीटर का उपयोग किया जाता है।

-Bstatic और -Bdynamic दोनों जीएनयू एलडी के info pages के साथ-साथ सहायता स्क्रीन में दस्तावेज किए गए हैं। दोबारा, चूंकि आपने ओएस या कंपाइलर पैकेज का उपयोग नहीं किया है, इसलिए मैं लिनक्स पर जीएनयू जीसीसी और जीएनयू एलडी मान रहा हूं। आप अपने लिए देखने के लिए ld --help का उपयोग करके सत्यापित करना चाह सकते हैं। यदि, किसी कारण से, यह जीएनयू एलडी नहीं है, तो आपको -Bstatic और -Bdynamic पर बराबर झंडे खोजने की आवश्यकता होगी, जहां उचित हो।

+1

यह काम करता है, लेकिन कुछ लचीलापन के नुकसान पर।मुझे गतिशील निर्माण की आवश्यकता नहीं है, लेकिन अगर मैंने कभी किया तो मुझे कुछ 'Makefile.am' को संपादित करने की आवश्यकता होगी, है ना? यह 'AC_CHECK_LIB' जैसे मैक्रोज़ के साथ समस्याएं भी उत्पन्न करता है (जो कि' LIL' 'में केवल' -l' जोड़ता है), लेकिन मुझे लगता है कि इसकी अपेक्षा की जा सकती है। – tprk77

+2

मैंने सबसे सरल दृष्टिकोण संभव दिया। हालांकि, कुछ फैंसी के लिए, आप झंडे को अपने 'config.ac' में खींच सकते हैं। एक बार वहां, आप 'DYNLIBS =" - WL, -Bdynamic, -L/path/to, -lshared, -ststatic "' AC_SUBST ([DYNLIBS]) पर कॉल के साथ जोड़ सकते हैं। तो आपको बस अपने 'मेकफ़ाइल.एएम' में '$ (DYNLIBS) 'कॉल करना होगा। इससे आपको अधिक नियंत्रण मिलेगा, लेकिन याद रखें कि 'AC_CHECK_LIBS' स्थिर बनाम गतिशील libs की जांच नहीं करता है। क्या आप यही चाहते हैं या कुछ और है जो इसे और अधिक लचीला बना देगा? – NickW

+0

हाँ मुझे लगता है कि काम करेगा, धन्यवाद! – tprk77