2014-07-25 7 views
5

मेरे पास लगभग 80 स्थैतिक पुस्तकालय हैं। मैं उस से एक स्थिर पुस्तकालय बनाना चाहता हूं।स्थैतिक पुस्तकालयों के समूह से स्थिर पुस्तकालय बनाने के लिए libtool का उपयोग कैसे करें

This answer के बाद से मैं निम्नलिखित त्रुटि मिलती है मेरे लिए काम नहीं किया:।

libtool: unrecognized option `-static' 

मैं भी उलझन में हूँ के रूप में करने के लिए जो मोड उस में किया जाना चाहिए यह "लिंक" या "इंस्टॉल करें" है चूंकि वहां 20 विषम पुस्तकालय हैं, क्या मैं सभी निर्दिष्ट करने के लिए "*" का भी उपयोग कर सकता हूं?

मुझे दस्तावेज़ में this की कोई जानकारी नहीं मिली जो वास्तव में मेरे प्रश्न का उत्तर नहीं देती है।

MODE must be one of the following: 

     clean   remove files from the build directory 
     compile   compile a source file into a libtool object 
     execute   automatically set library path, then run a program 
     finish   complete the installation of libtool libraries 
     install   install libraries or executables 
     link   create a library or an executable 
     uninstall  remove libraries from an installed directory 
+0

'libtool' का उपयोग करके एक स्थिर लाइब्रेरी बनाने के लिए, उन सभी 80 स्थैतिक पुस्तकालयों को 'libtool --mode = compile' के साथ संकलित किया जाना चाहिए और सादा' gcc' नहीं होना चाहिए। साथ ही, क्या आप अपना आउटपुट 'कौन सी libtool' और' ls -l <पथ आउटपुट के लिए साझा कर सकते हैं जिसमें libtool कमांड> ' – askmish

उत्तर

3

मैं शायद कुछ नतीजे को अनदेखा कर रहा हूं, लेकिन क्या आप फ़ाइलों को सीधे अभिलेखागार के रूप में नहीं देख सकते?

for i in *.a; ar x $i; done 
ar r libfoo.a *.o 
ranlib libfoo.a 
बेशक

, आप योजना का नाम बदलने अगर .o फ़ाइलों में से किसी एक ही हैं किसी तरह की आवश्यकता होगी। शायद libname_objectname.o की तरह कुछ।

1

पहले जुड़ा हुआ जवाब के बारे में मैक ओएस libtool, नहीं जीएनयू libtool है:

FYI..These मोड कर रहे हैं।

दूसरी कड़ी वास्तव में, काम हो सकता है अगर आप एक हुक स्थापित लेखन कोई आपत्ति नहीं है (यहाँ दिखाया गया है Makefile चर के साथ लिपटे):

$(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(AR) cru "$(DESTDIR)$(libdir)/libsponge.a" libfoo.a libbar.a ... 

libtool "लिंक" मोड बहुत उधम मचाते स्थिर के संबंध में लगता है libs। मैं इसे करने में सक्षम था लेकिन उसने मुझे चेतावनी दी - प्रत्येक स्थैतिक पुस्तकालय के लिए एक, जो आपके लिए एक बड़ा कैस्केड होगा।

हालांकि, इस मामले में libtool को बाईपास करना आसान हो सकता है। यह जीएनयू ar के साथ काम करेंगे:

lib_LIBRARIES=libsponge.a 
libsponge.a : libfoo.a libbar.a ... 
     echo "CREATE [email protected]" > libsponge-script 
     list='$^'; for p in $$list; do \ 
      echo "ADDLIB $$p" >> libsponge-script; \ 
     done 
     echo "SAVE" >> libsponge-script 
     $(AR) -M < libsponge-script 
     $(RANLIB) [email protected] 

यदि यह पोर्टेबल होना चाहिए, कुछ इस तरह काम करेगा:

lib_LIBRARIES=libsponge.a 
libsponge.a : libfoo.a libbar.a ... 
     $(AR) cru [email protected] 
     $(MKDIR_P) tmpar 
     list='$^'; for p in $$list; do \ 
      (cd tmpar; $(AR) x "../$$p"; $(AR) q "../[email protected]" *.o; rm *.o;) \ 
     done 
     rm -rf tmpar 
     $(RANLIB) [email protected] 
+0

धन्यवाद लेकिन अंतिम समाधान काम नहीं करता है। मुझे लगता है कि "प्रतीकों को नहीं पढ़ सका: पुरालेख में कोई अनुक्रमणिका नहीं है; एक जोड़ने के लिए रैनलिब चलाएं" भले ही मैं रैनलिब चला गया। ar t linspnge.a पुस्तकालयों की एक सूची देता है और उन फ़ाइलों को ऑब्जेक्ट नहीं करता जो मुझे लगता है कि एक समस्या है – Nikhil

+0

जहां तक ​​मुझे पता है, आपको पहले .o फ़ाइलों को निकालना होगा, और फिर उनसे नया संग्रह बनाना होगा। दस्तावेज़ यह सुझाव नहीं देते हैं कि यह स्वचालित रूप से इनपुट अभिलेखागार से ऑब्जेक्ट निकाल देगा। हो सकता है मैं गलत हूं। – ams

+0

@ निखिल, तो आप कह रहे हैं कि आपके इनपुट में से एक 'ए' फाइलों में कोई अनुक्रमणिका नहीं है? – ldav1s

0

libtool जीसीसी के मापदंडों पर लग रहा है, तो आप

नीचे की तरह कुछ करना चाहिए था
$ cat Makefile 
all: libone libtwo 
     rm *.o 
     @libtool --mode=link gcc -all-static -o libcombo.a libone.a libtwo.a 

libone: one.c 
     @libtool --mode=compile gcc -c one.c -o one.lo 
     @libtool --mode=link gcc -static -o libone.a one.lo 

libtwo: two.c 
     @libtool --mode=compile gcc -c two.c -o two.lo 
     @libtool --mode=link gcc -static -o libtwo.a two.lo 

clean: 
     rm -rf .libs *.lo *.o *.a 
संबंधित मुद्दे

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