2011-06-17 10 views
38

यदि कोई दोस्त मेरे हास्केल बाइनरी को चलाने के लिए चाहता है, तो क्या उसे पहले हास्केल इंस्टॉल करना होगा, या क्या वह तुरंत बाइनरी चला सकता है?क्या ghc-compiled binaries को जीएचसी की आवश्यकता होती है या वे स्वयं निहित हैं?

क्या मैक, विंडोज और लिनक्स पर इसका उत्तर है?

+0

गतिशील लिंकिंग पर इस पहले के उत्तर को भी देखें, http://stackoverflow.com/questions/6115459/small-haskell-program-compiled-with-ghc-into-huge-binary –

+0

और स्थैतिक लिंकिंग पर, http://stackoverflow.com/questions/5131182/how-to-compile-haskell-to-a-static-library –

उत्तर

37

जीएचसी स्टैंड-अलोन बाइनरी का उत्पादन करता है जिसे जीएचसी को स्थापित करने की आवश्यकता नहीं होती है, हालांकि वे कुछ गतिशील पुस्तकालयों के खिलाफ लिंक करते हैं, विशेष रूप से libgmp। शेष पुस्तकालय आमतौर पर अधिकांश लिनक्स सिस्टम पर बॉक्स से बाहर पाए जाते हैं। मेरा मानना ​​है कि स्थिति विंडोज पर समान है।

आप लिनक्स पर ldd का उपयोग करने पर निर्भर गतिशील पुस्तकालयों की जांच कर सकते हैं। यहाँ है कि मैं क्या एक साधारण नमस्ते विश्व कार्यक्रम के लिए Ubuntu Natty पर प्राप्त होते हैं:

$ echo 'main = putStrLn "Hello World"' > Hello.hs             
$ ghc --make Hello.hs                  
[1 of 1] Compiling Main    (Hello.hs, Hello.o) 
Linking Hello ... 
$ ldd Hello                     
    linux-vdso.so.1 => (0x00007fffe45ff000) 
    libgmp.so.3 => /usr/lib/libgmp.so.3 (0x00007f8874cf9000) 
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8874a74000) 
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f887486b000) 
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8874667000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f88742d3000) 
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f88740b4000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007f8874f7a000) 
+2

'ldd' रूप में अच्छी तरह मैक ओएस एक्स पर काम करना चाहिए, और Windows पर, आप उपयोग कर सकते हैं [निर्भरता वाकर] (http : //www.dependencywalker.com/) एक ही जानकारी प्राप्त करने के लिए। –

+8

@Daniel Pryden: 'ldd' ओएस एक्स पर नहीं है, लेकिन आप -L' otool' का उपयोग इसी तरह की जानकारी प्राप्त करने के लिए कर सकते हैं। – mipadi

5

अधिकांश द्विआधारी के लिए जीएचसी की स्थापना की आवश्यकता नहीं है। कुछ (उदा। Xmonad) हास्केल का उपयोग उनकी कॉन्फ़िगरेशन भाषा के रूप में करते हैं; उन मामलों में आपको एक कंपाइलर की आवश्यकता होगी।

स्थिर बनाम गतिशील लिंकिंग का एक प्रश्न भी है। मेरा मानना ​​है कि अभी के लिए डिफ़ॉल्ट अभी भी स्थिर लिंकिंग है, इस मामले में एक मशीन से दूसरी मशीन में बाइनरी माइग्रेट करना काफी आसान होना चाहिए (केवल वही आर्किटेक्चर और ओएस होना चाहिए)।

19

GHC संकलित हास्केल किसी लिंक किए गए क्रम के साथ, कोड आपत्ति उठाने का। इसका मतलब है कि आपको हास्केल प्रोग्राम निष्पादित करने के लिए स्थापित हास्केल कंपाइलर की आवश्यकता नहीं है।

उत्पन्न निष्पादन योग्य सी और हास्केल लाइब्रेरी निर्भरताओं दोनों के लिए स्थैतिक और गतिशील लिंकिंग के कुछ प्रकार का उपयोग करेगा। जो कुछ भी स्थिर रूप से जुड़ा हुआ है उसे उपयोगकर्ता की मशीन पर स्थापित करने की आवश्यकता नहीं है। गतिशील रूप से जुड़े कुछ भी स्थापित किया जाना चाहिए।

क्या आप निष्पादन योग्य के साथ जहाज की जरूरत है, लिनक्स (या cygwin) पर, ldd का उपयोग देखने के लिए। आप -static को जीएचसी में पास करके लगभग हर चीज की स्थिर लिंकिंग को मजबूर कर सकते हैं।

9

यदि लिनक्स पर आपके हास्केल निष्पादन योग्य के साथ कुछ सी पुस्तकालयों को स्थिर रूप से लिंक करना वांछनीय है, तो आप जीएनयू लिंकर के साथ --whole-archive का उपयोग कर सकते हैं; उदाहरण के लिए:

ghc --make HelloZ.hs \ 
    -optl-Wl,--whole-archive \ 
     -optl/usr/lib/x86_64-linux-gnu/libffi.a \ 
     -optl/usr/lib/x86_64-linux-gnu/libz.a \ 
    -optl-Wl,--no-whole-archive 

जबकि वे बहुत आम हैं, libffi और libz सर्वव्यापी नहीं हैं (libffi एक है कि मैं अक्सर अपनी हास्केल बाइनरी में देखना है)।

इस दृष्टिकोण को हाल ही में मुझे हाल ही में haskell-cafe पर सुझाया गया था।

+1

मैं माफी चाहता हूँ, मैं एक त्रुटि जब मैं इस सवाल का जवाब पहले दे दी बनाया - मैं एक निर्माण वातावरण जहां मैं पहले से ही GHC के libdir करने के लिए कुछ '.a' फ़ाइलों की नक़ल की थी में परीक्षण किया गया था। यह महत्वपूर्ण है सभी पुस्तकालयों भी (अब संशोधित) ऊपर के उदाहरण में दिए गए, अन्यथा GHC उन्हें लिंकर विकल्पों के संबंध में reorders के रूप में उनके सामने -optl' 'है,। – solidsnack

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