2011-09-08 15 views
8

हम एक नई सी ++ लाइब्रेरी तैयार करने की प्रक्रिया में हैं और कोने के मामलों के लिए कुछ विशिष्ट आंशिक टेम्पलेट विशेषज्ञता के साथ टेम्पलेट-आधारित दृष्टिकोण के साथ जाने का फैसला किया है। विशेष रूप से, यह हेडर-केवल टेम्पलेट लाइब्रेरी होगा।एक साझा लाइब्रेरी में हेडर-केवल टेम्पलेट लाइब्रेरी संकलित करें?

अब, वहाँ कुछ चिंता है कि इस, कोड दोहराव बाइनरी में का एक बहुत के लिए नेतृत्व करेंगे के बाद से इस टेम्पलेट 'पुस्तकालय' किसी भी अन्य शेयर की गई लाइब्रेरी या निष्पादन यह (यकीनन केवल उन हिस्सों का उपयोग करता है में संकलित हो जाएगा उपयोग किया जाता है)। मुझे अभी भी लगता है कि यह कोई समस्या नहीं है (विशेष रूप से, संकलक उन चीजों को भी रेखांकित कर सकता है जो साझा लाइब्रेरी सीमाओं में नहीं हो सकते हैं)।

हालांकि, चूंकि हम इस प्रकार के सीमित सेट को जानते हैं, इस हेडर को लाइब्रेरी में संकलित करने का एक तरीका है, और केवल घोषणाओं के साथ एक अलग शीर्षलेख प्रदान करता है और कुछ भी नहीं? ध्यान दें कि पुस्तकालय में न केवल सामान्य कार्यान्वयन बल्कि आंशिक विशेषज्ञता भी होनी चाहिए ..

+0

क्या आपका मतलब "परिमित" या "बाध्य" है? स्पष्ट रूप से आप किसी कंप्यूटर पर या किसी भी ब्रह्मांड में जो कुछ भी करते हैं, वह सीमित होगा, इसलिए भेद महत्वपूर्ण है। –

+0

मेरा मतलब बाध्य था: हमें इन टेम्पलेट्स के तत्काल 8 प्रकार के लिए तत्काल आवश्यकता होगी और नहीं। तो हम आसानी से एक सूची लिख सकते हैं। – lytenyn

+0

हम्म, मुझे पूरी तरह से यकीन नहीं है, और आपको निश्चित रूप से वास्तविक शीर्षलेखों को शिप करना होगा, लेकिन आप उन प्रकारों के लिए स्रोत फ़ाइल में स्पष्ट तत्कालता जोड़ सकते हैं और संकलित कर सकते हैं और उन टेम्पलेट्स को 'बाहरी' हर जगह घोषित कर सकते हैं। मैंने कभी कोशिश नहीं की है, लेकिन मुझे लगता है कि यह वांछित प्रभाव माना जाता है। –

उत्तर

6

हां। आप क्या कर सकते हैं स्पष्ट रूप से संकलक के स्पष्ट टेम्पलेट इंस्टेंटेशन सिंटैक्स का उपयोग कर सीपीपी फाइलों में टेम्पलेट्स को तुरंत चालू करें। यहां वीसी ++: http://msdn.microsoft.com/en-us/library/by56e477(v=VS.100).aspx में स्पष्ट तत्कालता का उपयोग करने का तरीका बताया गया है। जी ++ में एक समान सुविधा है: http://gcc.gnu.org/onlinedocs/gcc/Template-Instantiation.html#Template-Instantiation

ध्यान दें कि सी ++ 11 स्पष्ट इन्स्टेन्शियशन के लिए एक मानक वाक्य रचना, [14.7.2] एफ डी आई की स्पष्ट इन्स्टेन्शियशन में वर्णित शुरू की:

स्पष्ट इन्स्टेन्शियशन के लिए वाक्य रचना है:

स्पष्ट-इन्स्टेन्शियशन:

externऑप्टtemplateघोषणा

+1

धन्यवाद, यह पोस्ट भी बहुत उपयोगी था: http://anteru.net/2008/11/19/318/ – lytenyn

1

यदि यह वास्तव में केवल टेम्पलेट्स है, तो कोई साझा लाइब्रेरी नहीं है। ठोस उदाहरणों के लिए विभिन्न Boost परियोजनाएं देखें। केवल तभी जब आपके पास गैर-टेम्पलेट कोड होगा, तो आपके पास लाइब्रेरी होगी। एक ठोस उदाहरण उदाहरण है बूस्ट दिनांक_Time और दिनांक स्वरूपण और पार्सिंग; आप पुस्तकालय का उपयोग उस सुविधा के साथ या उसके बिना कर सकते हैं और इसलिए लिंकिंग के साथ या बिना।

कम निर्भरता रखने के अर्थ में साझा लाइब्रेरी नहीं है। नकारात्मकता यह है कि आपकी बाइनरी थोड़ा बड़ा हो सकती है और आपके पास कुछ हद तक संकलन-समय लागत है। लेकिन भंडारण काफी सस्ता है (जब तक आप एम्बेडेड सिस्टम में काम नहीं करते हैं, अन्य विशेष परिस्थितियां होती हैं) और संकलन आमतौर पर एक निश्चित एक-बार लागत होती है।

3

C++ Shared Library with Templates: Undefined symbols error कुछ उत्तर इस विषय को कवर करते हैं। संक्षेप में संक्षेप में: यदि आप साझा लाइब्रेरी कोड में स्पष्ट रूप से टेम्पलेट्स को तुरंत चालू करने के लिए मजबूर करते हैं तो यह संभव है। हालांकि साझा किए गए lib पक्ष पर सभी प्रयुक्त टेम्पलेट्स के लिए सभी उपयोग किए गए प्रकारों के लिए स्पष्ट विनिर्देश की आवश्यकता होगी।

0

हालांकि यह करने के लिए एक मानक तरीका नहीं है, यह कार्यान्वयन विशिष्ट तकनीक के साथ आमतौर पर संभव है। मैंने बोर्लैंड के सी ++ बिल्डर के साथ बहुत समय पहले ऐसा किया था। विचार है कि साझा किए गए लाइब्रेरी से आपके टेम्पलेट्स को निर्यात किया जाए, जहां उन्हें रहने और उन्हें आयात करने की आवश्यकता है जहां उनका उपयोग किया जाता है।जिस तरह से मैंने किया था यह इन पंक्तियों के साथ किया गया था:

// A.h 
#ifdef GENERATE 
# define DECL __declspec(dllexport) 
#else 
# define DECL __declspec(dllimport) 
#endif 

template <typename T> class DECL C { 
}; 

// A.cpp 
#define GENERATE 
#include "A.h" 

template class DECL A<int>; 

खबरदार है कि मैं मूल कोड के लिए उपयोग की जरूरत नहीं है, तो यह गलतियों हो सकती है। This blog entry एक बहुत ही समान दृष्टिकोण का वर्णन करता है।

आपके शब्द से मुझे संदेह है कि आप विंडोज़ पर नहीं हैं, इसलिए आपको यह पता लगाना होगा कि आपके कंपाइलर के साथ यह दृष्टिकोण कैसे और कैसे अपनाया जा सकता है। मुझे आशा है कि यह आपको सही दिशा में रखने के लिए पर्याप्त है।

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