2012-05-10 14 views
15
  1. का उपयोग कर मैं कैसे libgmp पर गतिशील निर्भरता छोड़ सकते हैं और जाना इस से:स्थिरता लिंक जीएमपी GHC (+ LLVM)

    linux-vdso.so.1 => (0x00007fffdccb1000) 
    libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007fb01afc1000) 
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb01acc7000) 
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fb01aabe000) 
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb01a8ba000) 
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb01a69d000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb01a2df000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007fb01b249000) 
    
    इस (वर्तमान में आवश्यक होने पर) के लिए

    :

    linux-vdso.so.1 => (0x00007fffdccb1000) 
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb01acc7000) 
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fb01aabe000) 
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb01a8ba000) 
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb01a69d000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb01a2df000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007fb01b249000) 
    

    एक स्वच्छ और पोर्टेबल तरीके से जो सभी जीएनयू/लिनक्स वितरण पर काम करता है (और बीएसडी (ओएस एक्स सहित) के साथ गड़बड़ नहीं कर रहा है)?

  2. क्या आप अन्य जीएनयू/लिनक्स वितरण को लक्षित करने वाले एकल हास्केल बाइनरी को वितरित करते समय उपर्युक्त वांछित सूची में समस्याएं पैदा कर सकते हैं जो किसी अन्य निर्भरता को देख सकते हैं?


नोट्स:

  • मेरे ऐप GPLv3 है तो कोई लाइसेंस उल्लंघन मुद्दों libgmp.a के पथ को निर्दिष्ट करना काम नहीं करता है (How to selectively link certain system libraries statically into Haskell program binary?) जीएमपी
  • के बारे में, libgmp अब भी है उत्पन्न होती हैं ldd आउटपुट में सूचीबद्ध है।
+0

आपकी तैनाती प्रक्रिया कैसी है? विशेष रूप से आप अपने आवेदन के साथ libgmp तैनाती से क्या रोक रहा है? ओएसएक्स समेत बीएसडी पर गड़बड़ न करने का क्या मतलब है? आप ओएसएक्स और लिनक्स दोनों पर एक ही बाइनरी नहीं चला सकते हैं। – asm

+0

@AndrewMyers मैं निर्माण के लिए Cabal का उपयोग करें। Libgmp तैनात करें? कैसे? मैं कम से कम विंडोज, लिनक्स, ओएस एक्स और फ्रीबीएसडी का समर्थन करना चाहता हूं। यदि मुझे अपने ऐप के साथ इसे तैनात करने के लिए प्रत्येक प्लेटफ़ॉर्म के लिए libgmp का एक साझा/गतिशील लाइब्रेरी संस्करण बनाना है, तो यह बहुत अधिक काम है। गड़बड़ नहीं: एक समाधान जो न केवल एक ओएस पर काम करता है; शायद किसी को 'libgmp का पता लगाने' जैसे कुछ का उपयोग करने का सुझाव देने और लिंक समय पर जो कुछ भी वापस आ सकता है और 'ओएस' अलग-अलग ओएस पर अलग-अलग व्यवहार करने का सुझाव दे रहा था। (जैसा कि आप चाहें वहां किसी भी अन्य टूल के साथ 'पता लगाएँ' को बदलें।) –

+0

ऐसा लगता है कि आप एक बाइनरी तैनात करने के बारे में बात कर रहे हैं, जिसे आपको प्रत्येक प्लेटफ़ॉर्म के लिए बनाना होगा। चूंकि आपको प्रत्येक प्लेटफ़ॉर्म के लिए इसे बनाना है, इसलिए आपको प्रत्येक प्लेटफ़ॉर्म के लिए libgmp का संस्करण होना है, इसलिए आप इसे अपने बाइनरी से पैकेज कर सकते हैं। क्या मैं इस बारे में कुछ याद कर रहा हूं कि आप अपने आवेदन को वितरित करने की योजना बना रहे हैं? – asm

उत्तर

15

यदि आप जीएचसी में -optl-static -optl-pthread पास करते हैं, तो यह जीएमपी समेत सभी रनटाइम लाइब्रेरी निर्भरताओं को स्थिर रूप से लिंक करेगा। अपनी कैबल फ़ाइल में ld-options: -static -pthread सेट करना एक ही चीज़ को पूरा करना चाहिए।

इसका मतलब है कि आप स्थिर रूप से ग्लिब में भी लिंक करेंगे, लेकिन शायद यह कोई समस्या नहीं होगी, हालांकि यह बाइनरी आकार को थोड़ा बढ़ा सकता है। musl या uClibc जैसे वैकल्पिक libc का उपयोग करना चाहिए, अगर यह आपके लिए कोई समस्या है, तो इसका विरोध करने में मदद करनी चाहिए।

+2

किसी को '-pthread' क्यों चाहिए? –

+1

मुझे यकीन नहीं है। आखिरी बार जब मैंने जीएचसी के साथ एक कार्यक्रम को स्थाई रूप से जोड़ा, तो मुझे पर्थ्रेड प्रतीकों से संबंधित त्रुटियां मिलीं, अगर मैंने इसे पास नहीं किया। यह अब और आवश्यक नहीं हो सकता है। – ehird

+0

मैंने अभी तक एक ऐप को यथासंभव स्थिर रूप से लिंक किया है। ** विंडोज ** और ** ओएस एक्स **: 'libgmp' स्थिर रूप से संकलित है। ** लिनक्स **: 'ghc' और' ld' के लिए '-static'' -pthread' के बिना पर्याप्त है; 'libc' स्थिर रूप से जुड़ा हुआ है लेकिन' libc' के अंदर उपयोग किए जाने वाले गतिशील लोडिंग के बारे में चेतावनी देता है। ** फ्रीबीएसडी **: हमेशा 'pthread' प्रतीकों के बारे में शिकायत करता है कि क्या मैं' -pthread' का उपयोग करता हूं या नहीं। –