2011-08-18 19 views
14

.la और .a पुस्तकालयों के बिना autotools/libtool के साथ .so मॉड्यूल कैसे बनाएं और इंस्टॉल करें भी --prefix पथ में स्थापित किया जा रहा है?बिल्डिंग .so मॉड्यूल बिना autlaools/libtool के साथ .la और .a वेरिएंट स्थापित किए जा रहे हैं

वर्तमान में मैं Makefile.am निम्नलिखित का उपयोग कर रहा:

lib_LTLIBRARIES = libCurlDownloader.la 
libCurlDownloader_la_SOURCES = Curl.cpp 
libCurlDownloader_la_LDFLAGS = -module -avoid-version 

यह काम करता है, लेकिन इसके अलावा में यह भी स्थापित करता है libCurlDownloader.la और libCurlDownloader.a libCurlDownloader.so करने के लिए, क्या अवांछनीय है।

# अद्यतन 1

यह ए, उत्पन्न नहीं हो बनाने के लिए का उपयोग करके संभव है या तो

./configure --disable-static 

या

AC_ENABLE_SHARED(yes) 
AC_ENABLE_STATIC(no) 
configure.ac में

लेकिन यह अभी भी सवाल है कि कैसे बनाना है .la नहीं बी eso स्थापित होने पर स्थापना --prefix में स्थापित eing।

अद्यतन # 2

यह स्थापना से .la फ़ाइलें निकालने के लिए संभव है का उपयोग कर उपसर्ग

install-exec-hook: find $(DESTDIR)$(libdir) -type f -name \*.la -delete 
+0

आपके पास एक मामूली टाइपो है (इंस्टॉल-एक्ट-हुक होना चाहिए)। – Compholio

+0

मुझे लगता है कि आप नहीं कर सकते हैं, डेबियन पैकेजर्स डेब पैकेज – sherpya

+0

में हैंड ला फाइलों द्वारा हटा रहे हैं कि 'install-exec-hook' एक बुरा विचार की तरह लगता है। यह निर्देशिका से सभी .la फ़ाइलों को हटा देगा, न केवल आपके प्रोजेक्ट द्वारा जेनरेट किए गए। यदि 'DESTDIR' का उपयोग किया जाता है तो कोई समस्या नहीं है, लेकिन अन्यथा बहुत गलत है। स्थिर लिंकिंग निर्भरताओं के लिए – Maarten

उत्तर

1

आप जरूरी .la फ़ाइलें नहीं हटा देना चाहिए।

  1. स्थिरता बनाया पुस्तकालय रूप से लिंक हो: .la फ़ाइलों जानकारी है कि दो स्थितियों में इस्तेमाल किया जाता है। जब सांख्यिकीय रूप से लिंक (i.e., .a-static के साथ), लाइब्रेरी से जुड़े होने की निर्भरताओं के बारे में कोई जानकारी नहीं है, इसलिए .la फ़ाइल में जानकारी का उपयोग ld कमांड को सभी आवश्यक निर्भरताओं का संदर्भ देने के लिए कर सकते हैं। यह मिनीगब्लू जैसे पर्यावरण पर अक्सर अधिक महत्वपूर्ण होता है जहां लिंकर को रिकर्सिव निर्भरताओं को हल करने के लिए एक विशेष क्रम में निर्दिष्ट लाइब्रेरी निर्दिष्ट गुणकों की आवश्यकता होती है। यह केवल एक चिंता है यदि कोई स्थिर बाइनरी बनाने का इरादा रखता है।

  2. गतिशील रूप पर निर्माण पुस्तकालय लोड हो रहा है कुछ प्लेटफ़ॉर्म (यानी, lt_dlopen साथ अगर libltdl का उपयोग)। इसी तरह, कुछ प्लेटफार्मों पर, संकलन मॉड्यूल के निर्भरता बाइनरी में इनकोडिंग नहीं हैं, इसलिए ताकि lt_dlopen खोजने के लिए और सही निर्भरता लोड होगा .la फ़ाइल की जरूरत है। ईएलएफ प्लेटफ़ॉर्म (लिनक्स समेत) और पीई प्लेटफ़ॉर्म (यानी, विंडोज) पर, निर्भरता लाइब्रेरी में स्टोर की जाती है, इसलिए lt_dlopen.la फ़ाइलों के बिना काम करेगा। मैकोज़ पर मको प्रारूप को बंडलों के निर्माण के दौरान .la फ़ाइलों की आवश्यकता हो सकती है।

Debian/Ubuntu के packagers अपने पैकेजों से .la फ़ाइलों को छोड़ने के लिए क्योंकि दूसरा कारण लिनक्स पर उचित नहीं है का फैसला किया है और वे आपको पहली जगह में स्थिर बाइनरी का निर्माण नहीं किया पसंद करेंगे। अन्य प्लेटफार्मों पर, जो libtol को समर्थन देने के लिए डिज़ाइन किया गया है, प्रोग्राम को जोड़ने या चलाने के लिए .la फ़ाइलों की आवश्यकता हो सकती है।

+2

; लगभग हमेशा होता है (यहां तक ​​कि अधिकतर मौजूदा .la फाइलें) 'pkg-config' निर्देश उपलब्ध हैं। –

+3

सिमिलरी - गतिशील लिंकिंग 'pkg-config' के लिए भी एक बेहतर मदद प्रदान करता है तो libtool crutches; बिल्डसिस्टम-स्वतंत्र तरीके से। –

2

मैंने इस प्रश्न पर ठोकर खाई क्योंकि यह "मॉड्यूल" शब्द का उपयोग करता था, जो ऑटोमेक/लिबेटोल बोलने में एक प्लगइन का शब्द होता है। मेरे पास फिनिट में एक प्लगइन सिस्टम है, इसलिए मैं .a फाइल बनाने से बचने के लिए '-मॉड्यूल' के साथ अपने प्लगइन का निर्माण करता हूं। लेकिन मुझे अभी भी .la फाइलें इंस्टॉल हैं, जो वास्तव में 'मॉड्यूल' मामले में भी लागू नहीं होती है।

मैं प्लग-इन फ़ाइलों .la को छोड़ करने के लिए एक दस्तावेज रास्ता खोजने के लिए अभी तक है, लेकिन यहाँ कैसे मैं यह कर रहा है:

AM_LDFLAGS = -module -avoid-version -shared 
pkglib_LTLIBRARIES = alsa-utils.la bootmisc.la 

install-exec-hook: 
     @(cd $(DESTDIR)$(pkglibdir) && $(RM) $(pkglib_LTLIBRARIES)) 

स्पष्ट है, तो मेरा उपयोग-मामले में कोई भी नहीं करने जा रहा है मेरी प्लगइन के खिलाफ "लिंक"। इसलिए, इसलिए .la फाइलें वास्तव में उपयोग नहीं हैं।

+0

क्या आपको यह मिला है? मैं वास्तव में इस से नफरत करता हूं। –

+0

@iharob nope, अभी भी .la फ़ाइलों को साफ़ करने के लिए उस हुक नियम का उपयोग कर रहा है। यदि आप अधिक विवरण देखना चाहते हैं तो यह प्रोजेक्ट [यहां] (https://github.com/troglobit/finit) है। – troglobit