2013-07-02 5 views
7

मैं एक हास्केल लाइब्रेरी पैकेज पर काम कर रहा हूं जिसके लिए कुछ ओएस एपीआई से बात करने के लिए विंडोज़ पर कस्टम। डीएल और .lib की आवश्यकता होती है। .lib लाइब्रेरी में extra-libraries फ़ील्ड के साथ जुड़ा हुआ है और डीएलएल data-files के साथ कैबल पैकेज निर्देशिका में स्थापित है।पुस्तकालय उपयोगकर्ताओं के लिए लाइब्रेरी संकलन के लिए आवश्यक स्थिर .lib भी आवश्यक है?

किसी कारण से (मैं किसी भी माध्यम से जोड़ने पर एक विशेषज्ञ नहीं हूं, लेकिन यह अजीब लगता है) यदि मैं एक परीक्षण निष्पादन योग्य बनाता हूं जो मेरे पैकेज का उपयोग करता है (build-depends फ़ील्ड में), तो वह इसमें लिंक करना चाहता है। lib पुस्तकालय संकलित करने के लिए प्रयोग किया जाता है - भले ही यह सिर्फ लाइब्रेरी फ़ंक्शंस को कॉल कर रहा हो, भले ही कोई भी .lib खुलासा न हो। स्पष्ट रूप से इसे रनटाइम पर .dll तक पहुंच की आवश्यकता है लेकिन इसकी अपेक्षा की जा सकती है। .lib की आवश्यकता भी अजीब लगता है।

मुझे उम्मीद है कि .lib पहले से ही मेरी लाइब्रेरी के लिए स्थापित होने पर कैबल/जीएचसी द्वारा उत्पन्न .a फ़ाइल में लिंक हो जाएगा। क्या यह मामला नही है? और यदि यह है, तो क्या कोई यह समझा सकता है कि ऐसा क्यों है?

उत्तर

1

ऐसा लगता है कि आप आंशिक लिंकिंग चाहते हैं (--relocatableld मैन्युअल पृष्ठ में ध्वज देखें)। जैसा कि मैं स्रोतों से देख सकता हूं, cabal आंशिक लिंकिंग केवल पुस्तकालयों का उपयोग करता है, ghci के लिए संकलित। Distribution.Simple.GHC (buildLib समारोह) से:

whenVanillaLib False $ do 
    (arProg, _) <- requireProgram verbosity arProgram (withPrograms lbi) 
    Ar.createArLibArchive verbosity arProg 
    vanillaLibFilePath staticObjectFiles 

whenProfLib $ do 
    (arProg, _) <- requireProgram verbosity arProgram (withPrograms lbi) 
    Ar.createArLibArchive verbosity arProg 
    profileLibFilePath profObjectFiles 

whenGHCiLib $ do 
    (ldProg, _) <- requireProgram verbosity ldProgram (withPrograms lbi) 
    Ld.combineObjectFiles verbosity ldProg 
    ghciLibFilePath ghciObjFiles 

whenSharedLib False $ 
    runGhcProg ghcSharedLinkArgs 

आप देख सकते हैं, कि वेनिला और रूपरेखा पुस्तकालयों के लिए, cabal सिर्फ ar उपयोगिता (createArLibArchive देखें) कहते हैं। ghci के लिए यह ld-r ध्वज के साथ कॉल करता है (जो --relocatable के लिए शॉर्टकट है) (combineObjectFiles देखें)।

तो, cabal वास्तव में वेनिला पुस्तकालयों के लिए कोई लिंक नहीं करता है, यह केवल ऑब्जेक्ट फ़ाइलों को जोड़ता है। असल में cabal नहीं पता, अंतिम आवेदन आपके extra-lib से किसी भी प्रतीक का उपयोग करेगा, इसलिए व्यवहार उचित लगता है।

+0

क्या वेनिला पुस्तकालयों के लिए 'ar' के बजाय' ld -r' का उपयोग करने के लिए मजबूर करने का कोई तरीका है? मैंने 'ld-options: -r' जोड़ने का प्रयास किया है लेकिन ऐसा कुछ प्रतीत नहीं होता है (संभवतः क्योंकि 'ld' का उपयोग नहीं किया जा रहा है?) –

+0

@TomSavage नहीं, मुझे लगता है कि यह संभव नहीं है। लेकिन मैं कैबल में एक विशेषज्ञ नहीं हूँ। – Yuras

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