2011-02-03 9 views
5

दो पुस्तकालयों और दोनों के लिए परीक्षण कार्यक्रमों के निर्माण के दौरान मैंने एक साधारण समस्या पर ठोकर खाई है।स्थैतिक पुस्तकालयों और स्कैन के लिए ट्रांजिटिव निर्भरता

समस्या: मेरे पास दो स्थिर पुस्तकालय, libA और libB हैं, और libB libA पर निर्भर करता है। मैं libA को libB का उपयोग करने वाले सभी प्रोग्रामों को स्पष्ट रूप से लिंक नहीं करना चाहता हूं, मैं चाहता हूं कि स्कैन यह देखने के लिए कि यदि कोई प्रोग्राम लाइब्रेरी बी से लिंक करता है तो उसे लाइब्रेरी ए से भी लिंक करना चाहिए।

मैंने एक साधारण उदाहरण बनाया है जो इस समस्या को दर्शाता है। जब से मैं एक उपयुक्त फ़ाइल होस्टर नहीं पा सके और इस प्रोग्रामिंग से संबंधित है, मैं एक छोटे से SVN भंडार बनाया:

svn checkout https://example-repository.googlecode.com/svn/trunk example-repository 

या आप एक टारबॉल here डाउनलोड कर सकते हैं।

उत्तर

4

स्कैन्स आपके द्वारा वर्णित ट्रांजिटिव लाइब्रेरी निर्भरताओं को व्यक्त करने के लिए समर्थन में नहीं बनाया गया है, लेकिन इसका छोटा चचेरा भाई Waf करता है। Waf पुस्तक में "उपयोग" सुविधा के लिए documentation देखें। Boost build system में यह सुविधा under a different name है। यदि आप थोड़ा सा पायथन कोड करने के इच्छुक हैं तो आप इसे स्कैन में स्वयं लागू करना भी चुन सकते हैं।

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

+0

+1 दिलचस्प लिंक! मैं वेफ मैनुअल की जांच करूंगा, लेकिन जो कुछ मैं देखता हूं, उससे यह एक अच्छा विकल्प हो सकता है। दूसरी तरफ, मैंने पहले ही स्कैन के साथ कुछ कस्टम बिल्डर्स को लागू करना शुरू कर दिया है ... – hochl

+0

मेरा वर्तमान समाधान अतिरिक्त कॉन्फ़िगरेशन फ़ाइलों के आधार पर निर्भरता ग्राफ बनाता है जिसमें निर्भरता जानकारी होती है क्योंकि मुझे बिल्ड के बीच निर्भरता प्राप्त करने का कोई अन्य तरीका नहीं मिला है गतिशील रूप से लक्ष्य। – hochl

0

libB और libA क्या हैं? क्या वे libs हैं जो एक बड़े हैं। या वे कई .o फाइलों से बना है?

यदि libs एकाधिक .o फ़ाइलें हैं और आप libB की .o फ़ाइलों में से किसी एक में फ़ंक्शन को कॉल कर रहे हैं जो libA की .o फ़ाइलों में से एक का उपयोग करता है, तो आपको libB's .o और निर्भर libA .o मिलता है। यदि आप libb में किसी फ़ंक्शन का उपयोग कर रहे हैं। तो यह libA से कुछ भी निर्भर नहीं करता है, तो आपको केवल अपनी बाइनरी में libB .o फ़ाइल मिलती है।

इस प्रकार, आप आदेश है, तो:

cc -o a.out a.c libA.a libB.a 

आप केवल भागों दोनों libB और LIBA से आवश्यक हो जाएगा।

+0

उनमें केवल साधारण ऑब्जेक्ट फ़ाइलें होती हैं, जैसा कि उदाहरण टैरबॉल में देखा जा सकता है (पोस्टिंग के अंत में लिंक देखें)। – hochl

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