2011-08-24 14 views
7

पर .dylib के इंस्टॉल नाम को मैं कैसे संशोधित करूं मैं मैक ओएस एक्स (10.7.1) पर C++ के लिए google-gflags कमांडलाइन फ़्लैग लाइब्रेरी का निर्माण कर रहा हूं।बिल्ड समय

$ ./configure --prefix=output 
$ make 
$ make install 

मैं निर्माण समय पर उत्पन्न साझा लाइब्रेरी के नाम पर स्थापित बदलने के लिए और बाद में install_name_tool का उपयोग नहीं करना चाहते हैं: निर्माण प्रक्रिया के रूप में है।

$ otool -L ./output/libgflags.dylib 
$ ./output/libgflags.dylib: 
    /tmp/gflags-1.5/output/lib/libgflags.0.dylib (compatibility version 2.0.0, current version 2.0.0) 
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.0.0) 

ld(1) के लिए आदमी पेज एक -install_name विकल्प जो एक गतिशील का नाम स्थापित बदलने के लिए इस्तेमाल किया जा सकता है:

डिफ़ॉल्ट रूप से, उत्पन्न साझा लाइब्रेरी, libgflags.dylib की install name, उत्पादन मार्ग है लिंक-टाइम पर लाइब्रेरी।

उदाहरण के लिए, एक डमी कार्यक्रम के साथ:

$ g++ -dynamiclib temp.cc -install_name /tmp/temp.dylib -o temp.dylib 
$ otool -L temp.dylib 
temp.dylib: 
    /tmp/temp.dylib (compatibility version 0.0.0, current version 0.0.0) 
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.0.0) 

लेकिन, मुझे ./configure स्क्रिप्ट के साथ इस कमांड लाइन विकल्प का उपयोग करने में असमर्थ हूँ। मैं मैन्युअल CFLAGS चर स्थापित करने की कोशिश की है, लेकिन यह एक त्रुटि में परिणाम है:

$ CFLAGS="-install_name /tmp/desired/location/libgflags.dylib" ./configure 
checking for a BSD-compatible install... /opt/local/bin/ginstall -c 
checking whether build environment is sane... yes 
checking for gawk... no 
checking for mawk... no 
checking for nawk... no 
checking for awk... awk 
checking whether make sets $(MAKE)... yes 
checking for gcc... gcc 
checking whether the C compiler works... no 
configure: error: in `/Users/vibhav/Code/install_name_test/gflags-1.5': 
configure: error: C compiler cannot create executables 

तो, यह मेरे install_name_tool का उपयोग किए बिना configure और make द्वारा उत्पन्न .dylib का नाम स्थापित बदलने के लिए संभव है?

+0

मुझे समझ में नहीं आता कि आप क्या करने की कोशिश कर रहे हैं। आप बस './configure --prefix/tmp/वांछित/स्थान' क्यों नहीं चला सकते? – adl

+0

यह एक वैध सवाल है। मैं विभिन्न कारणों से उस स्थान पर '--prefix' सेट नहीं कर सकता, जिसमें मेरा निर्माण स्थान मेरे एप्लिकेशन के" इंस्टॉल "स्थान से अलग है। मैं बस 'कॉन्फ़िगरेशन' का उपयोग करते समय उचित लिंकर ध्वज पास करना चाहता हूं। – v8891

+0

आपका परिदृश्य अभी भी मुझे स्पष्ट नहीं है। क्या आप समझा सकते हैं कि आपके सेटअप के लिए मानक './configure --prefix/कहीं और && बनाना && इंस्टॉल करना गलत है? आपका निर्माण स्थान क्यों मायने रखता है? (आपको निश्चित रूप से एक पूर्ण उपसर्ग का उपयोग करना चाहिए।) क्या आप इसे इंस्टॉल किए बिना 'libglflags' से लिंक करने का प्रयास कर रहे हैं? (उस स्थिति में आपको 'libflol.la'' के साथ अपने आवेदन को लिंक करने के लिए 'libtool' का उपयोग करना चाहिए और libtool को अपने जादू को गैर-स्थापित लाइब्रेरी से लिंक करने दें।) क्या आप लाइब्रेरी को अस्थायी स्थान पर स्थापित करना चाहते हैं अपने अंतिम स्थान पर प्रतिलिपि बनाई गई? (यह DESTDIR चर के लिए एक नौकरी है।) – adl

उत्तर

5

आम तौर पर, जी ++ के माध्यम से लिंकर तर्क पारित करना -Wl और रिक्त स्थान को अल्पविराम से प्रतिस्थापित किया जाना चाहिए। इसलिए, यदि आप लिंकर करने के लिए "-install_name /tmp/temp.dylib" पास करना चाहते हैं तो आप इस कॉल करने के लिए की आवश्यकता होगी:

g++ -Wl,-install_name,/tmp/temp.dylib ... 
4

एक संभव दृष्टिकोण संपादन किया जाएगा config.status मैन्युअल। लेकिन इससे पहले कि मैं ऐसा करने की कोशिश करता हूं, install_name_tool -id ने मेरी जान बचाई।

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