2014-10-19 3 views
10

मैं निम्नलिखित स्थिति है:"टेम्पलेट हास्केल + सी" बग के लिए एक कामकाज?

  • Library X सी में कुछ कोड के ऊपर एक आवरण
  • Library A पुस्तकालय एक्स पर निर्भर करता है
  • Library B का उपयोग करता खाका हास्केल और पुस्तकालय ए पर निर्भर करता है

GHC bug #9010 जीएचसी 7.6 का उपयोग करके लाइब्रेरी बी स्थापित करना असंभव बनाता है। जब वें संसाधित किया जाता है, GHCi ऊपर आग और पुस्तकालय एक्स, जो की तरह

Loading package charsetdetect-ae-1.0 ... linking ... ghc: 
~/.cabal/lib/x86_64-linux-ghc-7.6.3/charsetdetect-ae-1.0/ 
libHScharsetdetect-ae-1.0.a: unknown symbol `_ZTV15nsCharSetProber' 

संदेश ("अज्ञात प्रतीक" का वास्तविक नाम मशीन से मशीन के लिए अलग है) के साथ विफल रहता है लोड करने के लिए कोशिश करता है।

क्या इस समस्या के लिए कोई कामकाज है (निश्चित रूप से "टेम्पलेट हास्केल का उपयोग न करें" के अलावा)? हो सकता है कि लाइब्रेरी एक्स को अलग-अलग संकलित किया जाए, या लोड होने से रोकने के लिए कुछ तरीका है (क्योंकि इसे कोड पीढ़ी के दौरान भी नहीं कहा जाना चाहिए)?

+0

जोड़े '-lyourlibname' विकल्प GHCi के लिए जहां libyourlibname.so पुस्तकालय एक्स wraps है। –

+0

@ एन.एम. कोई 'libyourlibname.so' नहीं है - लाइब्रेरी एक्स द्वारा लिपटे गए सभी कोड लाइब्रेरी एक्स में ही निहित हैं। – Artyom

+0

एचएम, ऐसा लगता है कि आप सही हैं। प्रतीक अज्ञात है, अपरिभाषित नहीं है। –

उत्तर

4

यह वास्तव में मुख्य कारणों में से एक है कि 7.8 डिफ़ॉल्ट रूप से गतिशील जीएचसीआई पर स्विच किया गया। प्रत्येक ऑब्जेक्ट फ़ाइल प्रारूप की हर सुविधा का समर्थन करने के बजाय, यह गतिशील पुस्तकालय बनाता है और सिस्टम को गतिशील लोडर उन्हें संभालता है।

g ++ विकल्प -fno-weak के साथ निर्माण करने का प्रयास करें। जी ++ आदमी पृष्ठ से:

-fno-कमजोर

, कमजोर प्रतीक समर्थन का उपयोग न करें तो भी यह लिंकर द्वारा प्रदान की जाती है। डिफ़ॉल्ट रूप से, यदि वे उपलब्ध हैं तो G ++ कमजोर प्रतीकों का उपयोग करेगा। यह विकल्प केवल परीक्षण के लिए मौजूद है, और अंतिम उपयोगकर्ताओं द्वारा उपयोग नहीं किया जाना चाहिए; इसके परिणामस्वरूप निम्न कोड होगा और इसका कोई लाभ नहीं होगा। यह विकल्प जी ++ की भावी रिलीज में हटाया जा सकता है।

__dso_handle के साथ एक और समस्या है। मैंने पाया कि आप कम से कम लाइब्रेरी को लोड करने के लिए प्राप्त कर सकते हैं और स्पष्ट रूप से उस फ़ाइल को लिंक करके काम कर सकते हैं जो उस प्रतीक को परिभाषित करता है। मुझे नहीं पता कि यह हैक कुछ गलत होने का कारण बन जाएगा।

तो X.cabal में

if impl(ghc < 7.8) 
    cc-option: -fno-weak 
    c-sources: cbits/dso_handle.c 

जोड़ने जहां cbits/dso_handle.c शामिल

void *__dso_handle; 
संबंधित मुद्दे