2012-02-21 12 views
26

हमारे पास स्थिर पुस्तकालयों में एक कोड आधार टूट गया है। दुर्भाग्यवश, पुस्तकालयों में परिपत्र निर्भरताएं हैं; उदाहरण के लिए, libfoo.alibbar.a और इसके विपरीत पर निर्भर करता है।एक ही लाइब्रेरी को दो बार जोड़कर परिपत्र निर्भरताओं को हल करना?

g++ -o myApp -Wl,--start-group -lfoo -lbar -Wl,--end-group 

लेकिन हमारे मौजूदा Makefiles में, समस्या आम तौर पर इस तरह नियंत्रित किया जाता है:

मैं "सही" जिस तरह से यह इतना तरह लिंकर की --start-group और --end-group विकल्पों का उपयोग करने, है संभाल करने के लिए पता

g++ -o myApp -lfoo -lbar -lfoo 

(कल्पना कीजिए यह करने के लिए ~ परिसर के साथ बढ़ाया 20 पुस्तकालयों।)

मैं कहां से गुजर रही किया गया है आर मेकफ़ाइल पहले फॉर्म को दूसरे रूप में बदल रहा है, लेकिन अब मेरे सहकर्मी मुझसे पूछ रहे हैं क्यों ... और "क्योंकि यह क्लीनर" और अस्पष्ट भावना है कि दूसरा रूप जोखिम भरा है, मेरे पास कोई अच्छा जवाब नहीं है।

तो, एक ही लाइब्रेरी को कई बार लिंक कर सकते हैं कोई समस्या पैदा करें? उदाहरण के लिए, क्या लिंक गुणा-परिभाषित प्रतीकों के साथ विफल हो सकता है यदि वही .o दो बार खींच लिया जाता है? या क्या कोई जोखिम है जो हम एक ही स्थैतिक वस्तु की दो प्रतियों के साथ हवादार हो सकते हैं, सूक्ष्म बग बना सकते हैं?

असल में, मैं जानना चाहता हूं कि लिंक लाइफ या रन-टाइम विफलताओं की संभावना है कि एक ही लाइब्रेरी को कई बार लिंक करने से हो; और यदि हां, तो उन्हें कैसे ट्रिगर करें। धन्यवाद।

+0

एकमात्र समस्या जिसे मैं सोच सकता हूं वह तब होता है जब आप उसी लाइब्रेरी के दो अलग-अलग संस्करणों से लिंक करते हैं। ऐसा करना मुश्किल है और (आईएमओ) लिनक्स पर होने की संभावना नहीं है। इसके अलावा, केवल 20 पुस्तकालयों की तरह दिखता नहीं है। क्या मेकफ़ाइल के माध्यम से चलना उचित है? आप उस समय कुछ और कर सकते हैं। – SigTerm

+3

यदि आप अपनी पुस्तकालयों को परिपत्र निर्भरता नहीं रखते हैं तो यह समस्या अभी दूर हो जाती है। –

+3

मुझे लगता है कि पुस्तकालयों की जांच और तोड़कर सर्कुलर निर्भरता को दूर करना संभव नहीं है? क्योंकि यह सबसे साफ तरीका होगा –

उत्तर

5

मैं जो पेशकश कर सकता हूं वह काउंटर-उदाहरण की कमी है। मैंने वास्तव में पहले फॉर्म को पहले कभी नहीं देखा है (भले ही यह स्पष्ट रूप से बेहतर है) और हमेशा इसे दूसरे रूप से हल किया जाता है, और परिणामस्वरूप समस्याएं नहीं देखी गई हैं।

यहां तक ​​कि मैं अभी भी पहले फॉर्म में बदलने का सुझाव दूंगा क्योंकि यह स्पष्ट रूप से पुस्तकालयों के बीच संबंध को स्पष्ट रूप से व्यवहार करने वाले लिंकर पर भरोसा करने के बजाय दिखाता है।

उस ने कहा, मैं कम से कम इस बात पर विचार करता हूं कि अतिरिक्त पुस्तकालयों में आम टुकड़ों को खींचने के लिए कोड को दोबारा करने की संभावना है या नहीं।

+5

धन्यवाद, मार्क। हालांकि मुझे यह आश्चर्यजनक लगता है कि मेरे प्रश्न पर टिप्पणियों में से आधे कहते हैं, "अपना कोडबेस ठीक करें!" और दूसरा आधा कहता है, "आप एक कामकाजी कोडबेस के साथ छेड़छाड़ क्यों कर रहे हैं?" :-) – Nemo

+0

पहला फॉर्म प्रदर्शन लागत पेश करेगा क्योंकि लिंकर सभी सूचीबद्ध पुस्तकालयों में बार-बार प्रतीकों को खोजने का प्रयास करता है। इसे देखें: http://stackoverflow.com/a/409470/70198 –

+0

पहला फॉर्म केवल जीएनयू एलडी के लिए काम कर रहा है और इस प्रकार यह एक पोर्टेबल समाधान नहीं है। – user1225999

1

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

भले ही संरचित कारण विरासत पुस्तकालय संरचना के लिए बने रहें, लगभग निश्चित रूप से, यह अभी भी विरासत व्यवस्था से एक और पुस्तकालय बनाने के लिए स्वीकार्य होगा। बस 20 पुस्तकालयों से सभी मॉड्यूल को एक नई लाइब्रेरी में रखें, liballofthem.a। फिर प्रत्येक एकल एप्लिकेशन बस g++ -o myApp -lallofthem ...

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